乐曲硬件演奏电路的VHDL设计报告.docx
《乐曲硬件演奏电路的VHDL设计报告.docx》由会员分享,可在线阅读,更多相关《乐曲硬件演奏电路的VHDL设计报告.docx(10页珍藏版)》请在冰豆网上搜索。
乐曲硬件演奏电路的VHDL设计报告
EDA课程设计
题目:
乐曲硬件演奏电路的VHDL设计
专业:
通信工程
班级:
通信071
姓名:
葛鹏
学号:
0710920101
一、设计题目:
乐曲硬件演奏电路的VHDL设计
二、设计目标:
了解一般乐曲演奏电路设计设计方法,学习VHDL语言,熟悉EDA设计软件QuartusII和MAX+plusⅡ,加强独立完成电子设计的能力。
(1)能够播放“梁祝”乐曲。
(2)能够通过LED显示音阶。
(3)(选作)具有“播放/停止”功能,并在此基础上实现“按键演奏”的电子琴功能。
主芯片型号为FLEX10K10LC84-4
三、实验电路的工作原理:
(演奏电路逻辑图)
组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能够连续演奏所需的两个基本要素,设计演奏电路的关键就是获得这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。
演奏电路逻辑图有三部分:
音乐节拍和音调发生器、简谱码对应的分频预置数查表电路、数控分频与演奏发生器。
演奏电路逻辑图:
四、设计内容:
1.完成程序的编辑工作。
2.将音乐数据制作成LMP_ROM文件.
3.将程序加载到MAX+plusⅡ中进行编译、仿真,并保存仿真结果。
4.到实验室进行下载验证。
引脚进行锁定,然后下载到实验芯片中观察实验结果。
五、仿真结果:
1.音乐节拍和音调发生器(NoteTabs.VHD)
notetabs模块中设置了一个8位二进制计数器(计数最大值138),作为音符数据ROM的地址发生器。
这个计数器的计数频率选为4Hz,即每一个计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。
随着notetabs模块中的计数器按4Hz的时钟速率作为加法计数时,即随地址值递增时,音符数据ROM中的音符数据将从ROM中通过ToneIndex[3..0]端口输向ToneTaba模块,“梁祝”乐曲就开始连续自然的演奏起来了。
Notetabs模块仿真图:
2.简谱码对应的分频预置数查表电路(ToneTaba.VHD)
音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,tonetaba模块的功能首先是为speakera提供决定所发音符的预置数,而此数在speakera输入口停留的时间即为此音符的节拍值。
Tonetaba模块是乐曲简码对应的分频预置数查表电路。
其中设置了“梁祝”乐曲全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs的clk的输入频率决定。
这13个值的输出由对应于ToneTaba的4位输入值Index[3..0]确定,而Index[3..0]最多有16种可选值。
输向ToneTaba中Index[3..0]的值ToneIndex[3..0]的输出值与持续时间有模块notetabs决定。
Tonetaba仿真图:
4.数控分频与演奏发生器(Speakera.VHD)
音符的频率可由次模块获得,这是一个数控分频器,由其clk端输入一个具有较高频率的信号,通过speakera分频后由spkout输出,由于直接从数控分频器中出来的输出信号是脉冲较窄的脉冲信号,为了有助于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率是原来的1/2。
Speakera对clk输入信号的分频的预置数Tone[10..0]与spkout的输出频率就有了对应关系。
Sperkera模块仿真图:
5.《梁祝》music.vhd(音乐数据):
将数据保存为.mif格式然后制作成LMP_ROM文件。
六、实验结果:
(程序下载验证是否通过)
试验成功!
将设计出的演奏电路的程序经过编译(Compiler)后,选择FLEX10K系列中EPF10K10LC84-4作为目标器件(Assign/Device),并进行管脚锁定(FloorplanEditor)。
器件编程(Programmer),将编译生成的*.sof文件下载到目标芯片。
观察到数码管5显示出演奏时的音乐简谱,发光二极管D5指示音调高低,同时实验箱自带蜂鸣器(Speaker)奏出“梁祝”那凄美动人的旋律,实验成功。
七、总结:
本次乐曲硬件演奏电路的VHDL设计主要采用数控分频原理来实现,在本次EDA课程设计中,我与其他同学相互交流,相互学习,提高了用VHDL语言编程的技能及进一步加强了MAX+plusⅡ对这种EDA流行软件的应用,通过这次设计,我们温故了已学的理论知识和实践操作技能,同时也学习了更多的新的知识和技能,为以后进一步的学习和工作打下了坚实的基础。
本设计得到的电路可以作为一个乐曲演奏模块,如果要演奏出另外一首曲子,只需将该曲子出现的简谱分频预置数写入ToneTaba.VHD,再将该曲子的节拍表制作成ROM文件输入到NoteTabs.VHD中,编译后,编程下载即可。
八、附录(程序)
1.Songer顶层文件模块:
LIBRARYIEEE;--硬件演奏电路顶层设计
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSongerIS
PORT(CLK4MHZ:
INSTD_LOGIC;--音调频率信号
CLK8HZ:
INSTD_LOGIC;--节拍频率信号
pause:
INSTD_LOGIC;
CODE1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--简谱码输出显示
HIGH1:
OUTSTD_LOGIC;--高8度指示
SPKOUT:
OUTSTD_LOGIC);--声音输出
END;
ARCHITECTUREoneOFSongerIS
COMPONENTNoteTabs
PORT(clk:
INSTD_LOGIC;
SWITCH:
INSTD_LOGIC;
ToneIndex:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
COMPONENTToneTaba
PORT(Index:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC;
Tone:
OUTSTD_LOGIC_VECTOR(10DOWNTO0));
ENDCOMPONENT;
COMPONENTSpeakera
PORT(clk:
INSTD_LOGIC;
Tone:
INSTD_LOGIC_VECTOR(10DOWNTO0);
SpkS:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALTone:
STD_LOGIC_VECTOR(10DOWNTO0);
SIGNALToneIndex:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
u1:
NoteTabsPORTMAP(clk=>CLK8HZ,SWITCH=>pause,ToneIndex=>ToneIndex);
u2:
ToneTabaPORTMAP(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1);
u3:
SpeakeraPORTMAP(clk=>CLK4MHZ,Tone=>Tone,SpkS=>SPKOUT);
END;
2.音乐节拍和音调发生器(NoteTabs.VHD)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYNoteTabsIS
PORT(clk:
INSTD_LOGIC;
switch:
INSTD_LOGIC;
ToneIndex:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREoneOFNoteTabsIS
COMPONENTMUSIC--音符数据ROM
PORT(address:
INSTD_LOGIC_VECTOR(7DOWNTO0);
inclock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
SIGNALCounter:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
CNT8:
PROCESS(clk,Counter)
BEGIN
IFCounter=138THENCounter<="00000000";
ELSIF(clk'EVENTANDclk='1')THEN
IFswitch='1'THENCounter<=Counter+1;
ENDIF;
ENDIF;
ENDPROCESS;
u1:
MUSICPORTMAP(address=>Counter,q=>ToneIndex,inclock=>clk);
END;
3.简谱码对应的分频预置数查表电路(ToneTaba.VHD)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYToneTabaIS
PORT(Index:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HIGH:
OUTSTD_LOGIC;
Tone:
OUTSTD_LOGIC_VECTOR(10DOWNTO0));
END;
ARCHITECTUREoneOFToneTabaIS
BEGIN
Search:
PROCESS(Index)
BEGIN
CASEIndexIS--译码电路,查表方式,控制音调的预置数
WHEN"0000"=>Tone<="11111111111";CODE<="0111111";HIGH<='0';--2047
WHEN"0001"=>Tone<="01100000101";CODE<="0000110";HIGH<='0';--773;
WHEN"0010"=>Tone<="01110010000";CODE<="1011011";HIGH<='0';--912;
WHEN"0011"=>Tone<="10000001100";CODE<="1001111";HIGH<='0';--1036;
WHEN"0101"=>Tone<="10010101101";CODE<="1101101";HIGH<='0';--1197;
WHEN"0110"=>Tone<="10100001010";CODE<="1111101";HIGH<='0';--1290;
WHEN"0111"=>Tone<="10101011100";CODE<="0000111";HIGH<='0';--1372;
WHEN"1000"=>Tone<="10110000010";CODE<="0000110";HIGH<='1';--1410;
WHEN"1001"=>Tone<="10111001000";CODE<="1011011";HIGH<='1';--1480;
WHEN"1010"=>Tone<="11000000110";CODE<="1001111";HIGH<='1';--1542;
WHEN"1100"=>Tone<="11001010110";CODE<="1101101";HIGH<='1';--1622;
WHEN"1101"=>Tone<="11010000100";CODE<="1111101";HIGH<='1';--1668;
WHEN"1111"=>Tone<="11011000000";CODE<="0000110";HIGH<='1';--1728;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
4.数控分频与演奏发生器(Speakera.VHD)
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';--将CLK进行16分频,PreCLK为CLK的16分频
IFCount4>11THENPreCLK<='1';Count4:
="0000";
ELSIFclk'EVENTANDclk='1'THENCount4:
=Count4+1;
ENDIF;
ENDPROCESS;
GenSpkS:
PROCESS(PreCLK,Tone)--11位可预置计数器
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)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音
VARIABLECount2:
STD_LOGIC;
BEGIN
IFFullSpkS'EVENTANDFullSpkS='1'THENCount2:
=NOTCount2;
IFCount2='1'THENSpkS<='1';
ELSESpkS<='0';ENDIF;
ENDIF;
ENDPROCESS;
END;
5.《梁祝》music.vhd(音乐数据):
将数据保存为.mif格式然后制作成LMP_ROM文件。
width=4;
depth=256;
address_radix=dec;
data_radix=dec;
contentbegin
00:
3;01:
3;02:
3;03:
3;04:
5;05:
5;06:
5;07:
6;08:
8;09:
8;
10:
8;11:
9;12:
6;13:
8;14:
5;15:
5;16:
12;17:
12;18:
12;19:
15;
20:
13;21:
12;22:
10;23:
12;24:
9;25:
9;26:
9;27:
9;28:
9;29:
9;
30:
9;31:
0;32:
9;33:
9;34:
9;35:
10;36:
7;37:
7;38:
6;39:
6;
40:
5;41:
5;42:
5;43:
6;44:
8;45:
8;46:
9;47:
9;48:
3;49:
3;
50:
8;51:
8;52:
6;53:
5;54:
6;55:
8;56:
5;57:
5;58:
5;59:
5;
60:
5;61:
5;62:
5;63:
5;64:
10;65:
10;66:
10;67:
12;68:
7;69:
7;
70:
9;71:
9;72:
6;73:
8;74:
5;75:
5;76:
5;77:
5;78:
5;79:
5;
80:
3;81:
5;82:
3;83:
3;84:
5;85:
6;86:
7;87:
9;88:
6;89:
6;
90:
6;91:
6;92:
6;93:
6;94:
5;95:
6;96:
8;97:
8;98:
8;99:
9;
100:
12;101:
12;102:
12;103:
10;104:
9;105:
9;106:
10;107:
9;108:
8;109:
8;
110:
6;111:
5;112:
3;113:
3;114:
3;115:
3;116:
8;117:
8;118:
8;119:
8;
120:
6;121:
8;122:
6;123:
5;124:
3;125:
5;126:
6;127:
8;128:
5;129:
5;
130:
5;131:
5;132:
5;133:
5;134:
5;135:
5;136:
0;137:
0;138:
0;
end;