电子琴实验报告(基于乐曲《梁祝》)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武夷学院实验报告
课程名称:逻辑设计与FPGA 项目名称:乐曲硬件演奏电路设计姓名:朱文卓专业:微电子学班级: 14微电子学号: 04 实验日期
实验预习成绩(百分制)实验指导教师签字:
二、 实验过程记录部分:
1.实验过程记录:
1.1 输入信号锁相环PLL0调节: 图
2.1 锁相环 管脚clk_50m (设置为B12)接入FPGA 内部的50mhz 的时钟信号,C0口为得到数控分屏器
模块的输入时钟750KHZ ,将分频比设置为1/67,即50000000HZ/67=74.6K
约等于75K ;c1口为2KHZ (配合下级的500分频模块),设置为:c1=50000000HZ/25000=2KHZ 。
1.2 500分频模块count500(即500进制的计数器):
图2.2 分频电路程序设计 如图2.2,因为梁祝歌曲只用低音和中音来演奏,为1/4拍,即四分之一拍,每个音符持续0.25秒的时间。因为前级电路已经实现了从50MHZ 到2KHZ 的转换,要得到4HZ 的频率,则用500进制的计数器(0到499的计数)产生的进位信号对2KHZ 实现500分频(输出波形分析见后)。
1.3 乐曲长度控制计数器cnt138设计:
图2.3 乐曲长度控制计数器程序及元件图
经查阅《EDA技术实用教程(第五版)》可知,《梁祝》这首歌曲总共有139个音符,其中包含末尾的3个休止符。如图2.3,因此为了产生这139音符,因此想到开发一个139进制的计数器(计数值:0到138),实现用139状态代表139个音符。又因为要配合下一级音符谱码存储模块的输入(ROM的输入一般为偶数位),因此将原本用7路线就可以表示完成的输出端cnt8增加一位线宽。注:在本程序中,输出端cnt8由于定义成integer整型,在Quartus中被自动分配成了7根;也可以定义成vector型,而此时需要注意配合下级电路的权位最好写成cnt8: out std_logic_vector(7 downto 0).
1.4 音符谱码存储模块设计构建:
1.4.1 ROM的设置:
图2.4 音符谱码存储模块ROM
音符谱码存储模的主体构想,是为了让前级模块所产生的139个状态与实际音符(Do Re Mi Fa So La Si)构成映射。因此需要构建一个包含《梁祝》乐谱的mif文件。
1.4.2构建《梁祝》乐谱.mif文件:
图2.5《梁祝》乐谱(部分截取)
因此综上所述,结合1.3的分析,音符谱码存储ROM,即输入为8位数据线,含256bit数据(实际只用了139bit);输出为4根线,这是由于《梁祝》这首歌曲只有低音的123567,以及中音的12356合高音部分的1,加上休止符一共13个状态,因此用4根数据线完全足够。
出于简化电路设计原则以及综合考虑电路测试的难易程度,我将高音部分的1当做中音的7来处理,将13个状态音符分为低音音符,中音音符和休止符;这样的好处是:在测试时候,只需用一个LED的亮灭并结合七段数码管来具体表示播放的音符,此时若灯亮且七段数码管显示为“7”,实际代表输出为高音的“Do”。注:在以下的段落中,若出现“中音”,则用以表示“中音”的1235和“高音”的1.
1.5 分频预置查表电路f_code构建:
图2.6 f_code模块代码及原理图
由前级电路可知,从mscicsionROM模块的输出端q输出了13个音符(13个状态),而扬声器发出声音的实质是通过播放不同的声音频率实现的,而要实现将统一的频率分为不同的频率则必须引入实现分频功能的模块,由《数字电子技术基础(第五版)》的“时序电路章节”知识可知:普通的实现分频功能的计数器实现分频的原理是当计数值达到计数器最大模值N时,跳转到“预置数M”,因此可以实现“N-M+1”分频的功能;由此,我想到,如果将原本固定的“预置数”端,用一个模块代替,进而产生可以随需求变化而变化的预置数,这样就可以实现对不同音符频率的分频功能。因此,本级模块最主要功能是将已有音符映射成对应的预置数。
因为下级模块“数控分频器”的最大计数值为11位2进制数,因此本级模块的输出TOO也为11位线宽。因为下级模块数控分频器的最大计数值为2047,预置数为NT,计数模值为2047-NT+1=2048-NT, 如NT=912, 那么计数模值(分频系数)为2047-912=1135,因此将十进制的912改为十一位二进制的01110010000,赋值给TOO端(如图2.6),作为输出。
同时CODE端输出对应的音符(1到7),送至下级电路“谱码指示模块”;同时为了区别输出的音符为“低音”的(1到7)还是“中音”的(1到7),因此定义输出端口H,并接到FPGA 的一个LED,若灯不亮则表示为“低音”,若点亮则表示“高音”,再配合谱码指示模块中的“七段数码管”上显示的数值进而显示具体的音符。
1.6 数控分频器模块spker设计:
图2.7 数控分频器模块spker代码及原理图
如图2.7,该模块主要作用是将预置数通过计数器与对应音符的频率构成映射。由于数控分频器所给的的输入时钟为750KHZ。由之前的分析,数控分频器的最大计数值为11位2进制数,即2^11=2047,逢2047后预置NT, 为加法计数,输出为进位信号,进位信号总是取最大状态2047的译码。不妨取1.5的假设,当NT=912时,计数模值:2047-912=1135,数控分频器输出频率为750KHZ/1135=660HZ,再由下级电路模块对数控分频输出进行2分频,则输出频率为660HZ/2=330HZ,对应为低音的2(Re)。(其余见附录一)即,对应总公式:
fo =[750KHZ/(2048-TN)]/2
其中,f0为音符频率;TN即(TOO)为预置数。
1.7 谱码指示模块的设计:
1.7.1 七段数码管译码转换模块的设置:
图2.8 七段数码管译码转换模块代码及原理图
如图13所示T’触发器由D触发器加非门电路组成,构成一个二分频电路,由于直接从数控分频器出来的信号是脉宽极窄的信号,为了有利于驱动扬声器而添加此电路。由1.5分析可知,f_code模块代的输出端CODE为4根线,而查阅PFGA开发板手册可知七段数码管的引脚有8个(包含一个小数点)。因此,若想在数码管上显示对应的音符,必须开发一个模块,将4位二进制数(13个状态音符)用七位二进制数表示,对应7个输出端。(因为本实验中用不到小数点,所以只考虑用数码管显示数值部分的7段LED)