EDA课程设计.docx
《EDA课程设计.docx》由会员分享,可在线阅读,更多相关《EDA课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
EDA课程设计
江西理工大学应用科学学院
SOPC/EDA综合课程设计报告
设计题目:
硬件乐曲自动演奏电路设计
设计者:
学号:
16号
班级:
测控技术与仪器071班
指导老师:
王忠锋
完成时间:
2010年1月23日
设计报告
综合测试
总评
格式
(10)
内容
(40)
图表
(10)
答辩
(20)
平时
(20)
目录
第1章系统设计要求总述1
1.1.设计要求1
1.2系统组成1
1.2.1硬件乐曲自动演奏电路基本原理1
1.2.2音符频率的获得1
1.2.3乐曲节奏的控制2
1.2.4乐谱发生器2
1.2.5硬件乐曲自动演奏电路总体设计流程2
第2章总体程序设计3
2.1顶层模块设计流程图3
2.2顶层电路VHDL程序设计3
2.3硬件乐曲演奏电路顶层文件模块的仿真4
第3章单元模块程序设计5
3.1音乐节拍和音调发生器模块5
3.1.1音乐节拍和音调发生器模块VHDL的源程序5
3.1.2地址发生器模块6
3.1.3波形仿真6
3.2音乐谱对应分频预置数查表电路模块6
3.2.1音乐谱分频预置数模块7
3.2.2音乐谱对应分频预置数查表电路VHDL程序设计7
3.2.3波形仿真8
3.3音乐符数控11分频电路模块8
3.3.1音乐符数控11分频电路模块8
3.3.2音乐符数控分频模块VHDL程序8
3.3.3仿真波形9
3.4乐曲演奏音符数据文件10
3.5定制音符数据的ROM文件11
第4章硬件乐曲自动演奏电路系统调试与引脚绑定14
第5章心得体会15
第6章参考文献16
第1章系统设计要求总述
1.1设计要求
使用FPGA设计一硬件乐曲自动演奏控制器,实现至少能演示一首乐曲,乐曲自行制作。
其他功能自行设计增加。
1.2系统组成及原理分析
1.2.1硬件乐曲自动演奏电路基本原理
声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中每一音符对应着一个确定的频率,如果想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的音频,就可以在扬声器上连续地发出各个音符的音调,但要准确地演奏出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,也就是说乐曲中每个音符的发声频率及其持续时间是乐曲能够连续演奏的两个关键因素。
根据设计要求,乐曲硬件演奏电路系统主要由数控分频器和乐曲存储模块组成。
数控分频器对FPGA的基准频率进行分频,得到各个音节对应的频率输出,由一个计数器来控制此真值表的输出,将计数器的计数时钟信号来作为乐曲节拍的控制信号。
1.2.2音符频率的获得
多个不同频率的信号可通过对某个基准频率进行分频获得,由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将得到的分频系数四舍五入取整。
若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大。
若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。
实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。
本设计中选取750KHZ的基准频率。
由于现有的高频时钟脉冲信号的频率为12MHZ,故需先对其进行16分频,才能获得750KHZ的基准频率。
对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。
为提高输出信号的驱动能力,以使扬声器由足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2.。
表1—1中各音符的分频系数就是从750KHZ的基准频率二分频得到的375KHZ的频率基础上计算得到的。
由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,此时扬声器不会发声。
表1—1各个音符的频率及其对应的分频系数(基准频率375KHZ)
音符名
频率(HZ)
分频系数
计数初值
音符名
频率(HZ)
分频系数
计数初值
休止符
375000
0
2047
中音4
796.178
468
1579
低音1
294.349
1274
773
中音5
882.353
425
1622
低音2
330.396
1135
912
中音6
989.446
379
1688
低音3
370.92
1011
1036
中音7
1136.363
330
1717
低音4
386.598
970
1077
高音1
1175.549
319
1728
低音5
394.737
950
1197
高音2
1353.79
277
1770
低音6
495.376
757
1290
高音3
1512.097
248
1799
低音7
555.56
675
1372
高音4
1609.442
233
1814
中音1
588.697
637
1410
高音5
1802.884
208
1839
中音2
638.84
587
1480
高音6
2027.027
185
1862
中音3
742.574
505
1542
高音7
2272.727
162
1882
1.2.3乐曲节奏的控制
本设计中的梁祝,最小的节拍为1/4拍,若将1拍的时间定为1s,则只需要提供一个4HZ的时钟频率即可产生1/4拍的时长,演奏时间通过控制ROM查表的方式来完成。
对于其他占用时间较长的节拍则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度就自然降低。
1.2.4乐谱发生器
本文将乐谱中的音符数据存储在LPM-ROM中,如“梁祝”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址都储存。
当一个4HZ的时钟来时,相应地就从LPM-ROM中输出一个音符数据。
1.2.5硬件乐曲自动演奏电路总体设计流程
当一个4HZ的时钟脉冲来到时,乐谱发声器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数,将分频系数送给数控分频器模块,当12MHZ的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率给扬声器,扬声器就可以发出对应音符的声音来,连续的4HZ的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个得送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个得发出音符数据所对应的声音来。
曲子也就流畅的播放出来了,当乐曲一遍演奏完成后,乐曲发生器就能自动从头开始循环演奏,按下SEL键时播放第二首歌,按下RST键时从头开始播放歌曲。
第2章总体程序设计
2.1顶层模块设计流程图
图2—1顶层模块设计流程图
2.2顶层电路VHDL程序设计
Libraryieee;--硬件演奏电路顶层设计
useieee.std_logic_1164.all;
entitysongeris
port(CLK12MHZ:
instd_logic;--音调频率信号
CLK8HZ:
instd_logic;--节拍频率用于控制节拍的时钟频率
sel:
instd_logic;--音乐选择键
Rst:
instd_logic;--复位键
code1:
outstd_logic_vector(3downto0);--简谱码输出显示
high1:
outstd_logic;--高8度指示
spkout:
outstd_logic);--声音输出
end;
architectureoneofsongeris
componentNoteTabs--元件u1例换化
port(clk:
instd_logic;
sel:
instd_logic;
rst:
instd_logic;
ToneIndex:
outstd_logic_vector(3downto0));
endcomponent;
componentToneTaba--元件u2例换化
port(Index:
instd_logic_vector(3downto0);
code:
outstd_logic_vector(3downto0);
high16:
outstd_logic;
Tone:
outstd_logic_vector(10downto0));
endcomponent;
componentspeakera--元件u3例换化
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,rst=>rst,sel=>sel,ToneIndex=>ToneIndex);
u2:
ToneTabaportmap(Index=>ToneIndex,Tone=>Tone,
code=>code1,high16=>high1);
u3:
speakeraportmap(clk=>CLK12MHZ,Tone=>Tone,
Spks=>spkout);
end;
2.3硬件乐曲演奏电路顶层文件模块的仿真
将所编写的顶层文件模块songer的程序设为工程,选用Altera公司的Cyclone系列中的EPIC3T144C8为目标芯片进行仿真。
仿真结果如图2—2所示。
图2—2顶层文件电路仿真波形
第3章单元模块程序设计
根据顶层原理图,共分为music模块,地址发生器模块,分频预置数模块,十六进制模块,数控分频模块这五个模块。
Music模块存放乐曲中的音符数据,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供技术初值,十六进制模块对12MHZ的时钟脉冲进行16分频,得到750KHZ的频率,给数控分频模块提供时钟脉冲。
数控分频模块根据分频预置数输出各个音符所对应的频率。
3.1音乐节拍和音调发生器模块
图3—1NoteTabs模块
3.1.1音乐节拍和音调发生器模块VHDL的源程序
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
entityNoteTabsis
port(clk:
instd_logic;
sel:
instd_logic;
rst:
instd_logic;
ToneIndex:
outstd_logic_vector(3downto0));
end;
ArchitectureoneofNoteTabsis
Componentmusic
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,sel,rst)
begin
if((clk'eventandclk='1')and(counter=256orrst='0'))then
counter<="00000000";counter<=counter+1;
endif;
if((clk'eventandclk='1')and(sel='0'))thencounter<="10010000";
counter<=counter+1;
endif;
endprocess;
u1:
musicportmap(address=>counter,q=>ToneIndex,inclock=>clk);
end;
3.1.2地址发生器模块
地址发生器模块设置了一个8位二进制计数器(计数器最大值为256),作为音符数据ROM的地址发生器。
每来一个时钟脉冲信号(CLK),8位二进制计数器就计数一次,ROM文件中的地址也就随着递减,音符数据ROM中的音符也就一个接一个连续的取出来了。
在地址发生器的VHDL设计中,这个计数器的技术频率选为4HZ,即每一个计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。
例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。
那么相应随着程序中的计数器按4HZ的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex[3..0]端口输向分频预置数模块。
这样梁祝乐曲中的音符就一个接一个得通过toneindex[3..0]端口输向分频预置数模块。
3.1.3波形仿真
将所编写的音乐节拍和音调模块NoteTabs的程序设为工程,选用Altera公司的Cyclone系列中的EPIC3T144C8为目标芯片进行仿真。
仿真结果如图3—2所示。
从图中可以看到,当CLK第一个时钟脉冲到达时,输出相应地址上的音符3,地址值递增1,接下来的三个时钟脉冲到来时,输出也是音符3,地址连续递增3次,第4个脉冲来到时,输出为5,这些都符合模块音符数据文件中的地址/数据表。
图3—2音乐节拍和音调发生器仿真波形
3.2音乐谱对应分频预置数查表电路模块
3.2.1音乐谱分频预置数模块
图3—3ToneTaba模块
3.2.2音乐谱对应分频预置数查表电路VHDL程序设计
音乐谱分频预置数模块是乐曲简码对应分频预置数查表电路。
它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。
分频预置数模块的VHDL设计程序如下:
Libraryieee;
Useieee.std_logic_1164.all;
EntityToneTabais
Port(Index:
instd_logic_vector(3downto0);
Code:
outstd_logic_vector(3downto0);
High16:
outstd_logic;
Tone:
outstd_logic_vector(10downto0));
End;
ArchitectureoneofToneTabais
Begin
Search:
process(Index)
Begin
CaseIndexis
When"0000"=>Tone<="11111111111";code<="0000";high16<='0';
When"0001"=>Tone<="01100000101";code<="0001";high16<='0';
When"0010"=>Tone<="01110010000";code<="0010";high16<='0';
When"0011"=>Tone<="10000001100";code<="0011";high16<='0';
When"0101"=>Tone<="10010101101";code<="0101";high16<='0';
When"0110"=>Tone<="10100001010";code<="0110";high16<='0';
When"0111"=>Tone<="10101011100";code<="0111";high16<='1';
When"1000"=>Tone<="10110000010";code<="0001";high16<='1';
When"1001"=>Tone<="10111001000";code<="0010";high16<='1';
When"1010"=>Tone<="11000000110";code<="0011";high16<='1';
When"1100"=>Tone<="11001010110";code<="0101";high16<='1';
When"1111"=>Tone<="11010000000";code<="0001";high16<='1';
whenothers=>null;
endcase;
endprocess;
3.2.3波形仿真
将所编写的分频预置数查表模块ToneTaba的程序设为工程,选用Altera公司的Cyclone系列中的EPIC3T144C8为目标芯片进行仿真。
仿真结果如图3—4所示。
从图中可以看到,当Index是“0000”,Tone输出为2047,即休止符的分频预置数,当Index是“0010”时,Tone输出为912,即低音2的分频预置数,当Index为其他状态时,Tone分别输出相应音符的分频预置数。
图3—4音乐谱对应分频预置数查表电路仿真波形
3.3音乐符数控11分频电路模块
3.3.1音乐符数控11分频电路模块
图3—5Speakera模块
3.3.2音乐符数控分频模块VHDL程序
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.3仿真波形
将所编写的音乐符数控分频模块Speakera的程序设为工程,选用选用Altera公司的Cyclone系列中的EPIC3T144C8为目标芯片进行仿真。
仿真结果如图3—6所示。
图3—6音乐数控11分频电路仿真波形
3.4乐曲演奏音符数据文件
33335556
88896855
1212121513121012
99999990
999107766
55568899
33886568
55555555
101010127799
68555555
35335679
66666656
888912121210
991098865
33338888
68653568
55555555
00000000
05135173
50506716
65500321
11321112
32116232
16232000
52671210
03532157
00671112
32000513
51735567
16655032
11132111
23026712
其中WIDTH=4,表示数据输出宽度为4;DPTH=256,表示共有256个4位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;DATA-RADIX=DEC,表示输出数据是十进制数据。
形成ROM中的配置数据(初始化数据)文件的方法如下:
在QUARTU