乐曲硬件演奏电路设计.docx
《乐曲硬件演奏电路设计.docx》由会员分享,可在线阅读,更多相关《乐曲硬件演奏电路设计.docx(19页珍藏版)》请在冰豆网上搜索。
![乐曲硬件演奏电路设计.docx](https://file1.bdocx.com/fileroot1/2023-6/1/4f8de7d0-f3e7-4d3b-b057-c760bf3bd776/4f8de7d0-f3e7-4d3b-b057-c760bf3bd7761.gif)
乐曲硬件演奏电路设计
江西理工大学应用科学学院
SOPC/EDA综合课程设计报告
设计题目:
硬件音乐演奏电路
设计者:
徐达健
学号:
08040108131
班级:
测控081
指导老师:
王忠锋
完成时间:
2011年01月07日
设计报告
综合测试
总评
格式
(10)
内容
(40)
图表
(10)
答辩
(20)
平时
(20)
一:
设计原理………………………………………………3
二:
总体框图………………………………………………5
三:
选择器件………………………………………………7
四:
功能模块:
……………………………………………8
1:
NoteTabs模块(程序仿真图)………………………………8
2:
ToneTaba模块(程序仿真图)…………………………11
3:
Speakera模块(程序仿真图)……………………………12
五:
总体设计电路图………………………………………16
1.顶层设计的电路原理图(Songer模块)…………………………16
2.Songer模块的程序………………………………………16
3.Songer顶层文件的仿真图形………………………………17
4、锁定引脚…………………………………………………17
5、下载验证…………………………………………………18
六:
结束语…………………………………………………19
七:
心得体会………………………………………………20
八:
参考文献…………………………………………………21
一、设计原理
1.音乐演奏电路原理
这种频率的振荡可以用不同音符的代码所控制,从而分出不同频率的振荡,它采用编程方式将各种音符的代码预先存的计算机的内存中,利用软件和一定硬件电路配合将存放的乐曲代码有节地进行演奏,产生电子音乐。
乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。
图1.1音乐演奏电路原理图
2.音符频率的获得
多本文中选取750KHz的基准频率。
由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。
对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。
为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。
表1中各音符的分频系数就是从750KHz的基准频率二分频得到的375KHz频率基础上计算得到的。
由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即初始值=2048-1=2047,此时扬声器不会发声。
3.乐曲节奏的控制
本文中的梁祝乐曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。
4.乐谱发生器
本文将乐谱中的音符数据存储在NoteTABS中,如“梁祝”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,音符“3”就要在NoteTABS中连续的四个地址上都存储。
当一个4Hz的时钟来时,相应地存入NoteTABS中一个音符数据。
二、总体框图
图2.1总体框图
该主系统由三个模块:
tonetaba.vhd、notetabs.vhd、speakera.vhd组成。
①首先定制notetabs.vhd、模块中的音符数据。
②根据给出的乘法器逻辑原理图及其模块的VHDL描述在QuartusII完成设计。
③完成编译,综合,仿真,管教分配,编程下载。
1.对于模块NoteTabs的功能描述:
该模块的功能就是定义音符数据随着该模块中的计数器控制时钟频率速率作加法计数时,即地址值递增时,音符数据中的音符数据。
将从中通过ToneIndex[4..0]端口输向ToneTaba模块,演奏《梁祝》。
在该模块中设置了一个8位二进制计数器(计数最大值为256)。
这个计数器的计数频率为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。
2.对于模块ToneTaba,是乐曲简谱码对应的分频预置数查找表电路,其中设置了乐曲的全部音符所对应的分频置数,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs的CLK的输入频率决定,这些值由对应于ToneTaba的5位输入值Index[4..0]确定,最多有32种可选值。
输向ToneTaba中Index[4..0]的值ToneIndex[4..0]的输出值与持续的时间由模块NoteTabs决定。
3.模块Speakera是一个数控分频器,音符的频率可由此模块获得。
由CLK端输入一个具有较高频率的信号,通过Speakera分频后由SPKOUT输出。
由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。
为了利用驱动扬声器,需加一个D触发器以均衡其占空比,频率将是原来的1/2。
Speakera对CLK输入信号的分频比由预置数Tone决定。
SPKOUT的输出频率将决定每一音符的音调。
三、选择器件
模块NoteTabs,模块ToneTaba,模块Speakera,装有QuartusII软件的电脑。
四、功能模块
1.对于模块NoteTabs
图4.1模块NoteTabs
我们可以直接将音符数据输送到NoteTabs模块中,它首先是编写音符数据文件,将乐谱中相应的音符存放在一个连续的地址上。
因为1拍的时间定为1秒,提供的是4Hz的时钟频率(即1/4拍的整数倍),则需将这个音符存储在相应次数的连续几个地址上。
随着NoteTabs中的计数器按时钟频率速度作加法计数时,音符数据将从中通过ToneIndex端口输向ToneTaba模块。
NoteTabs中的音符数据模块程序为
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYNoteTabsIS
PORT(clk1:
INSTD_LOGIC;--4HZ;
ToneIndex:
OUTINTEGERRANGE0TO15);
END;
ARCHITECTUREoneOFNoteTabsIS
SIGNALCounTer:
INTEGERRANGE0TO138;
BEGIN
CNT8:
PROCESS(clk1,Counter)
BEGIN
IFCounter=138THEN
Counter<=0;
elsif(clk1'EVENTANDclk1='1')THEN
Counter<=Counter+1;
ENDIF;
ENDPROCESS;
Search:
PROCESS(Counter)
BEGIN
CASECounterIS
WHEN00=>ToneIndex<=3;WHEN01=>ToneIndex<=3;
WHEN02=>ToneIndex<=3;WHEN03=>ToneIndex<=3;
WHEN04=>ToneIndex<=5;WHEN05=>ToneIndex<=5;
WHEN06=>ToneIndex<=5;WHEN07=>ToneIndex<=6;
WHEN08=>ToneIndex<=8;WHEN09=>ToneIndex<=8;
WHEN10=>ToneIndex<=8;WHEN11=>ToneIndex<=9;
WHEN12=>ToneIndex<=6;WHEN13=>ToneIndex<=8;
WHEN14=>ToneIndex<=5;WHEN15=>ToneIndex<=5;
WHEN16=>ToneIndex<=12;WHEN17=>ToneIndex<=12;
WHEN18=>ToneIndex<=12;WHEN19=>ToneIndex<=15;
WHEN20=>ToneIndex<=13;WHEN21=>ToneIndex<=12;
WHEN22=>ToneIndex<=10;WHEN23=>ToneIndex<=12;
WHEN24=>ToneIndex<=9;WHEN25=>ToneIndex<=9;
WHEN26=>ToneIndex<=9;WHEN27=>ToneIndex<=9;
WHEN28=>ToneIndex<=9;WHEN29=>ToneIndex<=9;
WHEN30=>ToneIndex<=9;WHEN31=>ToneIndex<=0;
WHEN32=>ToneIndex<=9;WHEN33=>ToneIndex<=9;
WHEN34=>ToneIndex<=9;WHEN35=>ToneIndex<=10;
WHEN36=>ToneIndex<=7;WHEN37=>ToneIndex<=7;
WHEN38=>ToneIndex<=6;WHEN39=>ToneIndex<=6;
WHEN40=>ToneIndex<=5;WHEN41=>ToneIndex<=5;
WHEN42=>ToneIndex<=5;WHEN43=>ToneIndex<=6;
WHEN44=>ToneIndex<=8;WHEN45=>ToneIndex<=8;
WHEN46=>ToneIndex<=9;WHEN47=>ToneIndex<=9;
WHEN48=>ToneIndex<=3;WHEN49=>ToneIndex<=3;
WHEN50=>ToneIndex<=8;WHEN51=>ToneIndex<=8;
WHEN52=>ToneIndex<=6;WHEN53=>ToneIndex<=5;
WHEN54=>ToneIndex<=6;WHEN55=>ToneIndex<=8;
WHEN56=>ToneIndex<=5;WHEN57=>ToneIndex<=5;
WHEN58=>ToneIndex<=5;WHEN59=>ToneIndex<=5;
WHEN60=>ToneIndex<=5;WHEN61=>ToneIndex<=5;
WHEN62=>ToneIndex<=5;WHEN63=>ToneIndex<=5;
WHEN64=>ToneIndex<=10;WHEN65=>ToneIndex<=10;
WHEN66=>ToneIndex<=10;WHEN67=>ToneIndex<=12;
WHEN68=>ToneIndex<=7;WHEN69=>ToneIndex<=7;
WHEN70=>ToneIndex<=9;WHEN71=>ToneIndex<=9;
WHEN72=>ToneIndex<=6;WHEN73=>ToneIndex<=8;
WHEN74=>ToneIndex<=5;WHEN75=>ToneIndex<=5;
WHEN76=>ToneIndex<=5;WHEN77=>ToneIndex<=5;
WHEN78=>ToneIndex<=5;WHEN79=>ToneIndex<=5;
WHEN80=>ToneIndex<=3;WHEN81=>ToneIndex<=5;
WHEN82=>ToneIndex<=3;WHEN83=>ToneIndex<=3;
WHEN84=>ToneIndex<=5;WHEN85=>ToneIndex<=6;
WHEN86=>ToneIndex<=7;WHEN87=>ToneIndex<=9;
WHEN88=>ToneIndex<=6;WHEN89=>ToneIndex<=6;
WHEN90=>ToneIndex<=6;WHEN91=>ToneIndex<=6;
WHEN92=>ToneIndex<=6;WHEN93=>ToneIndex<=6;
WHEN94=>ToneIndex<=5;WHEN95=>ToneIndex<=6;
WHEN96=>ToneIndex<=8;WHEN97=>ToneIndex<=8;
WHEN98=>ToneIndex<=8;WHEN99=>ToneIndex<=9;
WHEN100=>ToneIndex<=12;WHEN101=>ToneIndex<=12;
WHEN102=>ToneIndex<=12;WHEN103=>ToneIndex<=10;
WHEN104=>ToneIndex<=9;WHEN105=>ToneIndex<=9;
WHEN106=>ToneIndex<=10;WHEN107=>ToneIndex<=9;
WHEN108=>ToneIndex<=8;WHEN109=>ToneIndex<=8;
WHEN110=>ToneIndex<=6;WHEN111=>ToneIndex<=5;
WHEN112=>ToneIndex<=3;WHEN113=>ToneIndex<=3;
WHEN114=>ToneIndex<=3;WHEN115=>ToneIndex<=3;
WHEN116=>ToneIndex<=8;WHEN117=>ToneIndex<=8;
WHEN118=>ToneIndex<=8;WHEN119=>ToneIndex<=8;
WHEN120=>ToneIndex<=6;WHEN121=>ToneIndex<=8;
WHEN122=>ToneIndex<=6;WHEN123=>ToneIndex<=5;
WHEN124=>ToneIndex<=3;WHEN125=>ToneIndex<=5;
WHEN126=>ToneIndex<=6;WHEN127=>ToneIndex<=8;
WHEN128=>ToneIndex<=5;WHEN129=>ToneIndex<=5;
WHEN130=>ToneIndex<=5;WHEN131=>ToneIndex<=5;
WHEN132=>ToneIndex<=5;WHEN133=>ToneIndex<=5;
WHEN134=>ToneIndex<=5;WHEN135=>ToneIndex<=5;
WHEN136=>ToneIndex<=0;WHEN137=>ToneIndex<=0;
WHEN138=>ToneIndex<=0;WHENOTHERS=>ToneIndex<=0;
ENDCASE;
ENDPROCESS;
END;
该模块的波形图为
图4.2模块NoteTabs的波形图
2.对于模块ToneTaba
图4.3模块ToneTaba
ToneTaba是乐曲简谱码对应的分频预置数查表电路。
以下为ToneTaba的程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYToneTabaIS
PORT(Index:
ININTEGERRANGE0TO15;
CODE:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC;
Tone:
outintegerrange0to16#7FF#);
END;
ARCHITECTUREoneOFToneTabaIS
BEGIN
Search:
PROCESS(Index)
BEGIN
CASEIndexIS
WHEN0=>Tone<=2047;CODE<="0000";HIGH<='0';--16383;
WHEN1=>Tone<=773;CODE<="0001";HIGH<='0';--8738;
WHEN2=>Tone<=912;CODE<="0010";HIGH<='0';--9572;
WHEN3=>Tone<=1036;CODE<="0011";HIGH<='0';--10316;
WHEN5=>Tone<=1197;CODE<="0101";HIGH<='0';--11281;
WHEN6=>Tone<=1290;CODE<="0110";HIGH<='0';--11838;
WHEN7=>Tone<=1372;CODE<="0111";HIGH<='0';--12333;
WHEN8=>Tone<=1410;CODE<="0001";HIGH<='1';--12562;
WHEN9=>Tone<=1480;CODE<="0010";HIGH<='1';--12979;
WHEN10=>Tone<=1542;CODE<="0011";HIGH<='1';--13350;
WHEN12=>Tone<=1622;CODE<="0101";HIGH<='1';--13832;
WHEN13=>Tone<=1668;CODE<="0110";HIGH<='1';--14111;
WHEN15=>Tone<=1728;CODE<="0001";HIGH<='1';--14473;
WHENOTHERS=>Tone<=0;
ENDCASE;
ENDPROCESS;
END;
该模块的波形图为
图4.4模块ToneTaba的波形图
该仿真的结果符合TONETABA模块中的分频预置数及频率。
3.对于Speakera模块
图4.5Speakera模块
音符的频率是由该模块获得
音符频率的获得:
多个不同频率的信号可通过对某个基准频率进行分频器获得。
该程序选取750KHz的基准频率。
由于现有的高频时钟脉冲信号的频率为12MHz,需对其进行16分频,才能获得750KHz的基准频率。
对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号。
为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器(D触发器)将原来的分频器的输出脉冲均衡为对称方波,这时的频率将是原来的1/2,即为375KHz。
表1各个音符的频率及其对应的分频系数(基准频率375KHz)
音符名
频率(Hz)
分频系数
计数初值
休止符
375000
0
2047
低音1
294.349
1274
773
低音2
330.396
1135
912
低音3
370.92
1011
1036
低音4
386.598
970
1077
低音5
394.737
950
1197
低音6
495.376
757
1290
低音7
555.56
675
1372
中音1
588.697
637
1410
中音2
638.84
587
1480
中音3
742.574
505
1542
中音4
796.178
468
1579
中音5
882.353
425
1622
中音6
989.446
379
1668
中音7
1136.363
330
1717
高音1
1175.549
319
1728
高音2
1353.790
277
1770
高音3
1512.097
248
1799
高音4
1609.442
233
1814
高音5
1802.884
208
1839
高音6
2027.027
185
1862
高音7
2272.727
165
1882
Speakera的模块程序为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSpeakeraIS
PORT(clk2:
INSTD_LOGIC;
Tone:
ININTEGERRANGE0TO16#7FF#;
SpkS:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFSpeakeraIS
SIGNALPreCLK:
STD_LOGIC;
SIGNALFullSpkS:
STD_LOGIC;
BEGIN
DivideCLK:
PROCESS(clk2)
VARIABLECount4:
INTEGERRANGE0TO15;
BEGIN
PreCLK<='0';
ifCount4>11then
PreCLK<='1';
Count4:
=0;
ELSIFclk2'EVENTANDclk2='1'THEN
Count4:
=Count4+1;
ENDIF;
ENDPROCESS;
GenSpkS:
PROCESS(PreCLK,Tone)
VARIABLECount11:
INTEGERRANGE0TO16#7FF#;
BEGIN
IFPreCLK'EVENTANDPreCLK='1'THEN
IFCount11=16#1FFF#THEN
Count11:
=Tone;
FullSpkS<='1';
ELSE
Count11:
=Count11+1;
FullSpkS<='0';
ENDIF;
ENDIF;
ENDPROCESS;
DelaySpkS:
PROCESS(FullSpkS)
VARIABLECount2:
STD_LOGIC;
BEGIN
IFFullSpkS'EVENTANDFullSpkS='1'THEN
Count2:
=NOTCount2;
IFCount2='1'THEN
SpkS<='1';
else
SpkS<='0';
ENDIF;
ENDIF;
ENDPROCESS;
END;
该模块的仿真图如下:
图4.6模块Speakera的仿真图
五:
总体设计