音乐发生器课程设计.docx
- 文档编号:4539261
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:20
- 大小:264.19KB
音乐发生器课程设计.docx
《音乐发生器课程设计.docx》由会员分享,可在线阅读,更多相关《音乐发生器课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
音乐发生器课程设计
音乐发生器课程设计
1.软件硬件
1EP3C40Q240C8芯片
2实验箱底板电路(包括蜂鸣器、7段数码管、Led灯1个、拨码开关3个、Key按键7个)
3QuartusⅡ9.0
4计算
2.总体模块功能
1使用两个时钟分别为12MHz和8Hz的时钟,分别供分频驱动器(数控分频器)与计数器使用。
2计数器完成计数功能,分为两个计数器counter1和counter2,counter1计数到269,counter2计数到163,都是在上升沿来临时计数。
3四个音乐模块分别记录了2首歌的乐谱。
根据上一模块计数器所计的数读取相应地址里的数据传递给下一模块。
4选择器完成选择歌曲的功能。
5数据翻译模块将选择器所选择的歌曲里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、1个led灯数据(中低音)、以及译码器所需的数据。
6分频驱动器也就是一个数控分频器,完成分频的功能,并驱动蜂鸣器。
7译码器将乐谱数据在led数码管上显示。
图3-2小糊涂神曲谱
3.各个模块图形及程序
3.1计数器及歌曲存储模块(notetabs)
计数器完成计数功能,分为两个计数器,分别计到269和163,因为两首歌曲的最大字符分别为269和163,存储的两首歌是《采蘑菇的小姑娘》、《小糊涂神》,曲谱如下:
图3-1采蘑菇的小姑娘曲谱
1模块图形
模块如图3-3所示:
2程序
由于此程序较多,在附录中给出,见附录
3仿真波形图
仿真图如图3-4所示:
通过仿真图可以清楚的看到,每计一次数输出toneindex的值随之发生一定的变化,只不过根据乐谱的不同,输出的变化也不尽相同。
例如在本次设计中,自第8个时钟上升沿来临到第15个时钟上升沿,输出toneindex2均选取音符“5”。
然后把输出toneindex2输入到音调编码器模块,进行下一步编码工作。
3.2手动模块(tone)
可通过7个按键手动的进行演奏,7个按键分别代表7个音。
1模块图形
模块如图3-5所示:
图3-5tone模块图形
4.程序
libraryieee;
useieee.std_logic_1164.all;
entitytoneis
port(key:
instd_logic_vector(6downto0);
toneindex1:
outstd_logic_vector(3downto0));
end;
architectureoneoftoneis
begin
search:
process(key)
begin
casekeyis
when"0000001"=>toneindex1<="0001";
when"0000010"=>toneindex1<="0010";
when"0000100"=>toneindex1<="0011";
when"0001000"=>toneindex1<="0100";
when"0010000"=>toneindex1<="0101";
when"0100000"=>toneindex1<="0110";
when"1000000"=>toneindex1<="0111";
whenothers=>toneindex1<="0000";
endcase;
endprocess;
end;
3仿真波形图
仿真图如图3-6所示:
在此仿真图中不同的key相当于对应不同的琴键,当按下不同的琴键时输出相对应的toneindex1,toneindex1在输入音调编码器中进行下一步编码。
3.3.3手动、自动选择模块(mux)
根据设计的要求,该简易乐曲演奏器能实现手动或自动演奏乐曲的功能。
于是,可通过一个按键cs来进行自动与手动的选择,当cs按下时,乐曲自动演奏,其他情况下均为手动演奏乐曲,即可以通过按下其他的按键(与cs相连的按键除外)来控制不同的音符。
与此同时,还需要一个复位信号rst来控制该演奏器是否工作,当rst为1时,停止演奏,为0时,可以演奏。
以上提到的手动与自动的选择只能在rst为0时有效。
1模块图形
模块图形如图3-7所示:
图3-7mux模块图形
2程序
libraryieee;
useieee.std_logic_1164.all;
entitymuxis
port(rst:
instd_logic;
index1:
instd_logic_vector(3downto0);
index2:
instd_logic_vector(3downto0);
cs:
instd_logic;
toneindex:
outstd_logic_vector(3downto0));
end;
architecturearc_muxofmuxis
begin
process(cs)
begin
ifrst='1'thentoneindex<="0000";
else
casecsis
when'0'=>toneindex<=index1;
when'1'=>toneindex<=index2;
whenothers=>toneindex<=null;
endcase;
endif;
endprocess;
endarc_mux;
3仿真波形图
仿真波形图如图3-8所示:
此仿真图中输入cs代表手动\自动演奏的选择端,输入rst代表整体复位端,输入index1、index2分别代表手动和自动要演奏的音符,输出q代表经过选择后,要演奏的或是手动输入或是自动输入的音符。
由此仿真图可清楚的看到当rst=1时,不论选择的是手动还是自动,输出都为零,达到了整体复位的功能;当rst=0且cs=1时,自动演奏乐曲,因为q与index2的值相同;当rst=0且cs=0时,手动演奏乐曲,因为这时的q与index1的值相同,从而也达到了演奏方式选择的功能。
3.3.4音调编码器(tonetaba)
1模块图形
模块图形如图3-9所示:
2程序
见附录
3仿真波形图
仿真图形如图3-10所示:
在此仿真图中从上到下依次代表输出code、high、输入index和输出tone。
通过此仿真图能清楚的看到当音符分别为4、10、8、15时,它们所对应的分频预置数tone分别是1116、1542、1410、1728;所对应的音谱code分别是4、3、1、1。
其中code、high1能分别在数码管和led上显示,而tone则输入到数控分频模块作为分频的依据。
于是,由仿真图印证了音调编码模块传送预置数及显示功能。
3.3.5数控分频器(speakera)
将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。
1模块图形:
模块图形如图3-11所示:
2程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSpeakeraIS
PORT(clk:
INSTD_LOGIC;
Tone:
INSTD_LOGIC_VECTOR(10DOWNTO0);
SpkS:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFSpeakeraIS
SIGNALPreCLK,FullSpkS:
STD_LOGIC;
BEGIN
DivideCLK:
PROCESS(clk)
VARIABLECount4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PreCLK<='0';
IFCount4>11THENPreCLK<='1';Count4:
="0000";
ELSIFclk'EVENTANDclk='1'THENCount4:
=Count4+1;
ENDIF;
ENDPROCESS;
GenSpkS:
PROCESS(PreCLK,Tone)
VARIABLECount11:
STD_LOGIC_VECTOR(10DOWNTO0);
BEGIN
IFPreCLK'EVENTANDPreCLK='1'THEN
IFCount11=16#7FF#THENCount11:
=Tone;FullSpkS<='1';
ELSECount11:
=Count11+1;FullSpkS<='0';ENDIF;
ENDIF;
ENDPROCESS;
DelaySpkS:
PROCESS(FullSpkS)
VARIABLECount2:
STD_LOGIC;
BEGIN
IFFullSpkS'EVENTANDFullSpkS='1'THENCount2:
=NOTCount2;
IFCount2='1'THENSpkS<='1';
ELSESpkS<='0';ENDIF;
ENDIF;
ENDPROCESS;
END;
3仿真波形图
仿真图如图3-12所示:
图3-12speakera仿真波形图
在此仿真图中,输入clk是一个频率较大的时钟信号,输入tone代表着某个音符的分频预置数,输出spks则代表将输入clk先经过12次分频,再经过(预置数终值2048-tone)次分频,最终在进行二分频处理后的信号,而这个信号的频率就是我们需要演奏的音谱的频率,根据频率的不同,从而能通过喇叭听到不同的声音,这就是我们一直想要演奏的乐曲了。
3.4硬件设计及仿真分析
3.4.1顶层音乐演奏器原理图
经过了各个子模块的分析与验证后,我们只需将各个子模块之间的输入输出端、子模块与整体电路之间的输入输出端进行正确的硬件连接就得到了顶层音乐演奏器的原理图,如图3-13
3.4.2顶层文件仿真波形分析
首先,介绍一下总体程序中各个引脚的作用及硬件连接情况:
输入clk8Hz是一个频率较小的时钟信号,在进行硬件下载时它与实验箱上标准时钟信号源模块的8Hz频率相连,它决定着乐曲演奏的快慢;输入clk12mHz是一个频率较大的时钟信号,因为要对它进行多次不同的分频,下载时它与实验箱上标准时钟信号源模块的20MHz频率相连;输入key[6..0]是当手动演奏时自己确定的音符,;输入rst和cs分别是整体复位端和演奏方式选择端;输出code1和high1分别用来显示音谱与高中低音,它们分别与实验箱上的数码管1和led1相连;输出spkout要与实验箱上的喇叭相连,用来发出声音。
其次,顶层电路的仿真波形图是否正确依赖于各个子模块的功能是否完善,同时顶层电路的功能实现又验证了各个子模块的正确性,二者相互依存。
最后,由仿真波形图印证了整体电路的功能
3.4.3顶层文件的管脚分配以及硬件连接图
下载到硬件时管脚的连接图如图3-14
图3-14管脚分配图
硬件的连接图如图3-15所示:
图3-15硬件连接图
对应着管脚分配图和硬件连接图可看出硬件芯片分别连接了上方的七段数码管,左方的7个白色按键key和标准时钟信号源,下方的led灯,蜂鸣器和右下方的三个拨码开关。
4设计总结
1本次简易乐曲演奏器的设计经过了整体分析、模块化分析、整体与模块的仿真分析这样三个步骤,硬件实现了整体复位、按键选择演奏方式、循环演奏以及数码管显示乐谱的功能。
2在做数控分频器模块的仿真时一定要处理好时序问题。
3本文介绍了基于FPGA的音乐硬件演奏电路的设计,实现了一个乐曲播放器,乐曲演奏器的设计经过了整体分析、模块化分析、整体与模块的仿真分析这样三个步骤,硬件实现了循环演奏以及数码管显示乐谱的功能,描述了其工作原理、设计思路及实现方法,并在QuartusII上选用目标芯片仿真实现了音乐硬件演奏电路的功能。
实践证明:
采用FPGA设计实现音乐硬件演奏电路的可行性和可靠性,而且更改乐曲容易,可根据需要修改ROM中的音符数据文件,从而使电路实现任一曲子的播放。
这种基于FPGA的音乐硬件演奏电路的设计与实现不仅通过VHDL层次化和模块化,同时采用数控分频的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性本次设计可以说达到了设计要求,但尚有需要改进的地方。
随着乐谱的复杂程度加大,如果依然在音调发生器的程序中通过时钟计数来决定音符的输出,会加大编程的繁杂度,这时一个很好的解决办法就是把将要演奏的乐谱存放在人为开辟的存储空间里,这样只需要在相应地址中读出音符即可。
5设计心得与感想
在这2周里我用EDA的知识完成了乐曲硬件演奏电路的设计,这使我对这门课程有了更深一步的了解。
随着科学技术的发展,电子信息技术与人们的生活已经分不开,可以说人们走到哪里都离不开电子产品,如我们常遇到的交通信号灯,出租车计价器,家用电器更不用说。
我很荣幸能选择到这个专业学习,我想我会在今后的工作生活中,能用所学的知识为人们创造出更多更方便的东西来满足人们的需要。
在这2周里,我通过查找资料,向老师请教等完成了乐曲硬件演奏电路的设计,以前在课堂上只是听老师说EDA是门很常用的学科,能完成各种仪器的编程等,但从来没有应用到实践中来,所以我以前对这门课感到很陌生,不知道怎么才能将这门课应用到实践。
不过在这2周里,我认真的查找资料,上机调试,使我对这门课有了更进一步的认识,它功能强大,应用到的范围也非常的广,因此我很高兴能学到这么一门有用的学科。
通过这2周的时间,我把以前学过的知识从理论应用到了实践,这大大培养了我独立思考的能力和动手能力,也锻炼了我遇到困难不要受到挫折的心理,我感到个人能力又得到了提高。
总之,这次课程设计为我以后的工作奠定了坚实的基础,充分锻炼了我的个人能力,作为电子信息工程专业的一名学生,我会在以后的工作生活中不段磨练自己,为社会创造出更多有益于人们生活的产品来。
6参考文献
[1].潘松、黄继业等编著.EDA技术与VHDL[M].北京:
清华大学出版社
[2].边计年主编.用VHDL设计电子线路[M].北京:
清华大学出版社
[3].王金明,杨吉斌等编著.数字系统设计与VerilogHDL[D].北京:
电子工业出版社
[4].徐志军,徐光辉等编著.CPLD/FPGA开发与应用[M].北京:
电子工业出版社
[5].潘松,黄继业等编著.EDA技术实用教程(第2版)[M].北京:
科学出版社
[6].叶天迟主编.EDA实用技术实验及课程设计指导书[M].长春:
自编实验指导书
附录
1notetabs程序
libraryieee;
useieee.std_logic_1164.all;
entitynotetabsis
port(rst:
instd_logic;
CLK:
instd_logic;
d:
instd_logic;
toneindex2:
outstd_logic_vector(3downto0));
endnotetabs;
architectureoneofnotetabsis
signalcounter1:
integerrange0to269;
signalcounter2:
integerrange0to163;
begin
cnt8:
process(clk)
begin
ifrst='1'thencounter1<=0;counter2<=0;
elsifcounter1=269then
counter1<=0;
elsifcounter2=163then
counter2<=0;
elsifclk'eventandclk='1'then
counter1<=counter1+1;
counter2<=counter2+1;
endif;
endprocess;
search:
process(counter1,counter2)
begin
ifd='0'then
casecounter1is
when0=>toneindex2<="0110";when1=>toneindex2<="0110";
when2=>toneindex2<="0110";when3=>toneindex2<="0110";
when4=>toneindex2<="1010";when5=>toneindex2<="1010";
when6=>toneindex2<="1010";when7=>toneindex2<="1010";
when8=>toneindex2<="1010";when9=>toneindex2<="1010";
when10=>toneindex2<="1010";when11=>toneindex2<="1010";
when12=>toneindex2<="1010";when13=>toneindex2<="1010";
when14=>toneindex2<="1010";when15=>toneindex2<="1010";
when16=>toneindex2<="1010";when17=>toneindex2<="1010";
when18=>toneindex2<="1001";when19=>toneindex2<="1001";
when20=>toneindex2<="1000";when21=>toneindex2<="1000";
when22=>toneindex2<="1000";when23=>toneindex2<="1000";
when24=>toneindex2<="1001";when25=>toneindex2<="1001";
when26=>toneindex2<="1001";when27=>toneindex2<="1001";
when28=>toneindex2<="0000";when29=>toneindex2<="0000";
when30=>toneindex2<="0000";when31=>toneindex2<="0000";
when32=>toneindex2<="1001";when33=>toneindex2<="1001";
when34=>toneindex2<="1001";when35=>toneindex2<="1001";
when36=>toneindex2<="1001";when37=>toneindex2<="1001";
when38=>toneindex2<="1010";when39=>toneindex2<="1010";
when40=>toneindex2<="1001";when41=>toneindex2<="1001";
when42=>toneindex2<="1001";when43=>toneindex2<="1001";
when44=>toneindex2<="1000";when45=>toneindex2<="1000";
when46=>toneindex2<="1000";when47=>toneindex2<="1000";
when48=>toneindex2<="1001";when49=>toneindex2<="1001";
when50=>toneindex2<="1000";when51=>toneindex2<="1000";
when52=>toneindex2<="0110";when53=>toneindex2<="0110";
when54=>toneindex2<="0101";when55=>toneindex2<="0101";
when56=>toneindex2<="0110";when57=>toneindex2<="0110";
when58=>toneindex2<="0110";when59=>toneindex2<="0110";
when60=>toneindex2<="0000";when61=>toneindex2<="0000";
when62=>toneindex2<="0000";when63=>toneindex2<="0000";
when64=>toneindex2<="0011";when65=>toneindex2<="0011";
when66=>toneindex2<="0011";when67=>toneindex2<="0011";
when68=>toneindex2<="0011";when69=>toneindex2<="0011";
when70=>toneindex2<="0101";when71=>toneindex2<="0101";
when72=>toneindex2<="0101";when73=>toneindex2<="0101";
when74=>toneindex2<="0101";when75=>toneindex2<="0101";
when76=>toneindex2<="0101";when77=>toneindex2<="0101";
when78=>toneindex2<="0101";when79=>toneindex2<="0101";
when80=>toneindex2<="0101";when81=>toneindex2<="0101";
when82=>toneindex2<="0101";when83=>toneindex2<="0101";
when84=>toneindex2<="0101";when85=>toneindex2<="0101";
when86=>toneindex2<="0110";when87=>toneindex2<="0110";
when88=>toneindex2<="1001";when89=>toneindex2<="1001";
when90=>toneindex2<="1000";when91=>toneindex2<="1000";
when92=>toneindex2<="1000";when93=>toneindex2<="1000";
when94=>toneindex2<="0000";when95=>toneindex2<="0000";
when96=>toneindex2<="0000";when97=>toneindex2<="0000";
when98=>toneindex2<="0110";wh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 音乐 发生器 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)