EDA实验报告5_乐曲硬件演奏电路设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA技术与应用实验报告
姓名学号专业年级电子信息工程
实验题
目
乐曲硬件演奏电路设计
实验目的1.学习利用数控分频器设计硬件乐曲演奏电路
2.掌握模块化和层次化的设计方法以及音符编码的设计思想
实验原理1.一定频率的矩形波通过扬声器可以发出相应频率的声音,乐曲是由一系
列的音符组成的。所以,如果我们通过控制每个音符的发音频率值及其持续的时间,就可以以纯硬件的手段,利用这些数值来实现所希望演奏的乐曲。
2.该硬件演奏电路由三个模块构成
<1>音符数据ROM的地址发生器模块NoteTabs.vhdl
内置8位二进制计数器,作为ROM的地址发生器,计数频率4Hz,即每一计数值的停留时间为0.25s,恰为全音符设为1s时,四四拍的4音符持续时间。随着NoteTabs中的计数器按4Hz的时钟速率作加法计数即地址值递增时,ROM中的音符数据将通过ToneIndex[3..0]输向ToneTaba模块,乐曲即开始演奏起来。
<2>乐曲简谱码对应的分频预置数查表电路模块ToneTaba.vhdl
ToneTaba为Speakera提供决定所发音符的分频预置数,此数在Speakera输入口停留的时间即为此音符的节拍值。输入Index[3..0]可确定乐曲全部音符所对应的分频预置数(13个)每一音符的停留时间由NoteTabs模块的clk决定(4Hz)。
<3>决定每一个音符音调的数控分频器模块Speakera.vhdl
输入端clk输入一较高频率(12MHz)的信号,经Speakera分频,再经2分频以展宽脉冲后,由SpkOut输出。11位预置数Tone[10..0]决定由clk输入信号的分频比,SpkOut输出的频率决定每一音符的音调。
实验内容1.定制存放LPM-ROM模块Music,在连续地址上存放乐曲的音符数据,
2.用vhdl文本输入法和元件例化语句完成NoteTabs.vhdl的设计,该模
块包含音符数据ROM模块Music.vhdl
3.完成ToneTaba.vhdl的设计,此模块给数控分频模块提供每个音符所对
应的分频预置数,即计数初值
4.完成Speakera.vhdl的设计,该模块是一个初值可变的加法计数器。该
计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号
5.用vhdl文本输入法和元件例化语句完成硬件演奏电路顶层文件
play_song.vhdl的设计,编译、仿真,选用杭州康芯电子有限公司生产的 GW48系列EDA实验箱和Altera公司生产的FPGA芯片Cyclone 的EP1C6Q240C8,引脚锁定,下载到FPGA上进行硬件测试
实验步骤1.定制ROM模块,生成Music.vhdl地址文件,以存储乐曲演奏数据
2.输入NoteTabs.vhdl,编译、仿真,给出时序波形
3.输入ToneTaba.vhdl,编译、仿真,给出时序波形
4.输入Speakera.vhdl,编译、仿真,给出时序波形
5.建立硬件演奏电路顶层文件play_song.vhdl,将以上4个vhdl文件拷
贝进顶层文件所在目录,用元件例化语句和层次化设计方法,完成乐曲硬件演奏电路的设计,编译、仿真,给出时序波形,引脚锁定并下载进FPGA进行硬件测试
实验结果及分析vhdl文本输入法时序仿真波形
1.由音符数据地址发生模块的仿真波形NoteTabs.sim可知,随NoteTabs
中的计数器按输入时钟clk作加法计数,即随ROM地址值的递增,ROM 中的音符数据将从ToneIndex[3..0]中输出。
2.由分频预置数查表电路模块的仿真波形ToneTaba.sim可知,由
Index[3..0]译码输出分频预置数,并通过Tone[10..0]输出给
Speakera模块。与演奏发音相对应的简谱码由CODE通过数码管输出显示,HIGH1显示高八度音。
3.由数控分频器模块的仿真波形Speakera.sim可知,由Tone[10..0]输
入的分频预置数将clk输入的一较高频率(12MHz)的时钟信号进行分频,得到不同频率的输出FullSpkS,由于FullSpkS直接由数控分频器输出,是脉冲极窄的脉冲式信号,经内部增加一个D触发器后,可以得到展宽脉冲后的SpkS。
4.由乐曲硬件演奏顶层文件的仿真波形play_song.sim可知,SpkOut是
经SpkS的最终的输出,决定所发出的每一音符的音调。音符不同,SpkOut 的脉宽也不同,通过扬声器发出的声音也不同,因而可以演奏音乐,得到预期的效果。
5.乐曲演奏时,简谱码可以在数码管上同步显示出来,同时HIGH1对应的
LED灯随高低音的不同,亮灭情况也不同,实验结果符合预期。
实验过程中所遇到的问题及相应的解决方法1.刚开始实验用的是KHF-4型的实验箱,需要将晶振频率为22.1184Hz
的时钟信号进行分频,以得到NoteTabs模块和Speakera模块所需的4Hz和12MHz的输入时钟,并将简谱码通过译码输出到数码管上显示。
然而在实验箱测试后却得不到预期的结果,HIGH1所对应的LED灯恒亮,蜂鸣器发出持续的高音。检查Speakera的时序仿真波形,输出SpkOut 是持续的低电平,而不是脉宽不一的方波。
2.多次尝试没有结果后,决定换杭州康芯电子有限公司生产的 GW48系列
EDA实验箱,该实验箱有8个译码输出显示的数码管,和可选的多个时钟输入端,这样可以省去译码和分频电路。引脚锁定,硬件下载测试后,蜂鸣器可以正常放出预置的乐曲。
3.之后对Speakera模块的仿真文件反复揣摩,多次改变输入的频率,并
设定不同的分频预置数,终于可以看到SpkOut输出脉宽不一的方波信号,对于顶层文件用相同的方法,亦可以得到预期的输出。
4.个人认为,之前在KHF-4型实验箱测试的时候,应该是分频模块的问题。
经22.1184MHz分频输出的频率不满足该硬件演奏电路所需要的时钟输入。NoteTabs模块的输入时钟clk_8Hz(实为4Hz)决定了每一音符在Speakera输入端停留的时间,而Speakera的输入时钟clk_12MHz决定了每一音符的音调。如果时钟偏差过大,将会导致时许错乱,如音符在Speakera输入端停留的时间过长或过短,数控分频输出的脉冲过宽或者过窄,这都直接影响音乐的正常播放。
5.在梁祝乐曲演奏成功后,换了一首歌you_and_me,但问题也接踵而至。
<1>首先在定制LPM_ROM模块时,得到的.bsf元件输入端口跟定制梁祝乐曲ROM时的端口不一致了,在NoteTabs模块中用了元件例化语句,因此编译不成功。重新命名端口后,再次编译,问题解决。
<2>其次,在mif文件you_and_me.mif中,depth = 280,而梁祝的为256,即每一字节的宽度为8bit,结果编译报错。于是我把you_and_me 的mif文件的地址音符数据去掉后面一部分,使得depth = 256。虽然一首歌不再完整,但在定制LPM_ROM的时候不必增加额外的地址开销,同时省去了大幅度修改vhdl代码的工作。
附录
(原理
图或
VHDL
代码)
1.顶层文件play_song.vhdl