乐曲硬件电路演奏设计.docx
- 文档编号:25183196
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:12
- 大小:35.88KB
乐曲硬件电路演奏设计.docx
《乐曲硬件电路演奏设计.docx》由会员分享,可在线阅读,更多相关《乐曲硬件电路演奏设计.docx(12页珍藏版)》请在冰豆网上搜索。
乐曲硬件电路演奏设计
乐曲硬件电路演奏设计
一、设计要求
①了解元件例化语句的调用;
②掌握自顶向下的数字系统设计方法;
③了解乐器硬件演奏电路的工作原理;
④能够播放“梁祝”乐曲。
二、设计过程
2.1设计原理
2.1.1乐曲的发声原理
组成乐曲的2个基本要素是:
每个音符的发音频率值及其持续的时间(节奏)。
一般人能听到声音的频率范围约在几十到几千赫兹,可以利用程序控制FPGA某个引脚输出一定频率的矩形波,接上扬声器后就能发出相应频率的声音,演奏某个音符的音调。
同时,若能控制每个音符的持续时间,也就控制了乐曲的节奏,因此只要控制输出到扬声器的信号频率的高低以及每个信号持续的时间长短,即可实现乐曲的演奏。
2.1.2音符与频率的关系
乐曲的12平均率规定;每2个八度(如简谱中的中音1与高音1)之间的频率相差1倍。
在2个八度音之间,又可分为12个半音,每2个半音的频率比为12/2。
另外,音符A的频率为440HZ,音符B到C之间,E到F之间为半音,其余为全音。
由此可以计算出简谱中低音l至高音1之间每个音符的频率。
设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。
2.1.3音符的获得方法
所有不同频率的信号都可以从同一个系统基准频率分频而来,可以采用GENERIC类属语句,预置不同频率音符信号根据系统基准频率值计算分频系数(分频系数=系统基准频率/音符频率)由于个音符对应的频率为非整数,而分频系数必须为整数型,故要四舍五入取整,得到不同频率的音符。
2.1.4乐曲节奏的控制
每个音符持续的时间是乐曲连续播放的另一个基本要素,如果采用1MHz的频率作为系统基准频率,则需要对1MHz的信号进行250000分频得到4Hz信号作为一个四分音符的频率。
对于其他占用时间较长的节拍(必须是四分之一拍的整数倍)则只需要将该音符连续输出相应遍数即可。
2.2设计方案
2.2.1简谱码对应的分频预置数查表电路
音符的持续时间根据乐曲的速度及每个音符的节拍来确定,模块ToneTaba的功能首先是为Spearkera提供决定所发音符的分频预置数,而此数在Spearkera输入口停留的时间即为音符的节拍值,然后模块ToneTaba是乐曲简谱码对应的分频预置数查表电路,其中设置了“梁祝”乐曲全部音符所对应的分频预置数共13个。
每个音符的停留时间由音乐节拍和音调发生器模块NoteTabs的clk的输入频率决定,在此为4Hz,这13个值的输出由对应的ToneTaba的4位输入值Index[3..0]确定,而Index[3..0]最多有16种可选值,输向ToneTaba中Index[3..0]的值ToneIndex[3..0]的输出值与持续的时间由模块NoteTabs决定。
对应的程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYToneTabaIS
PORT(Index:
ININTEGERRANGE0TO15;
Tone:
OUTINTEGERRANGE0TO16#7FF#);
END;
ARCHITECTUREoneOFToneTabaIS
BEGIN
Search:
PROCESS(Index)
BEGIN
CASEIndexIS
WHEN0=>Tone<=2047;--16383;
WHEN1=>Tone<=773;--8738;
WHEN2=>Tone<=912;--9572;
WHEN3=>Tone<=1036;--10316;
WHEN5=>Tone<=1197;--11281;
WHEN6=>Tone<=1290;--11838;
WHEN7=>Tone<=1372;--12333;
WHEN8=>Tone<=1410;--12562;
WHEN9=>Tone<=1480;--12979;
WHEN10=>Tone<=1542;--13350;
WHEN12=>Tone<=1622;--13832;
WHEN13=>Tone<=1668;--14111;
WHEN15=>Tone<=1728;--14473;
WHENOTHERS=>Tone<=0;
ENDCASE;
ENDPROCESS;
END;
2.2.2音乐节拍和音调发生器
在NoteTabs中设置一个八位二进制计数器(计数最大值位138),计数器的计数频率宣威4Hz,即为每一个计数值的停留时间为0.25秒,恰为当全音符设为一秒时,四四拍的四分音符持续时间。
例如在NoteTabs里VHDL逻辑描述中“梁祝”乐曲的第一个音符位“3”,此音停留4个时钟节拍即为一秒时间,相应的所对应的“3”音符分频预置值为1036,在Speakera的输入端停留一秒,随着NoteTabs中的而计数器按4Hz的时钟速率做加法计数即音符数据通过ToneIndex[3..0]端口输向Tonetaba,“梁祝”乐曲就开始连续自然演奏起来了。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYNoteTabsIS
PORT(clk:
INSTD_LOGIC;
ToneIndex:
OUTINTEGERRANGE0TO15);
END;
ARCHITECTUREoneOFNoteTabsIS
SIGNALCounter:
INTEGERRANGE0TO138;
BEGIN
CNT8:
PROCESS(CLK,Counter)
BEGIN
IFCounter=138then
Counter<=0;
ELSIF(clk'EVENTANDclk='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;
2.2.3数控分频与演奏发生器
其时钟(Clk)端输入的是12MHz的信号,从数控分频器中出来的输出信是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。
数控分频模块中对Clk输入信号的分频比由11位预置数tone[10..0]决定。
Fout的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone[10..0]与Fout的输出频率就有了对应关系。
例如在分频预置数模块中若取tone[10..0]=1036,将发出音符为“3”音的信号频率。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSpeakeraIS
PORT(clk:
INSTD_LOGIC;
Tone:
ININTEGERRANGE0TO16#7FF#;
SpkS:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFSpeakeraIS
SIGNALPreCLK,FullSpkS:
STD_LOGIC;
BEGIN
DivideCLK:
PROCESS(clk)
VARIABLECount4:
INTEGERRANGE0TO15;
BEGIN
PreCLK<='0';--将CLK进行16分频,PreCLK为CLK的16分频IFCount4>11THENPreCLK<='1';Count4:
="0000";
IFCount4>11then
PreCLK<='1';
Count4:
=0;
ELSIFclk'EVENTANDclk='1'THENCount4:
=Count4+1;ENDIF;
ENDPROCESS;
GenSpkS:
PROCESS(PreCLK,Tone)--11位可预置计数器
VARIABLECount11:
INTEGERRANGE0TO16#7FF#;
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;
2.2.4硬件演奏电路顶层设计
程序如下:
LIBRARYIEEE;--硬件演奏电路顶层设计
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSongerIS
PORT(CLK1:
INSTD_LOGIC;--音调频率信号
CLK2:
INSTD_LOGIC;--节拍频率信号
SPKOUT:
OUTSTD_LOGIC);--声音输出
END;
ARCHITECTUREoneOFSongerIS
COMPONENTNoteTabs
PORT(clk:
INSTD_LOGIC;
ToneIndex:
OUTINTEGERRANGE0TO15);
ENDCOMPONENT;
COMPONENTToneTaba
PORT(Index:
ININTEGERRANGE0TO15;
Tone:
OUTINTEGERRANGE0TO16#7FF#);
ENDCOMPONENT;
COMPONENTSpeakera
PORT(clk:
INSTD_LOGIC;
Tone:
ININTEGERRANGE0TO16#7FF#;
SpkS:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALTone:
INTEGERRANGE0TO16#7FF#;
SIGNALToneIndex:
INTEGERRANGE0TO15;
BEGIN
u1:
NoteTabsPORTMAP(clk=>CLK2,ToneIndex=>ToneIndex);
u2:
ToneTabaPORTMAP(Index=>ToneIndex,Tone=>Tone);
u3:
SpeakeraPORTMAP(clk=>CLK1,Tone=>Tone,SpkS=>SPKOUT);
END;
三、设计结果
3.1仿真结果及分析
3.1.1NoteTabs仿真
NoteTabs的仿真波形如下图:
结果分析:
我们从仿真图可以看出第一个clk上升沿时ToneTndex输出为3,并且连续四个clk上升沿输出都为3,第五个clk上升沿输出为5,且连续三个上升沿输出都为5,第八个clk上升沿输出为6,第九、十和十一个clk上升沿输出为8,第十二个clk上升沿输出为9,由此可见,我们的波形输出结果与我们的实验程序的输出结果相对应,因此NoteTabs部分是正确的。
3.1.2Speakera仿真
Speakera的仿真波形如下:
结果分析:
由图可知我们spks输出为0,并且我们有程序也可得出spks输出为0。
因此,此部分也算正确。
3.1.3ToneTaba仿真
ToneTaba的仿真波形如下:
结果分析:
我们可以从图中看出Index输入为3时,Tone输出为1036。
当输入为9时输出为1480。
输入为A时输出为1542。
输入为C时输出为1622。
输入为6时输出为1290。
输入为0时输出为2047。
这些数据都与我们所写的实验程序上的输入所对应的输出数据相同,所以这一部分的实验是成功的。
3.1.4Songer仿真
Songer的仿真波形如下:
结果分析:
在顶层文件中我们调用了ToneTaba、Sperkera以及NoteTabs部分,再根据元件内部的关联去编写程序,从而完成乐曲自动演奏电路的实验程序。
其中的CLK1是NoteTabs部分中的clk,CLK2是Sperkera部分中的clk。
最后的输出SPKOUT是Sperkera部分中的SpkS。
3.2硬件测试及说明
3.2.1引脚锁定
3.2.2硬件测试结果分析
程序下载后,试验箱的扬声器自动播放乐曲“梁祝”。
与预期结果一致,硬件实现结果正确。
四、总结
在乐曲硬件演奏电路的EDA设计中,我们应用了许多现代化的信息工具查找资料,以及去图书馆翻阅资料,解决一系列的关于乐曲硬件演奏电路的设计与实现,利用EDA技术实现硬件自动发出音乐的功能,设置自动输入控制器,自动播放"梁祝"。
在设计过程中我们通过对简谱码对应的分频预置数查表电路、音乐节拍和音调发生器、数控分频和演奏发生器的设计,然后利用顶层文件例化语句实现,在实验中我们关于乐曲间音符频率,节奏掌握有一个系统的了解,明白了其实验原理和结构,对EDA技术描述了解更加熟练,当然在这次实验我们也遇到了很多问题,比如乐曲没有不能自动演奏、仿真出现问题、例化语句出现错误,通过四个人查找资料找出错误,直至实验完成。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 乐曲 硬件 电路 演奏 设计