《eda課程設(shè)計(jì)VHDL 音樂(lè)播放器》由會(huì)員分享,可在線閱讀,更多相關(guān)《eda課程設(shè)計(jì)VHDL 音樂(lè)播放器(19頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、子信息科學(xué)與技術(shù)專業(yè)課程設(shè)計(jì)任務(wù)書學(xué)生姓名專業(yè)班級(jí)學(xué)號(hào)題 目樂(lè)曲自動(dòng)播放器課題性質(zhì)工程設(shè)計(jì)課題來(lái)源自擬課題指導(dǎo)教師同組姓名主要內(nèi)容自行選擇一首自己喜愛(ài)的經(jīng)典樂(lè)曲,用FPGA設(shè)計(jì)實(shí)現(xiàn)一個(gè)該曲目的自動(dòng)演奏電路。任務(wù)要求(1)根據(jù)設(shè)計(jì)題目要求編寫相應(yīng)程序代碼(2)對(duì)編寫的VHDL程序代碼進(jìn)行編譯和仿真(3)利用實(shí)驗(yàn)箱完成硬件驗(yàn)證(4)總結(jié)設(shè)計(jì)內(nèi)容,完成課程設(shè)計(jì)說(shuō)明書參考文獻(xiàn)1曹昕燕. .北京: 清華大學(xué)出版社,2004年2焦素敏. . 北京: 清華大學(xué)出版社,2005年3焦素敏. . 河南工業(yè)大學(xué),2008年4黃智偉. . 電子工業(yè)出版社,2005年5劉昌華. . 國(guó)防工業(yè)出版社,2005年審查意見(jiàn)
2、指導(dǎo)教師簽字:教研室主任簽字: 2011年月日一、 設(shè)計(jì)任務(wù)及要求:(1)根據(jù)設(shè)計(jì)題目要求編寫相應(yīng)程序代碼。(2)對(duì)編寫的VHDL程序代碼進(jìn)行編譯和仿真。(3)利用實(shí)驗(yàn)箱完成硬件驗(yàn)證。(4)總結(jié)設(shè)計(jì)內(nèi)容,完成課程設(shè)計(jì)說(shuō)明書。用VHDL語(yǔ)言設(shè)計(jì)樂(lè)音的節(jié)拍與音符產(chǎn)生電路;用VHDL語(yǔ)言設(shè)計(jì)可控分頻器電路;最后能夠采用FPGA芯片進(jìn)行音樂(lè)播放。二、 設(shè)計(jì)原理及總體框圖:音調(diào)發(fā)生音調(diào)編碼數(shù)控分頻總體框圖產(chǎn)生音樂(lè)的兩個(gè)因素是音樂(lè)頻率和音樂(lè)的持續(xù)時(shí)間,以純硬件完成演奏電路比利用微處理器(CPU)來(lái)實(shí)現(xiàn)樂(lè)曲演奏要復(fù)雜的多,如果不借助于功能強(qiáng)大的EDA工具和硬件描述語(yǔ)言,憑借傳統(tǒng)的數(shù)字邏輯技術(shù),即使最簡(jiǎn)單的演
3、奏電路也難以實(shí)現(xiàn)。根據(jù)設(shè)計(jì)要求,樂(lè)曲硬件演奏電路系統(tǒng)主要由數(shù)控分頻器和樂(lè)曲存儲(chǔ)模塊組成。數(shù)控分頻器對(duì)FPGA的基準(zhǔn)頻率進(jìn)行分頻,得到與各個(gè)音階對(duì)應(yīng)的頻率輸出。樂(lè)曲存儲(chǔ)模塊產(chǎn)生節(jié)拍控制和音階選擇信號(hào),即在此模塊中可存放一個(gè)樂(lè)曲曲譜真值表,由一個(gè)計(jì)數(shù)器來(lái)控制此真值表的輸出,而由計(jì)數(shù)器的計(jì)數(shù)時(shí)鐘信號(hào)作為樂(lè)曲節(jié)拍控制信號(hào)。1、音名與頻率的關(guān)系音樂(lè)的十二平均率規(guī)定:每?jī)蓚€(gè)八度音(如簡(jiǎn)譜中的中音與高音)之間的頻率相差一倍在兩個(gè)八度音之間,又可分為十二個(gè)半音,每?jī)蓚€(gè)半音的頻率比為4。另外,音名(簡(jiǎn)譜中的低音)的頻率為440Hz,音名B到C之間,E到F之間為半音,其余為全音,由此可以計(jì)算出簡(jiǎn)譜中從低音1到高音
4、1之間每個(gè)音名的頻率如表1所示.表1 簡(jiǎn)譜中的音名與頻率的關(guān)系音名頻率/Hz音名頻率/Hz音名頻率/Hz低音1中音1高音1低音2中音2高音2低音3中音3高音3低音4中音4高音4低音5中音5高音5低音6440中音6880高音61760低音7中音7高音7由于音階頻率多為非整數(shù),而分頻系數(shù)又不能為小數(shù),故必須將得到的分頻數(shù)四舍五入取整。若基準(zhǔn)頻率過(guò)低,則由于分頻系數(shù)過(guò)小,四舍五入取整后的誤差較大,若基準(zhǔn)頻率過(guò)高,雖然誤碼差變小,但分頻結(jié)構(gòu)將變大。實(shí)際的設(shè)計(jì)應(yīng)綜合考慮兩方面的因素,在盡量減小頻率誤差的前提下取舍合適的基準(zhǔn)頻率。本例中選取4MHz的基準(zhǔn)頻率,若無(wú)4MHz的時(shí)鐘頻率,實(shí)際上,只要各個(gè)音名間
5、的相對(duì)品頻率關(guān)系不變,C作1與D作1演奏出的音樂(lè)聽(tīng)起來(lái)都不會(huì)“走調(diào)”。各音階頻率及相應(yīng)的分頻系數(shù)如表2所示。為了減少輸出的偶次諧波分量,最后輸出到揚(yáng)聲器的波形應(yīng)為對(duì)稱方波,因此在到達(dá)揚(yáng)聲器之前,有一個(gè)二分頻的分頻器。表2中的分頻系數(shù)就是從4MHZ頻率二分頻得到的2MHZ頻率基礎(chǔ)上計(jì)算得出的。表2 各音階頻率對(duì)應(yīng)的分頻值音名分頻系數(shù)初始值音名分頻系數(shù)初始值音名分頻系數(shù)初始值低音17644547中音138224369高音119116280低音268101381中音234054786高音212706921低音360672124中音330345157高音315176674低音457272464中音42
6、8645327高音414326759低音551023089中音525515640高音512566935低音645453646中音622735918高音611377054低音740504141中音720256166高音710137178由于最大的分頻系數(shù)為7644,故采用13位二進(jìn)制計(jì)數(shù)器已能滿足分頻要求。在表2,除給出了分頻比以外,給出了對(duì)應(yīng)于各個(gè)音階頻率時(shí)計(jì)數(shù)器不同的初始值,對(duì)于樂(lè)曲中的休止符,要將分頻系數(shù)設(shè)為0,即初始值為8191即可,此時(shí)揚(yáng)聲器將不會(huì)發(fā)聲。對(duì)于不同的分頻系數(shù),加載不同的初始值即可。用加載初始值而不是將分頻輸出譯碼反饋,可以有效地減少本設(shè)計(jì)占用可編程邏輯器件的資源,也是同步
7、計(jì)數(shù)器的一個(gè)常用設(shè)計(jì)技巧。當(dāng)一個(gè)4Hz的時(shí)鐘脈沖來(lái)到時(shí),樂(lè)譜發(fā)生器模塊輸出一個(gè)音符數(shù)據(jù)給分頻系數(shù)模塊,分頻系數(shù)模塊輸出此音符相應(yīng)的分頻系數(shù),將分頻系數(shù)送給數(shù)控分頻器模塊,當(dāng)12MHz的時(shí)鐘脈沖來(lái)到時(shí),數(shù)控分頻器就根據(jù)分頻系數(shù)輸出相應(yīng)的頻率(即此音符所對(duì)應(yīng)的發(fā)生頻率)給揚(yáng)聲器,揚(yáng)聲器就可發(fā)出對(duì)應(yīng)音符的聲音來(lái).連續(xù)的4Hz的時(shí)鐘脈沖就將樂(lè)譜發(fā)生器里所存儲(chǔ)的音符數(shù)據(jù)一個(gè)接一個(gè)的送給了分頻系數(shù)模塊,再經(jīng)過(guò)數(shù)控分頻模塊,最后揚(yáng)聲器一個(gè)接一個(gè)的發(fā)出音符數(shù)據(jù)所對(duì)應(yīng)的聲音來(lái)。曲子也就流暢的播放出來(lái)了.樂(lè)曲演奏頂層原理圖三、 程序設(shè)計(jì):1、NOTETABS模塊LIBRARY IEEE;.ALL;ENTITY n
8、otetabs IS PORT(clk :IN STD_LOGIC; toneindex: OUT INTEGER RANGE 0 TO 15);END;ARCHITECTURE one OF notetabs IS SIGNAL counter:INTEGER RANGE 0 TO 139; BEGIN CNT8:PROCESS(clk) BEGIN IF counter=127 THEN counter=0; ELSIF(clkEVENT AND clk=1) THEN counter toneindex toneindex toneindex toneindex toneindex to
9、neindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex to
10、neindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex to
11、neindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex to
12、neindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex to
13、neindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindex toneindexNULL; END CASE; END PROCESS;END;2、TONETABA模塊LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY Tonetaba IS PORT(index : IN INTEGER RANGE 0 TO 15; code : OUT
14、 INTEGER RANGE 0 TO 15; high : OUT STD_LOGIC ; tone : OUT INTEGER RANGE 0 TO 16#7FF# );END;ARCHITECTURE one OF Tonetaba ISBEGIN SEARCH: PROCESS(index) BEGIN CASE index IS WHEN 0 = tone=2047;code=0;high tone=773;code=1;high tone=912;code=2;high tone=1036;code=3;high tone=1197;code=5;high tone=1290;co
15、de=6;high tone=1372;code=7;high tone=1410;code=1;high tone=1480;code=2;high tone=1542;code=3;high tone=1622;code=5;high tone=1668;code=6;high tone=1728;code=1;high NULL; END CASE; END PROCESS;END;3、SPEAKERA模塊LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY speakera IS PORT(clk :IN STD_LOGIC; tone:IN
16、INTEGER RANGE 0 TO 16#7FF#; spks: OUT STD_LOGIC);END;ARCHITECTURE one OF speakera IS SIGNAL preclk:STD_LOGIC; SIGNAL fullspks:STD_LOGIC;BEGIN divideclk:PROCESS(clk) VARIABLE count4:INTEGER RANGE 0 TO 15; BEGINpreclk11 THEN preclk=1;count4:=0; ELSIF clkEVENT AND clk=1 THEN count4:=count4+1; END IF; E
17、ND PROCESS; genspks:PROCESS(preclk,tone) VARIABLE count11: INTEGER RANGE 0 TO 16#7FF#; BEGIN IF preclkEVENT AND preclk=1 THEN IF count11=16#7FF# THEN count11:= tone; fullspks=1; ELSE count11:=count11+1; fullspks=0; END IF; END IF; END PROCESS; delaysks:PROCESS(fullspks) VARIABLE count2:STD_LOGIC; BE
18、GIN IF fullspks EVENT AND fullspks=1 THEN count2:= NOT count2; IF count2=1 THEN spks=1; ELSE spksCLK8HZ,TONEINDEX=TONEINDEX);U2:TONETABA PORT MAP(INDEX=TONEINDEX,TONE=TONE,CODE=CODE1,HIGH=HIGH1);U3:SPEAKERA PORT MAP(CLK=CLK12MHZ,TONE=TONE,SPKS=SPKOUT);END;四、編譯及仿真:NOTETABS模塊的仿真TONETABA模塊的仿真SPEAKERA模塊
19、的仿真頂層文件仿真圖五、硬件調(diào)試及結(jié)果分析頂層文件編譯仿真好之后,通過(guò)電腦連接到硬件上,下載頂層文件到FPGA里,下載完畢之后,輸入clk12MHz與clock9相接,接收12MHz時(shí)鐘頻率,輸入clk8Hz與clock2相接,接收4Hz的時(shí)鐘頻率。發(fā)音輸出SPKOUT接speaker,HIGH是高八度音指示,code1輸出是演奏發(fā)音相對(duì)應(yīng)的簡(jiǎn)譜碼。然后 就能聽(tīng)到對(duì)應(yīng)的樂(lè)曲。六、參考文獻(xiàn):1曹昕燕. .北京: 清華大學(xué)出版社,2004年2焦素敏. . 北京: 清華大學(xué)出版社,2009年3焦素敏. . 河南工業(yè)大學(xué),2008年4黃智偉. . 電子工業(yè)出版社,2005年5劉昌華. . 國(guó)防工業(yè)出版社,2005年七、心得體會(huì): 通過(guò)這次課程設(shè)計(jì),我的EDA得到了很大的提高。剛開始沒(méi)有思路,也是參考網(wǎng)絡(luò)和書籍,還有同學(xué)的幫助,才能完成。當(dāng)然中間也有很多的問(wèn)題。例如以前對(duì)LPM_ROM不是很熟悉,通過(guò)音樂(lè)播放器對(duì)它有了進(jìn)一步的了解。也大大的鍛煉了我們的動(dòng)手能力。團(tuán)結(jié)的力量是巨大的。