当前位置:文档之家› 电子琴实验报告(基于乐曲《梁祝》)

电子琴实验报告(基于乐曲《梁祝》)

武夷学院实验报告
课程名称:逻辑设计与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)
1.7.2 七段数码管的设置:
图2.9 谱码指示模块总原理图
如图2.9,因为译码电路属于组合电路,属于异步,不受CLK控制,所以本级模块不设CLK 端。

结合(附录二)由于FPGA的七段数码管是共阳极接法,所以输出为0则点亮,例如音符“0001”,对应输出“1111001”。

1.8 二分频模块的设计:
图2.10 二分频模块原理图
由1.6可知,承接数控分频器模块的输出频率,为输出真正的音符频率,还需要一个二分频模块实现,直接调用D触发器,外接非门构成T’触发器,实现二分频功能。

此外由于从数控分频器输出的某些音符的频率的占空比很小,如果不加本模块,会出现音符出现的声音非常短暂的情况,因此,本模块还起到提高占空比50%,进而提升功率的作用。

2.实验现象及原始数据记录:
2.1 设计电路总图:
图2.11 总原理图
2.2 开发板管脚设置图:
图2.12 全体管脚映射图
实验操作成绩(百分制)__________ 实验指导教师签字:__________ 附录一
附录二
三、实验结果与讨论:
1.数据处理及实验结果分析:
1.1 实物图:
图3.1实物图
1.2 500分频模块波形仿真图:
图3.2 500分频模块波形
由图3.2可见,计数器计数值从0到499,到达计数最大模值499时进位输出pm端由低电平转入高电平,即500进制实现500分频。

1.3 cnt138模块波形仿真图:
图3.3 138模块波形
由图3.3,计数器从0计数到138,一共139个不同输出状态,从cnt8端输出。

2.实验改进、心得体会及思考题:
2.1 实验心得体会:
这次实验自己非常重视,花了很多时间,收获了很多。

自己对模块化设计电路有了更深,更直观的感受。

此外对用计数器来实现分频功能有了深刻的理解;在开发过程中也遇到了一系列的问题,例如在对“数控分频器”的VHDL代码编写中,开始不懂得signal和variable的区别,用前者时,信号在进程结束后才被改变,因此与所需音符状态无法及时对应;而后,我又发现如果在同一个进程中反复对variable所定义的变量进行赋值的话,软件只会把最后一次赋值的值赋给“变量”。

诸如此类的不再一一赘述,希望日后继续努力。

2.2 实验思考题:
1.教材图9-4中由D触发器INST1和非门INST2构成的2分频电路对扬声器发声有什么影响?
答:该电路模块实现对前级输出频率的二分频,让输出音符的频率全部处于人耳朵的听觉范围内。

同时还起到提高占空比至50%,进而提升功率的作用。

2.在电路上应该满足哪些条件,才能用数字器件直接输出的方波驱动扬声器发声?
答:(1):输出频率要在扬声器工作范围内;
(2):输出的电流要能驱动扬声器的正常工作。

实验报告成绩(百分制)实验指导教师签字:日期:。

相关主题