eda課程設計VHDL 音樂播放器
《eda課程設計VHDL 音樂播放器》由會員分享,可在線閱讀,更多相關《eda課程設計VHDL 音樂播放器(19頁珍藏版)》請在裝配圖網上搜索。
1、子信息科學與技術專業(yè)課程設計任務書
學生姓名
專業(yè)班級
學號
題 目
樂曲自動播放器
課題性質
工程設計
課題來源
自擬課題
指導教師
同組姓名
主要內容
自行選擇一首自己喜愛的經典樂曲,用FPGA設計實現一個該曲目的自動演奏電路。
任務要求
(1)根據設計題目要求編寫相應程序代碼
(2)對編寫的VHDL程序代碼進行編譯和仿真
(3)利用實驗箱完成硬件驗證
(4)總結設計內容,完成課程設計說明書
參考文獻
[1]曹昕燕. <
2、EDA 應用技術 >>. 北京: 清華大學出版社,2005年
[3]焦素敏. <
3、計內容,完成課程設計說明書。 用VHDL語言設計樂音的節(jié)拍與音符產生電路;用VHDL語言設計可控分頻器電路;最后能夠采用FPGA芯片進行音樂播放。 二、 設計原理及總體框圖: 音調發(fā)生 音調編碼 數控分頻 總體框圖 產生音樂的兩個因素是音樂頻率和音樂的持續(xù)時間,以純硬件完成演奏電路比利用微處理器(CPU)來實現樂曲演奏要復雜的多,如果不借助于功能強大的EDA工具和硬件描述語言,憑借傳統的數字邏輯技術,即使最簡單的演奏電路也難以實現。根據設計要求,樂曲硬件演奏電路系統主要由數控分頻器和樂曲存儲模塊組成。數控分頻器對FPGA的基準頻率進行分頻,得到與各個音階對應的頻率
4、輸出。樂曲存儲模塊產生節(jié)拍控制和音階選擇信號,即在此模塊中可存放一個樂曲曲譜真值表,由一個計數器來控制此真值表的輸出,而由計數器的計數時鐘信號作為樂曲節(jié)拍控制信號。 1、音名與頻率的關系 音樂的十二平均率規(guī)定:每兩個八度音(如簡譜中的中音1與高音1)之間的頻率相差一倍.在兩個八度音之間,又可分為十二個半音,每兩個半音的頻率比為4。另外,音名A(簡譜中的低音6)的頻率為440Hz,音名B到C之間,E到F之間為半音,其余為全音,由此可以計算出簡譜中從低音1到高音1之間每個音名的頻率如表1所示. 表1 簡譜中的音名與頻率的關系 音名 頻率/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 由于音階頻率多為非整數,而分頻系數又不能為小數,故必須將得到的分頻數四舍五入取整。若基準頻率過低,則由于分頻系數過小,四舍五入取整后的誤差較大,若基準頻率過高,雖然誤碼差變小,但分頻結構將變大。實際的設計應綜合考慮兩方面的因素,在盡量減小頻率誤差的前提下取舍合適的基準頻率。本例中選取
6、4MHz的基準頻率,若無4MHz的時鐘頻率,實際上,只要各個音名間的相對品頻率關系不變,C作1與D作1演奏出的音樂聽起來都不會“走調”。 各音階頻率及相應的分頻系數如表2所示。為了減少輸出的偶次諧波分量,最后輸出到揚聲器的波形應為對稱方波,因此在到達揚聲器之前,有一個二分頻的分頻器。表2中的分頻系數就是從4MHZ頻率二分頻得到的2MHZ頻率基礎上計算得出的。 表2 各音階頻率對應的分頻值 音名 分頻系數 初始值 音名 分頻系數 初始值 音名 分頻系數 初始值 低音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、由于最大的分頻系數為7644,故采用13位二進制計數器已能滿足分頻要求。在表2,除給出了分頻比以外,給出了對應于各個音階頻率時計數器不同的初始值,對于樂曲中的休止符,要將分頻系數設為0,即初始值為8191即可,此時揚聲器將不會發(fā)聲。對于不同的分頻系數,加載不同的初始值即可。用加載初始值而不是將分頻輸出譯碼反饋,可以有效地減少本設計占用可編程邏輯器件的資源,也是同步計數器的一個常用設計技巧。 當一個4Hz的時鐘脈沖來到時,樂譜發(fā)生器模塊輸出一個音符數據給分頻系數模塊,分頻系數模塊輸出此音符相應的分頻系數,將分頻系數送給數控分頻器模塊,當12MHz的時鐘脈沖來到時,數控分頻器就根據分頻系數輸出相
9、應的頻率(即此音符所對應的發(fā)生頻率)給揚聲器,揚聲器就可發(fā)出對應音符的聲音來.連續(xù)的4Hz的時鐘脈沖就將樂譜發(fā)生器里所存儲的音符數據一個接一個的送給了分頻系數模塊,再經過數控分頻模塊,最后揚聲器一個接一個的發(fā)出音符數據所對應的聲音來。曲子也就流暢的播放出來了. 樂曲演奏頂層原理圖 三、 程序設計: 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模塊的仿真 頂層文件仿真圖 五、硬件調試及結果分析 頂層文件編譯仿真好之后,通過電腦連接到硬件上,下載頂層文件到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: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 110中國人民警察節(jié)(筑牢忠誠警魂感受別樣警彩)
- 2025正字當頭廉字入心爭當公安隊伍鐵軍
- XX國企干部警示教育片觀后感筑牢信仰之基堅守廉潔底線
- 2025做擔當時代大任的中國青年PPT青年思想教育微黨課
- 2025新年工作部署會圍繞六個干字提要求
- XX地區(qū)中小學期末考試經驗總結(認真復習輕松應考)
- 支部書記上黨課筑牢清廉信念為高質量發(fā)展營造風清氣正的環(huán)境
- 冬季消防安全知識培訓冬季用電防火安全
- 2025加強政治引領(政治引領是現代政黨的重要功能)
- 主播直播培訓直播技巧與方法
- 2025六廉六進持續(xù)涵養(yǎng)良好政治生態(tài)
- 員工職業(yè)生涯規(guī)劃方案制定個人職業(yè)生涯規(guī)劃
- 2024年XX地區(qū)黨建引領鄉(xiāng)村振興工作總結
- XX中小學期末考試經驗總結(認真復習輕松應考)
- 幼兒園期末家長會長長的路慢慢地走