eda課程設(shè)計VHDL 音樂播放器
《eda課程設(shè)計VHDL 音樂播放器》由會員分享,可在線閱讀,更多相關(guān)《eda課程設(shè)計VHDL 音樂播放器(19頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、子信息科學與技術(shù)專業(yè)課程設(shè)計任務書
學生姓名
專業(yè)班級
學號
題 目
樂曲自動播放器
課題性質(zhì)
工程設(shè)計
課題來源
自擬課題
指導教師
同組姓名
主要內(nèi)容
自行選擇一首自己喜愛的經(jīng)典樂曲,用FPGA設(shè)計實現(xiàn)一個該曲目的自動演奏電路。
任務要求
(1)根據(jù)設(shè)計題目要求編寫相應程序代碼
(2)對編寫的VHDL程序代碼進行編譯和仿真
(3)利用實驗箱完成硬件驗證
(4)總結(jié)設(shè)計內(nèi)容,完成課程設(shè)計說明書
參考文獻
[1]曹昕燕. <
2、EDA 應用技術(shù) >>. 北京: 清華大學出版社,2005年
[3]焦素敏. <
3、計內(nèi)容,完成課程設(shè)計說明書。 用VHDL語言設(shè)計樂音的節(jié)拍與音符產(chǎn)生電路;用VHDL語言設(shè)計可控分頻器電路;最后能夠采用FPGA芯片進行音樂播放。 二、 設(shè)計原理及總體框圖: 音調(diào)發(fā)生 音調(diào)編碼 數(shù)控分頻 總體框圖 產(chǎn)生音樂的兩個因素是音樂頻率和音樂的持續(xù)時間,以純硬件完成演奏電路比利用微處理器(CPU)來實現(xiàn)樂曲演奏要復雜的多,如果不借助于功能強大的EDA工具和硬件描述語言,憑借傳統(tǒng)的數(shù)字邏輯技術(shù),即使最簡單的演奏電路也難以實現(xiàn)。根據(jù)設(shè)計要求,樂曲硬件演奏電路系統(tǒng)主要由數(shù)控分頻器和樂曲存儲模塊組成。數(shù)控分頻器對FPGA的基準頻率進行分頻,得到與各個音階對應的頻率
4、輸出。樂曲存儲模塊產(chǎn)生節(jié)拍控制和音階選擇信號,即在此模塊中可存放一個樂曲曲譜真值表,由一個計數(shù)器來控制此真值表的輸出,而由計數(shù)器的計數(shù)時鐘信號作為樂曲節(jié)拍控制信號。 1、音名與頻率的關(guān)系 音樂的十二平均率規(guī)定:每兩個八度音(如簡譜中的中音1與高音1)之間的頻率相差一倍.在兩個八度音之間,又可分為十二個半音,每兩個半音的頻率比為4。另外,音名A(簡譜中的低音6)的頻率為440Hz,音名B到C之間,E到F之間為半音,其余為全音,由此可以計算出簡譜中從低音1到高音1之間每個音名的頻率如表1所示. 表1 簡譜中的音名與頻率的關(guān)系 音名 頻率/Hz 音名 頻率/Hz 音名 頻率/Hz
5、 低音1 中音1 高音1 低音2 中音2 高音2 低音3 中音3 高音3 低音4 中音4 高音4 低音5 中音5 高音5 低音6 440 中音6 880 高音6 1760 低音7 中音7 高音7 由于音階頻率多為非整數(shù),而分頻系數(shù)又不能為小數(shù),故必須將得到的分頻數(shù)四舍五入取整。若基準頻率過低,則由于分頻系數(shù)過小,四舍五入取整后的誤差較大,若基準頻率過高,雖然誤碼差變小,但分頻結(jié)構(gòu)將變大。實際的設(shè)計應綜合考慮兩方面的因素,在盡量減小頻率誤差的前提下取舍合適的基準頻率。本例中選取
6、4MHz的基準頻率,若無4MHz的時鐘頻率,實際上,只要各個音名間的相對品頻率關(guān)系不變,C作1與D作1演奏出的音樂聽起來都不會“走調(diào)”。 各音階頻率及相應的分頻系數(shù)如表2所示。為了減少輸出的偶次諧波分量,最后輸出到揚聲器的波形應為對稱方波,因此在到達揚聲器之前,有一個二分頻的分頻器。表2中的分頻系數(shù)就是從4MHZ頻率二分頻得到的2MHZ頻率基礎(chǔ)上計算得出的。 表2 各音階頻率對應的分頻值 音名 分頻系數(shù) 初始值 音名 分頻系數(shù) 初始值 音名 分頻系數(shù) 初始值 低音1 7644 547 中音1 3822 4369 高音1 1911 6280 低音2 6
7、810 1381 中音2 3405 4786 高音2 1270 6921 低音3 6067 2124 中音3 3034 5157 高音3 1517 6674 低音4 5727 2464 中音4 2864 5327 高音4 1432 6759 低音5 5102 3089 中音5 2551 5640 高音5 1256 6935 低音6 4545 3646 中音6 2273 5918 高音6 1137 7054 低音7 4050 4141 中音7 2025 6166 高音7 1013 7178
8、由于最大的分頻系數(shù)為7644,故采用13位二進制計數(shù)器已能滿足分頻要求。在表2,除給出了分頻比以外,給出了對應于各個音階頻率時計數(shù)器不同的初始值,對于樂曲中的休止符,要將分頻系數(shù)設(shè)為0,即初始值為8191即可,此時揚聲器將不會發(fā)聲。對于不同的分頻系數(shù),加載不同的初始值即可。用加載初始值而不是將分頻輸出譯碼反饋,可以有效地減少本設(shè)計占用可編程邏輯器件的資源,也是同步計數(shù)器的一個常用設(shè)計技巧。 當一個4Hz的時鐘脈沖來到時,樂譜發(fā)生器模塊輸出一個音符數(shù)據(jù)給分頻系數(shù)模塊,分頻系數(shù)模塊輸出此音符相應的分頻系數(shù),將分頻系數(shù)送給數(shù)控分頻器模塊,當12MHz的時鐘脈沖來到時,數(shù)控分頻器就根據(jù)分頻系數(shù)輸出相
9、應的頻率(即此音符所對應的發(fā)生頻率)給揚聲器,揚聲器就可發(fā)出對應音符的聲音來.連續(xù)的4Hz的時鐘脈沖就將樂譜發(fā)生器里所存儲的音符數(shù)據(jù)一個接一個的送給了分頻系數(shù)模塊,再經(jīng)過數(shù)控分頻模塊,最后揚聲器一個接一個的發(fā)出音符數(shù)據(jù)所對應的聲音來。曲子也就流暢的播放出來了. 樂曲演奏頂層原理圖 三、 程序設(shè)計: 1、NOTETABS模塊 LIBRARY IEEE; .ALL; ENTITY notetabs IS PORT(clk :IN STD_LOGIC; toneindex: OUT INTEGER RANGE 0 TO 15); END; ARCHITECT
10、URE one OF notetabs IS SIGNAL counter:INTEGER RANGE 0 TO 139; BEGIN CNT8:PROCESS(clk) BEGIN IF counter=127 THEN counter<=0; ELSIF(clk'EVENT AND clk='1') THEN counter<=counter+1; END IF; END PROCESS; SEARCH:PROCESS(counter) BEGIN CASE counter IS
11、WHEN 00 => toneindex<=10; WHEN 01 => toneindex<=10; WHEN 02 => toneindex<=12; WHEN 03 => toneindex<=12; WHEN 04 => toneindex<=15; WHEN 05 => toneindex<=15; WHEN 06 => toneindex<=15; WHEN 07 => toneindex<=15; WHEN 08 => toneindex<=15; WHEN 09 => toneindex<=15; WHEN 10 =>
12、toneindex<=15; WHEN 11 => toneindex<=15; WHEN 12 => toneindex<=15; WHEN 13 => toneindex<=15; WHEN 14 => toneindex<=15; WHEN 15 => toneindex<=15; WHEN 16 => toneindex<=13; WHEN 17 => toneindex<=13; WHEN 18 => toneindex<=12; WHEN 19 => toneindex<=12; WHEN 20 => to
13、neindex<=13; WHEN 21 => toneindex<=13; WHEN 22 => toneindex<=15; WHEN 23 => toneindex<=15; WHEN 24 => toneindex<=10; WHEN 25 => toneindex<=10; WHEN 26 => toneindex<=9; WHEN 27 => toneindex<=9; WHEN 28 => toneindex<=8; WHEN 29 => toneindex<=8; WHEN 30 => toneinde
14、x<=8; WHEN 31 => toneindex<=8; WHEN 32 => toneindex<=8; WHEN 33 => toneindex<=8; WHEN 34 => toneindex<=8; WHEN 35 => toneindex<=8; WHEN 36 => toneindex<=8; WHEN 37 => toneindex<=8; WHEN 38 => toneindex<=15; WHEN 39 => toneindex<=15; WHEN 40 => toneindex<=15; WHEN
15、 41 => toneindex<=15; WHEN 42 => toneindex<=13; WHEN 43 => toneindex<=13; WHEN 44 => toneindex<=12; WHEN 45 => toneindex<=12; WHEN 46 => toneindex<=10; WHEN 47 => toneindex<=10; WHEN 48 => toneindex<=9; WHEN 49 => toneindex<=9; WHEN 50 => toneindex<=8; WHEN 51 => t
16、oneindex<=9; WHEN 52 => toneindex<=9; WHEN 53 => toneindex<=9; WHEN 54 => toneindex<=9; WHEN 55 => toneindex<=9; WHEN 56 => toneindex<=9; WHEN 57 => toneindex<=9; WHEN 58 => toneindex<=9; WHEN 59 => toneindex<=9; WHEN 60 => toneindex<=10; WHEN 61 => toneindex<=10;
17、 WHEN 62 => toneindex<=12; WHEN 63 => toneindex<=12; WHEN 64 => toneindex<=15; WHEN 65 => toneindex<=15; WHEN 66 => toneindex<=15; WHEN 67 => toneindex<=15; WHEN 68 => toneindex<=15; WHEN 69 => toneindex<=15; WHEN 70 => toneindex<=15; WHEN 71 => toneindex<=15; WHE
18、N 72 => toneindex<=15; WHEN 73 => toneindex<=15; WHEN 74 => toneindex<=15; WHEN 75 => toneindex<=15; WHEN 76 => toneindex<=13; WHEN 77 => toneindex<=13; WHEN 78 => toneindex<=12; WHEN 79 => toneindex<=12; WHEN 80 => toneindex<=13; WHEN 81 => toneindex<=13; WHEN 82 => t
19、oneindex<=15; WHEN 83 => toneindex<=15; WHEN 84 => toneindex<=10; WHEN 85 => toneindex<=10; WHEN 86 => toneindex<=9; WHEN 87 => toneindex<=9; WHEN 88 => toneindex<=8; WHEN 89 => toneindex<=8; WHEN 90 => toneindex<=8; WHEN 91 => toneindex<=8; WHEN 92 => toneindex<=8;
20、 WHEN 93 => toneindex<=8; WHEN 94 => toneindex<=8; WHEN 95 => toneindex<=8; WHEN 96 => toneindex<=8; WHEN 97 => toneindex<=8; WHEN 98 => toneindex<=15; WHEN 99 => toneindex<=15; WHEN 100 => toneindex<=15; WHEN 101 => toneindex<=15; WHEN 102 => toneindex<=13; WHE
21、N 103 => toneindex<=13; WHEN 104 => toneindex<=12; WHEN 105 => toneindex<=12; WHEN 106 => toneindex<=10; WHEN 107 => toneindex<=10; WHEN 108 => toneindex<=9; WHEN 109 => toneindex<=9; WHEN 110 => toneindex<=8; WHEN 111 => toneindex<=8; WHEN 112 => toneindex<=8;
22、 WHEN 113 => toneindex<=8; WHEN 114 => toneindex<=8; WHEN 115 => toneindex<=8; WHEN 116 => toneindex<=8; WHEN 117 => toneindex<=8; WHEN 118 => toneindex<=8; WHEN 119 => toneindex<=8; WHEN 120 => toneindex<=10; WHEN 121 => toneindex<=10; WHEN 122 => toneindex<=12;
23、 WHEN 123 => toneindex<=12; WHEN 124 => toneindex<=15; WHEN 125 => toneindex<=15; WHEN 126 => toneindex<=15; WHEN 127 => toneindex<=15; WHEN 128 => toneindex<=15; WHEN 129 => toneindex<=15; WHEN 130 => toneindex<=15; WHEN 131 => toneindex<=15; WHEN 132 => toneindex<=14; WHEN 133 =>
24、toneindex<=14; WHEN 134 => toneindex<=14; WHEN 135 => toneindex<=14; WHEN 136 => toneindex<=13; WHEN 137 => toneindex<=13; WHEN 138 => toneindex<=12; WHEN 139 => toneindex<=12; WHEN OTHERS=>NULL; END CASE; END PROCESS; END; 2、TONETABA模塊 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164
25、.ALL; ENTITY Tonetaba IS PORT(index : IN INTEGER RANGE 0 TO 15; code : OUT INTEGER RANGE 0 TO 15; high : OUT STD_LOGIC ; tone : OUT INTEGER RANGE 0 TO 16#7FF# ); END; ARCHITECTURE one OF Tonetaba IS BEGIN SEARCH: PROCESS(index) BEGIN CASE index
26、 IS WHEN 0 => tone<=2047;code<=0;high<='0'; WHEN 1 => tone<=773;code<=1;high<='0'; WHEN 2 => tone<=912;code<=2;high<='0'; WHEN 3 => tone<=1036;code<=3;high<='0'; WHEN 5 => tone<=1197;code<=5;high<='0'; WHEN 6 => tone<=1290;code<=6;high<='0'; WHEN 7 => tone<=
27、1372;code<=7;high<='0'; WHEN 8 => tone<=1410;code<=1;high<='1'; WHEN 9 => tone<=1480;code<=2;high<='1'; WHEN 10=> tone<=1542;code<=3;high<='1'; WHEN 12 => tone<=1622;code<=5;high<='1'; WHEN 13 => tone<=1668;code<=6;high<='1'; WHEN 15 => tone<=1728;code<=1;high<='1
28、'; WHEN OTHERS => 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 INTEGER RANGE 0 TO 16#7FF#; spks: OUT STD_LOGIC); END; ARCHITECTURE one OF speakera IS SIGNAL pre
29、clk:STD_LOGIC; SIGNAL fullspks:STD_LOGIC; BEGIN divideclk:PROCESS(clk) VARIABLE count4:INTEGER RANGE 0 TO 15; BEGIN preclk<='0'; IF count4>11 THEN preclk<='1';count4:=0; ELSIF clk'EVENT AND clk='1' THEN count4:=count4+1; END IF; END PROCESS; genspks:PROCESS(preclk,ton
30、e) VARIABLE count11: INTEGER RANGE 0 TO 16#7FF#; BEGIN IF preclk'EVENT 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
31、; delaysks:PROCESS(fullspks) VARIABLE count2:STD_LOGIC; BEGIN IF fullspks 'EVENT AND fullspks='1' THEN count2:= NOT count2; IF count2='1' THEN spks<='1'; ELSE spks<='0'; END IF; END IF; END PROCESS; END; 4、SONGER LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.AL
32、L; ENTITY SONGER IS PORT(CLK12MHZ : IN STD_LOGIC; CLK8HZ: IN STD_LOGIC; CODE1 : OUT INTEGER RANGE 0 TO 15 ; HIGH1: OUT STD_LOGIC; SPKOUT: OUT STD_LOGIC ); END; ARCHITECTURE ONE OF SONGER IS COMPONENT NOTETABS PORT(CLK:IN STD_LOGIC;
33、 TONEINDEX: OUT INTEGER RANGE 0 TO 15); END COMPONENT; COMPONENT TONETABA PORT(INDEX: IN INTEGER RANGE 0 TO 15 ; CODE: OUT INTEGER RANGE 0 TO 15 ; HIGH: OUT STD_LOGIC; TONE: OUT INTEGER RANGE 0 TO 16#7FF#); END COMPONENT;
34、 COMPONENT SPEAKERA PORT(CLK:IN STD_LOGIC; TONE:IN INTEGER RANGE 0 TO 16#7FF#; SPKS:OUT STD_LOGIC); END COMPONENT; SIGNAL TONE: INTEGER RANGE 0 TO 16#7FF#; SIGNAL TONEINDEX: INTEGER RANGE 0 TO 15; BEGIN U1:NOTETABS PORT MAP(CLK=>CLK8HZ,TONEINDEX=>TONEINDEX); U2
35、: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模塊的仿真 頂層文件仿真圖 五、硬件調(diào)試及結(jié)果分析 頂層文件編譯仿真好之后,通過電腦連接到硬件上,下載頂層文件到FPGA里,下載完畢之后,輸入clk12MHz與clock9相接,接收12MHz時鐘頻
36、率,輸入clk8Hz與clock2相接,接收4Hz的時鐘頻率。發(fā)音輸出SPKOUT接speaker,HIGH是高八度音指示,code1輸出是演奏發(fā)音相對應的簡譜碼。然后 就能聽到對應的樂曲。
六、參考文獻:
[1]曹昕燕. <
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應急救援安全知識競賽試題
- 1 礦井泵工考試練習題含答案
- 2煤礦爆破工考試復習題含答案
- 1 各種煤礦安全考試試題含答案