基于fpga音樂硬件演奏電路設(shè)計_第1頁
基于fpga音樂硬件演奏電路設(shè)計_第2頁
基于fpga音樂硬件演奏電路設(shè)計_第3頁
基于fpga音樂硬件演奏電路設(shè)計_第4頁
基于fpga音樂硬件演奏電路設(shè)計_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、目錄摘要 i1系統(tǒng)設(shè)計總述11.1設(shè)計要求11.2系統(tǒng)組成12總體程序設(shè)計52.1頂層模塊設(shè)計流程圖52.2頂層電路vhdl程序設(shè)計53單元模塊程序設(shè)計73.1音樂節(jié)拍和音調(diào)發(fā)生器模塊73.2音樂譜對成分頻預(yù)置數(shù)杏表電路模塊83.3音樂譜對應(yīng)分頻預(yù)置數(shù)&表電路模塊103.4樂曲演奏音符數(shù)據(jù)文件(媽媽的吻)123.5定制音符數(shù)據(jù)的rom文件134 vhdl音樂硬件演奏電路系統(tǒng)仿真與調(diào)試154.1 notetabs音樂節(jié)拍和音調(diào)發(fā)生器模塊的仿真154.2 tonetaba分頻預(yù)h數(shù)查表校塊的仿真154.3 speakera音樂符數(shù)校分頻模塊的仿真16 4.4擴大此音樂硬件演奏電路的通用性1

2、75心得體會20參考文獻 21摘要根據(jù)網(wǎng)家教委與專業(yè)教學(xué)委員會對教育機構(gòu)的要求,為培養(yǎng)適應(yīng)我國21世紀(jì)國民經(jīng)濟發(fā) 展需要的電子設(shè)置人才;同吋基于國家教委面向21世紀(jì)電工電子課程體系改革和電工電 子工科教學(xué)基地建設(shè)阿項教學(xué)改革研究成果。要求高等??茖W(xué)校學(xué)生能夠自己動手完成簡 單數(shù)字器件的設(shè)計。這不但反應(yīng)了我國當(dāng)前在電了電路的實驗教學(xué)體系、內(nèi)容和方法上的 改革思路和教學(xué)水平的提高,更重要的是在加強以傳統(tǒng)電子設(shè)計方法為基礎(chǔ)的工程設(shè)計訓(xùn) 練的同時,使學(xué)生能夠盡快掌握現(xiàn)代電子設(shè)計自動化技術(shù)的新方法、新工具和新手段系統(tǒng) 的、科學(xué)的培養(yǎng)了學(xué)生的實際動手能力、理論聯(lián)系實際的能力、工程設(shè)計能力,創(chuàng)新能力, 提高

3、r學(xué)生對基礎(chǔ)實驗的興趣。本次設(shè)計在eda開發(fā)平臺quartus ii 6.0上利用vhdl語言設(shè)計數(shù)控分頻器電路, 利用數(shù)控分頻的原理設(shè)計咅樂硬件演奏電路,并定制lpm-rom存儲音樂數(shù)據(jù),以“梁?!?和“月亮代表我的心”兩首樂曲為例,將音樂數(shù)據(jù)存儲到lpm-rom,就達到y(tǒng)以純硬件的 手段來實現(xiàn)樂曲的演奏效果。只要修改lpm-rom所存儲的音樂數(shù)據(jù),將其換成其他樂曲 的咅樂數(shù)據(jù),再重新定制lpm-rom,連接到程序中就可以實現(xiàn)其它樂曲的演奏。木設(shè)計采用的是武漢理工大學(xué)的開放設(shè)計實驗箱,fpga 口標(biāo)芯片型號為altera公司的 cyclone系列中的ep1c3t144c8n。芯片配置成功后即

4、可進行硬件測試:選擇實驗電路結(jié) 構(gòu)圖,發(fā)咅輸出接speaker,當(dāng)樂曲一遍演奏完成后,樂曲發(fā)生器能0動從頭開始循環(huán) '演奏。關(guān)鍵詞:fpga/cpld,音樂硬件演奏電路,vhdl語言設(shè)計,quartus ii 6.01系統(tǒng)設(shè)計總述1.1設(shè)計要求這足一種運用純硬件實現(xiàn)樂曲播放的電路,比運用微處理器實現(xiàn)樂曲播放更加復(fù)雜。它運 用了強大功能的eda工具開放設(shè)計試驗箱和硬件描述語言vhdl。本課題以歌曲媽媽的吻來實現(xiàn)樂曲播放電路的功能。(1) 順序播放樂曲功能:當(dāng)電路丌始工作時,如果存儲器屮冇多首樂曲,那么演奏電路將從尖到尾順序播放這些樂曲。(2) 循環(huán)播放樂曲功能:當(dāng)演奏完后一首樂曲吋,將自

5、動返冋到第一首歌曲開始播放,反復(fù)不止,直到關(guān)閉電源電路停止工作為止。(3) 樂曲簡譜顯示功能:當(dāng)演奏電路播放樂曲時,能夠?qū)?dāng)前播放的咅符通過一列發(fā)光二極管以二進制的形式予以顯示。(4) 樂曲高音顯示功能:如果電路正在播放高音音符,那么將有一個發(fā)光二極管點亮來顯小。(5) 音暈大小可調(diào)功能:運用eda實驗箱上的數(shù)字功率放大器lm386n,對數(shù)控分頻器輸出的音頻信號予以處理,輸出大小連續(xù)可調(diào)的音頻信號到揚聲器。1.2系統(tǒng)組成(1)音樂硬件演奏電路基木原理硬件電路的發(fā)聲原理,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制fpga 芯片某個引腳輸出一定頻率的矩形波,接上揚聲器就能發(fā)出相應(yīng)頻率的聲

6、音。樂曲中的每 一咅符對應(yīng)著一個確定的頻率,要想fpga發(fā)出不同音符的音調(diào),實際上以要控制它輸出 相應(yīng)音符的頻率即可。樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些 音符所對應(yīng)的頻,就可以在揚聲器上連續(xù)地發(fā)出各個音符的音調(diào)。而要準(zhǔn)確地演奏出一首 樂叻,僅僅u:揚聲器能夠發(fā)生是不夠的,還必須準(zhǔn)確地控制樂曲的節(jié)奏,即樂曲中每個音符的發(fā)生頻率及k持續(xù)時間是樂曲能夠連續(xù)演奏的兩個關(guān)鍵因素。(2)咅符頻率的獲得多個不同頻率的信號可通過對某個基準(zhǔn)頻率進行分頻器獲得。由于各個音符的頻率多為非 整數(shù),而分頻系數(shù)乂不能為小數(shù),故必須將計算機得到的分頻系數(shù)四舍五入取整。若基準(zhǔn) 頻率過低,則分頻系數(shù)過小

7、,四舍五入取整后的誤差較大。若基準(zhǔn)頻率過高,hi然可以減 少頻率的相對誤差,但分頻結(jié)構(gòu)將變?nèi)?。實際上應(yīng)該綜合考慮這兩個方面的因素,在燼量 減少誤差的前提下,選取合適的基準(zhǔn)頻率。本設(shè)計中選取750khz的基準(zhǔn)頻率。由于現(xiàn)有 的高頻時鐘脈沖信號的頻率為12mhz,故需先對其進行16分頻,才能獲得750khz的基 準(zhǔn)頻率。對基準(zhǔn)頻率分頻后的輸出信號是一些脈寬極窄的尖脈沖信號(jf空比=1/分頻系 數(shù))。為提高輸出信號的驅(qū)動能力,以使揚聲器冇足夠的功率發(fā)音,需要再通過一個分頻 器將原來的分頻器的輸出脈沖均衡為對稱方波(占空比=1/2),但這吋的頻率將是原來的 1/2。卜表屮各音符的分頻系數(shù)就是從750

8、khz的基準(zhǔn)頻率二分頻得到的375khz頻率基礎(chǔ) 上計算得到的。由于最大分頻系數(shù)是1274,故分頻器采用11位二進制計數(shù)器能滿足耍求, 樂曲中的休止符,只要將分頻系數(shù)設(shè)為0,即初始值=2n-l=2047,此吋揚聲器不會發(fā)聲。表1各個音符的頻率及其對應(yīng)的分頻系數(shù)(基準(zhǔn)頻率375khz)音符名頻率(hz)分頻系數(shù)計數(shù)初值音符名頻率(hz)分頻系數(shù)計數(shù)初值休止符37500002047中音4796.1784681579低音1294.3491274773中音5882.3534251622低音2330.3961135912中音6989.4463791668低音3370.9210111036屮音71136.

9、36333()1717低音4386.5989701077高音11175.5493191728低音5394.7379501197高-21353.7902771770低音6495.3767571290音31512.0972481799低音7555.566751372高音41609.4422331814中音1588.6976371410高音51802.8842081839中音2638.845871480高音62027.0271851862中音3742.5745051542高音72272.7271651882(3)樂曲節(jié)奏的控制木設(shè)計中的梁祝和月亮代表我的心的樂曲,最小的節(jié)拍為1/4拍,若將1拍的時間

10、定為1 秒,則只需要提供一個4hz的時釗瀕率即可產(chǎn)生1/4拍的時長(0.25秒),對于其它占用 時間較長的節(jié)拍(必為1/4拍的整數(shù)倍)則只需要將該音符連續(xù)輸出相應(yīng)的次數(shù)即可。 計數(shù)吋鐘信號作為輸出音符快慢的控制信號,吋鐘快吋輸出節(jié)拍速度就快,演奏的速度也 就快,時鐘慢時輸出節(jié)拍的速度就慢,演奏的速度cl然降低。(4)樂譜發(fā)生器本文將樂譜中的音符數(shù)裾存儲在lpm-rom中,如“梁?!睒非械牡谝粋€音符為“3”,此音 在邏輯中停留了 4個時鐘節(jié)拍,即1秒的時間,相應(yīng)地,音符“3”就要在lpm-rom中連 續(xù)的四個地址上都存儲。當(dāng)一個4hz的時鐘來時,相應(yīng)地就從lpm-rom中輸出一個音符 數(shù)據(jù)。(

11、5)咅樂硬件演奏電路總體設(shè)計流程當(dāng)一個4hz的時鐘脈沖來到時,樂譜發(fā)生器模塊輸出一個音符數(shù)據(jù)給分頻系數(shù)模塊,分頻 系數(shù)模塊輸出此音符相應(yīng)的分頻系數(shù),將分頻系數(shù)送給數(shù)控分頻器模塊,當(dāng)12mhz的時 鐘脈沖來到時,數(shù)控分頻器就根據(jù)分頻系數(shù)輸出相應(yīng)的頻率(即此音符所對應(yīng)的發(fā)生頻率) 給揚聲器揚聲器就可發(fā)出對應(yīng)咅符的聲咅來.連續(xù)的4hz的時鐘脈沖就將樂譜發(fā)生器里所 存儲的音符數(shù)裾一個接一個的送給了分頻系數(shù)模±九再經(jīng)過數(shù)控分頻模塊,最后揚聲器一個 接一個的發(fā)出咅符數(shù)裾所對應(yīng)的聲咅來。曲子也就流暢的播放出來了,當(dāng)樂曲一遍演奏完 成后,樂曲發(fā)生器能自動從頭開始循環(huán)演奏,按下sel鍵時播放第二首歌,

12、按下rst鍵 時從頭開始播放歌曲。音樂硬件演奏電路主要是用vhdl語言來設(shè)計,外利用quartus6.0軟件工具來編譯、測試 和仿真,音樂硬件漬奏電路設(shè)計總體設(shè)計方框圖如下圖所示。notetabs:u1tonetabaxi2speakera:u3rst| rst selo saclk8hzi dktc»tdhcb(3.0)htej3.qhighcooq3qmioqd<mm講1>spkoutclk12mhzi>1.1音樂硬件演奏電路設(shè)計總體設(shè)計方框code1(3.0 <>high12總體程序設(shè)計2.1頂層模塊設(shè)計流程圖notetabs:u1tonetaba

13、:u2speakera:u3rsti > . rst seli saclk8hz1> chtonetro(3icjhte3.qhigh0c0q3qtcrejio_qdktalq.q1>spkoutclk12mhz1>2.1頂層模塊設(shè)計流程-cccz>hode13.0igh12.2頂層電路vhdl程序設(shè)計library ieee;-硬件演奏電路頂m設(shè)計use ieee.std_logic_1164.all;entity songer isport ( clk12mhz : in std_logic;-咅調(diào)頻率信號clk8hz : in std_logic;-節(jié)拍頻率

14、用于控制音長(節(jié)拍)的時鐘頻率;sel : in stdjlogic;-音樂選擇鍵 rst : in std_logic;-復(fù)位鍵c0de1 : out std_logic_vector (3 downto 0);-簡譜碼輸出顯示 high1 : out std_logic;-高 8 度指示spkout : out std_logic聲咅輸!liend;architecture one of songer iscomponent notetabs-元件 u1 例換化 port ( elk : in stdlogic;sel : in std一logic;rst : in stdlogic;to

15、nelndex : out std_logic_vector (3 downto 0);end component;component tonetaba-元件 u2 例換化port ( index : in std_logic_vector (3 downto 0);code : out std_logic_vector (3 downto 0);high : out std一logic;tone : out std_logic_vector (10 downto 0);end component;component speakera-元件 u3 例換化port ( elk : in std一

16、logic;tone : in std_logic_vector (10 downto 0);spks : out std_logic );end component;signal tone : std_logic_vector (10 downto 0);signal tonelndex : std_logic_vector (3 downto 0);beginul :notetabs port map (clk=clk8hz,rst=rst,sel=sel,toneindex=toneindex);-參數(shù)恃遞映射語句u2:tonetabaportmap(index=>toneinde

17、x,tone=>tone,code=>codel,high=high 1);u3 : speakera port map(clk=>clk 12mhz,tone=>tone, spks=>spkout);end;3單元模塊程序設(shè)計根據(jù)頂層原理圖,共分為nwsic模塊、地址發(fā)生器模塊、分頻預(yù)置數(shù)模塊、i 六進制模塊、 數(shù)控分頻模塊這五個模塊。music模塊存放樂曲屮的音符數(shù)扼,地址發(fā)生器模塊作為nwsic 模塊屮所定制的音符數(shù)據(jù)rom的地址發(fā)生器,分頻預(yù)置數(shù)模塊提供分頻預(yù)置數(shù)即給數(shù)控 分頻模塊提供計數(shù)初值,十六進制模塊對12mhz的吋鐘脈沖進行16分頻,得到750k

18、hz 的頻率,給數(shù)控分頻模塊提供時鐘脈沖。數(shù)控分頻模塊根據(jù)分頻預(yù)置數(shù)輸出各個咅符所對 應(yīng)的頻率。3.1音樂節(jié)拍和音調(diào)發(fā)生器模塊elktonelndex3.0,sel,rstnotetabsinstx圖3.1音樂節(jié)拍和音調(diào)發(fā)生器模塊(1)音樂節(jié)拍和音調(diào)發(fā)生器模塊rtl電路圖dockmusic:u1側(cè) tonelndex(3.0圖3.2音樂節(jié)拍和音調(diào)發(fā)生器模塊rtl電路圖 (2)音樂節(jié)拍和音調(diào)發(fā)生器模塊vhdl程序設(shè)計library ieee;-音樂節(jié)拍和音調(diào)發(fā)生器模塊use ieee.std_logic_1164.all;use ieee.std logic unsigned.all;entit

19、y notetabs isport (elk : in stdjlogic;-咅樂節(jié)拍時鐘 4hzsel : in std_logic;-音樂選擇鍵 rst : in std_logic;-復(fù)位鍵tonelndex : out std一logic一vector (3 downto 0);end;architecture one of notetabs iscomponent music-音符數(shù)據(jù) r0m1port(address : in std_logic_vector (7 downto 0);clock : in std_logic ;q : out std_logic_vector (

20、3 downto 0);end component;signal counter : std_logic_vector (7 downto 0);-8 位二進制計數(shù)器 begincnt8 : process(clk, counter,sel,rst)beginif (clkevent and elk = t) and (counter=256 or rst='o)then counter <=''00000000*'counter <=counter+1;end if;if (clk'event and elk = t) and (sel=0

21、*) then counter <=u 10010000"counter <=counter+1;end if;end process;ul : music port map(address=>counter , q=>toneindex,clock=>clk);end;(2)地址發(fā)生器模塊地址發(fā)生器模塊設(shè)置了一個8位二進制計數(shù)器(計數(shù)最大值為256),作為音符數(shù)據(jù)rom的 地址發(fā)生器。每來一個吋鐘脈沖信號(clk), 8位二進制計數(shù)器就計數(shù)一次,rom文件屮的 地址也就隨著遞増,音符數(shù)據(jù)rom中的音符也就一個接一個連續(xù)的取出來了。在地址發(fā)生器的vhdl

22、設(shè)計屮,這個計數(shù)器的計數(shù)頻率選為4hz,即每一計數(shù)值的停留吋 間為0.25秒,恰為當(dāng)全咅符設(shè)為1秒,四四拍的4分音符持續(xù)時間。例如,地址發(fā)生器在 以下的vhdl邏輯描述中,“梁?!睒非牡谝粋€音符為“3”,此音在邏輯中停留了 4個時 鐘節(jié)拍,即1秒時間。那么相應(yīng)隨著程序4屮的計數(shù)器按4hz的時鐘頻率作加法計數(shù)時, 即隨地址遞增時,將從音符數(shù)據(jù)rom屮將連續(xù)取出4個音符“3”通過toneindex3.0端口 輸向分頻預(yù)置數(shù)欖塊。這樣梁祝樂曲中的咅符就一個接一個的通過toneindex3.0端i輸向 分頻預(yù)置數(shù)模塊。3.2音樂譜對應(yīng)分頻預(yù)置數(shù)查表電路模塊咅樂譜分頻預(yù)置數(shù)模塊x lndex3.oto

23、netabacode3.0hightone10.0xxinst3.3音樂譜分頻預(yù)置數(shù)模塊音樂譜對應(yīng)分頻預(yù)制數(shù)查表電路vhdl程序設(shè)計音樂譜分頻預(yù)置數(shù)模塊是樂曲簡譜碼對應(yīng)的分頻預(yù)置數(shù)查表電路。它提供y每個音符所對 應(yīng)的分頻預(yù)置數(shù),即給數(shù)控分頻模塊提供計數(shù)初值,這里以“梁?!睒非鸀槔谐隽嗽谶@ 個樂曲中所用到的13個音符的分頻預(yù)置數(shù)。在這個模塊的vhdl邏輯描述中設(shè)置了四四拍樂曲中全部咅符所對應(yīng)的分頻預(yù)置數(shù),共13個,每一音符的停留吋鬧由音樂節(jié)拍和地址發(fā)生器模塊的吋鐘(clk)的輸入頻率決定, 在此為4hz。這13個值的輸出由程序3的4位輸入值index3.o確定。輸向程序4中 index3.o

24、的值又由地址發(fā)生器模塊的輸出toneindex3.0的輸出值和持續(xù)時間決定。模塊的功能是輸出各個音符所對應(yīng)的分頻預(yù)置數(shù),即當(dāng)index是“0000”,tone輸出為2047, 即休止符的分頻預(yù)置數(shù);當(dāng)index是“0101”吋,tone輸岀為1197即低音5的分頻預(yù)置數(shù); 當(dāng)index是“1111”時,tone輸出為1728即高音1的分頻預(yù)置數(shù)等等其它狀態(tài)時,tone分別 輸出和應(yīng)音符的分頻預(yù)置數(shù)。分頻預(yù)置數(shù)模塊的vhdl設(shè)計程序如下:library ieee;-音樂譜對應(yīng)分頻預(yù)制數(shù)查表電路模塊use ieee.std logic 1164.all;entity tonetaba isport

25、 ( index : in std_logic_vector (3 downto 0) ;-4 位預(yù)制數(shù)查表 code : out std_logtc_vector (3 downto 0);high : out std_logic;-音樂高 8 度指示tone : out std_logic_vector (10 downto 0)咅樂符對應(yīng)分頻 11 位end;architecture one of tonetaba isbeginsearch : process(index) begincase index is -譯碼電路,查表方式,控制音調(diào)的預(yù)置數(shù)13組頻率when0000”=>

26、;whennooor=>when"ooio”=>whenn0011"=>whenn0101n=>whenn0110m=>when"our1=>whenn1000"=>whenn1001n=>whenh1010m=>when”1100”=>whenn1101"=>when=>when others => null; end case;end process;end;tone<="lllllllllll,. tone<=h01100000101&qu

27、ot; tone<=n01110010000n tone<=h10000001100n tone<=',10010101101h tone<=u10100001010h tone<=n10101011100n tone<=h10110000010n tone<=',10111001000m toned 1000000110n tone<="l 1001010110m toned 1010000100" toned 1011000000n;code<="oooon;code<=n000; ;

28、codewooio”; ;code<=n0011" ;code<="0101n; ;code<="0110n; ;code<=,0111h;code<="000r; ;code<=h0010n; ;code<=noohn; ;code<=n0101”; ;code<=n0110" ;code<=h0001h;high <=0'- 2047 high <='0'- 773; high c'o.;- 912; high <=,0,;-103

29、6; high <=0.;-1197; high <=m90; high c.o'-1372; high <=4>-1410; high <=t;-1480; high <=,1,;-1542; high <=t;-1622; high-1668;high <=t;-1728;3.3音樂符數(shù)控11分頻電路模塊3.3音樂譜對應(yīng)分頻預(yù)置數(shù)查表電路模塊(1)音樂符數(shù)控11分頻電路模塊speakeraelkspkstone10.0inst3.4音樂符數(shù)控11分頻電路模塊(2)咅樂符數(shù)控11分頻電路模塊rtl電路圖圖3.4音樂符數(shù)控11分頻電路模塊

30、rtl電路圖 (3)音樂符數(shù)控11分頻模塊電路vhdl程序設(shè)計音符的頻率由數(shù)控分頻模塊獲得,這是一個數(shù)控分頻電路。它是由一個初值對變的加法計 數(shù)器構(gòu)成。該計數(shù)器的模為2047,當(dāng)計數(shù)器記滿時,計數(shù)器產(chǎn)生一個溢出信號full, 此溢出信號就是用作發(fā)音的頻率信號。在計數(shù)器的輸入端給定不同的初值,而此預(yù)置數(shù)就 是表1中的計數(shù)初值,就可得到不同咅符的發(fā)咅頻率信號。它計滿時所需耍的計數(shù)初值可 由下式來表示。計數(shù)初值(tone) =2047-分頻系數(shù)而分頻系數(shù)又可有下式來求:分頻系數(shù)=基準(zhǔn)頻率/音符的發(fā)生頻率低音吋tone值小,分頻系數(shù)大,溢出信號周期長,揚聲器發(fā)出的聲音低,tone隨音樂的 樂譜變化大,

31、0動控制分頻比,實現(xiàn)z數(shù)控分頻,發(fā)生信號的頻率與咅調(diào)tone成止比。 這就是利用數(shù)控分頻器自動演奏音樂的原理。時鐘(clk)端輸入的是在十六進制模塊里對12mhz的信號進行16分頻得到的750khz, 750khz的信號根據(jù)分頻預(yù)置數(shù)模塊屮所提供的計數(shù)初值,分別得出相應(yīng)音符頻率的兩倍 值。此時從數(shù)控分頻器中出來的輸出信號是脈寬極窄的脈沖式信號,為了宥利于驅(qū)動揚聲 器,需另加一個d觸發(fā)器以均衡其占空比,這時的頻率就變?yōu)樵瓉淼?/2,剛好就是相應(yīng)音符的頻率。數(shù)控分頻模塊屮對clk輸入信號的分頻比由11位預(yù)置數(shù)tone10.0決定。fout 的輸出頻率將決定每一個咅符的咅調(diào),這樣,分頻計數(shù)器的預(yù)置值

32、tone10.0與fout的輸 出頻率就有了對應(yīng)關(guān)系。例如在分頻預(yù)置數(shù)模塊中若取tone10.0=1036,將發(fā)出音符力“3” 音的信號頻率。音符的頻率由數(shù)控分頻模塊vhdl程序如下:library ieee;-音樂符數(shù)控分頻電路模塊use ieee.std logic 1164.all;use ieee.std_logic_unsigned.all;entity speakera isport ( elk : in std_logic;-音調(diào)頻率信號 12mhztone : in std_logic_vector (10 downto 0);-音樂符對應(yīng)分頻 11 位 spks : out

33、std_logic聲音輸出end;architecture one of speakera issignal preclk, fullspks : std_logic;begindivideclk : process(clk)variable count4 : std_logic_vector (3 downto 0);beginpreclk <= o;-將 clk 進行 16 分頻,preclk 為 clk 的 16 分頻 if count4ll then preclk <= t; count4 := "0000”;els if clkevent and clk = t

34、 then count4 := count4 + 1;end if;end process;genspks : process (preclk, tone)- 11 位可預(yù)置計數(shù)器variable count 11 : std一logic一vector (10 downto 0);beginif preclkevent and preclk = t thenif countll = 16#7ff# then countll := tone ; fullspks <= t;else countll := countll + 1; fullspks <= end if;end if;e

35、nd process;delayspks : roocess(fullspks)-將輸出再2分頻,展寬脈沖,使揚聲器有足夠功率發(fā)音variable count2 : std_logic;beginif fullspks'event and fullspks = t then count2 := not count2;if count2 = t then spks <= t;else spks <= o; end if;end if;end process;end;3.4樂曲演奏音符數(shù)據(jù)文件(梁祝、月亮代表我的心)width = 4 樂曲演奏數(shù)據(jù)depth = 256 ;ad

36、dress_radix = dec;data_radix = dec;content begin333355568889685512 12 12 15 13 12 10 12999999909 9 9 10 7 7 6 655568899338865685 5 5 5 5 5 5 510 10 10 12 7 7 9 9685555553503 3567966666656888912 12 12 109910 98865333388886 86535685555555500000000051351735 05067166 550032111321112321162321623200052671

37、21003532157006711123200051351735567166550321113211123026712其屮width=4,表示數(shù)據(jù)輸出為寬為4; depth=256,表示共有256個4位數(shù)據(jù) 點;address-radix=dec,表示地址信號用十進制;data-radix=dec,表示輸出數(shù)據(jù)是十進制數(shù)。形成rom中的配置數(shù)據(jù)(初始化數(shù)據(jù))文件的方法如下:在quartus|中編輯.mif文件。 首先在file菜爭下的new菜申上選擇text editor file命令,進入文木編輯器,然后輸入 以上格式的數(shù)據(jù)文件。文件巾的關(guān)鍵詞width設(shè)置rom的數(shù)據(jù)寬度;depth設(shè)置r

38、om 數(shù)據(jù)的深度,即4位數(shù)據(jù)的數(shù)量,文件中設(shè)置的256等效于8位地址線寬度; address-radix=dec和data-radix=dec表示設(shè)置地址和數(shù)據(jù)的表達式格式都是十 進制;地址/數(shù)據(jù)表以content begin 開始,以end結(jié)束;其中的地址/數(shù)據(jù)表達方式 是胃號左邊寫rom地址值,胃號心邊寫對應(yīng)此地址放置的十進制數(shù)據(jù),如46: 9,表示 46為地址,9為該地址屮的數(shù)據(jù)。這樣每讀到一個地址,即可輸出其相應(yīng)的數(shù)據(jù)。文件編 輯好后,保存時取文件名為“singer.mif,存盤的路徑為“g:music singer”。3.5定制音符數(shù)據(jù)的rom文件1.定制的基木步驟如下:(1) 進入

39、 quartus",選菜單 tool->megawizard plug-in manager,選擇“creat a new., 然后按“next”鍵,選擇lpm-rom;最后在browse下的欄中鍵入路徑與輸山文件名,注意后 綴vhd小寫。(2) 單擊“next”鍵,選擇rom數(shù)據(jù)位寬度為4,地址線寬為256,即設(shè)置此rom能存儲 4位二進制數(shù)據(jù)共256個。(3) 通過“browse”鈕,找到rom中的加載文件路徑和文件名:注意rom元件的inclock 是地址鎖存時鐘。(4) 打開己定制的rom文件,將它設(shè)置為工程,并確定目標(biāo)器件,進行測試仿真波形, 按照定制步驟對音符數(shù)據(jù)文

40、件進行rom定制。定制好的rom文件vhdl程序如下:library ieee;use ieee.std_logic_1164.all; entity music isport(addressinclockqend music;architecture syn of:in std_logic_vector (7 downto 0);:in std_logic ;:out std一logic一vector (3 downto 0);music issignal sub_wireo:std_logic_vector (3 downto 0);component lpm_rom generic (:

41、natural; :natural; string;:string;:string);lpm_widthlpm_widthadlpm_address_controllpm_outdatalpm_fileport (address : in std_logic_vector (7 downto 0); inclock : in std.logic ;q: out std_logic_vector (3 downto 0);end component;beginq <= sub_wire0(3 downto 0); lpmjrom一component : lpm_romgeneric map

42、 (lpm_width =4,lpm_widthad => 8,lpm address control =”registered", lpm_outdata => "unregistered1, lpm_file =,g:/music/singer/singer.mif,)port map (address 二address, inclock => inclock,q => sub_wire0);end syn;4 vhdl音樂硬件演奏電路系統(tǒng)仿真與調(diào)試4.1 notetabs音樂節(jié)拍和音調(diào)發(fā)生器模塊的仿真(1)波形仿真將所編寫的咅樂節(jié)拍和咅調(diào)欖塊n

43、otetabs的程序設(shè)力工程,選用altera公司的cyclone系 列中的epic 12q240c8為目標(biāo)芯片進行仿真。仿真結(jié)果如下圖:bepointer 期 us lateral:24.28 us start:ops end: 5o.bwue at 12.03 nsps 5.12 ns10.2卜15.3卜2,25.卜 30. 35.shs «.3hsmnselke0esiboselbi一 01one.s 0000die.umucon醐醒.1. _ ij丄_ j i kl.loioi鵬18醐g:a圖4.1音樂節(jié)拍和音調(diào)模塊notetabs波形仿真4.2 tonetaba分頻預(yù)置數(shù)查

44、表模塊的仿真(1)波形仿真將所編寫的分頻預(yù)置數(shù)杳表模塊tonetaba的程序設(shè)為工程,選用altera公司的cyclone系 列中的epic 12q240c8為目標(biāo)芯片進行仿真。仿真結(jié)果如下圖:圖4.2分頻預(yù)置數(shù)查表模塊tonetaba波形仿真(2)模塊功能分析與調(diào)試tonetaba分頻預(yù)置數(shù)模塊的功能是輸出各個咅符所對放的分頻預(yù)置數(shù),由上面的仿真波形 圖可看到若當(dāng)index是“0000”,tone輸fli為2047,即休止符的分頻預(yù)置數(shù)當(dāng)index是“0101” 吋,tone輸出為1197即低音5的分頻預(yù)置數(shù);當(dāng)index是“1111”時,tone輸出為1728即 高音1的分頻預(yù)置數(shù)等等其它

45、狀態(tài)吋,tone分別輸出相應(yīng)音符的分頻預(yù)置數(shù),仿真波形圖 證明了程序?qū)崿F(xiàn)了模塊的功能。4.3 speakera音樂符數(shù)控分頻模塊的仿真(1)波形仿真將所編寫的咅樂符數(shù)控分頻欖塊speakera的程序設(shè)力工程,選用altera公司的cyclone系 列中的epic 12q240c8為目標(biāo)芯片進行仿真。仿真結(jié)果如下圖:圖4.3 speakera音樂符數(shù)控分頻模塊波形仿真(2)模塊功能分析與調(diào)試speakera音樂符數(shù)控分頻此模塊的功能是根據(jù)初始值tone的值,對輸入時鐘信號clk的 頻率進行分頻,得到想要的音符的發(fā)聲頻率其時鐘(clk)端輸入的是在十六進制模塊里對 12mhz的信號進行16分頻得到

46、的750khz, 750khz的信號根據(jù)分頻預(yù)置數(shù)模塊巾所提供 的計數(shù)初值,分別得出和應(yīng)音符頻率的w倍值。此時從數(shù)控分頻器巾山來的輸岀信號是脈 寬極窄的脈沖式信號,為了有利于驅(qū)動揚聲器,需另加一個d觸發(fā)器以均衡其占空比, 這吋的頻率就變?yōu)樵瓉淼?/2,剛好就是相應(yīng)音符的頻率。在clk端輸入一具有較高頻率的 信號(這里是12mhz)的信號,通過分頻g由cout輸出。這里是對12mhz的信號進行16 分頻得到750khz的信號。750khz的時鐘脈沖信號是給數(shù)控分頻模塊提供時鐘信號。數(shù) 控分頻模塊中對clk輸入信號的分頻比由11位預(yù)置數(shù)tone10.0決定。spkout的輸出頻率 將決定每一個音符

47、的音調(diào),這樣,分頻計數(shù)器的預(yù)置tone10.01與font的輸出頻率就奮y 對皮關(guān)系。若在分頻預(yù)置數(shù)模塊屮若取tone10.01=1036,將發(fā)出音符為“3”音的信號頻率。在這個仿 真波形圖中,tone的值可設(shè)為6c0 (即高咅1的分頻預(yù)置數(shù)1728), clk的頻率為750khz, spkout輸出的脈沖信號的周期為849.929lus (即1176.568hz),接近高音1的發(fā)聲頻率。 由表中可知高音1的分頻系數(shù)為319,即對輸入時鐘clk進行319次分頻就可得高音1的 發(fā)聲頻率,因此這個程序?qū)崿F(xiàn)了模塊的功能。4.4擴大此音樂硬件演奏電路的通用性前面所設(shè)計的電路只能演奏“梁?!鼻樱窃?/p>

48、實際應(yīng)用中,若能將電路實用于各種曲子的演奏,它的實用性和應(yīng)用范圍就會擴大許多。這里主要通過修改分頻預(yù)置數(shù)模塊的程序, 使其實用于各種曲子的演奏。另外耍使更改樂曲方便,主耍通過重新設(shè)置咅符數(shù)裾文件, 再對其進行l(wèi)pm-rom定制。在前面的vhdl設(shè)計中,我們只能通過程序輸出“梁?!鼻又械?3個音符的分頻預(yù)置數(shù)(即計數(shù)初值),但是在其它的樂曲屮可能會用到另外的那些音符,因此對程序進行修改 完善它的功能,使其能輸出另外那些音符的分頻預(yù)置數(shù)。把修改的程序代替原來此模塊的 程序連入頂層文件后,要使所設(shè)計的音樂硬件演奏電路可隨意更改曲子,只要修改音符數(shù) 據(jù)文件,在那些連續(xù)的地址上存儲曲了中相應(yīng)的咅符,再

49、對咅符數(shù)據(jù)文件進行rom定制, 最后連接到整個電路中即可實現(xiàn)。程序修改如下:library ieee;use ieee.std_logic_1164.all;entity tonetaba isport( index : in std_logic_vector(4 downto 0);-5 位預(yù)制數(shù)查表碼 code : out std_logic_vector(4 downto 0);high : out stdjogic;tone : out std_logic_vector( 10 downto 0);-音樂符對應(yīng)分頻 11 位end;architecture one of tonetab

50、a isbeginsearch : process(index) begincase index iswhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenuooooo"=>tone<="ll 111111111 ;code<=n00000"high<=.0;-2047,休止符 "00001 h=>tone<=h01100000101 "code<=n00001低音 1,00010,=>tone<=,01110010000"

51、code<=n00010"high<=,0;-912,低音 2 "0001 ln=>tone<=" 10000001100,;(:016<=,00011;111<=,0>-1036,低音3 ”00100n=>tone<="l0000110101 "code<=n001 oo,;high<=,o,;-l077,低音 4 n0010r=tone<=”1001010110r;code<=n0010r;high<=.0;-1197,低咅 5 n00110n=tone&l

52、t;=”10100001010"code<=n001 lohighew-uw,低音 6 n0011 ln=tone<="10101011100"code<=n0011 l'highfo-d?,低音 7 u01000n=tone<=" 10110000010" ;code<=n01000" ;high<=. 1;-1410,屮音 1 ”0100r=tone<=n10h1001000"code<=n0100r;high<=t;-1480,巾音 2 u01010&quo

53、t;=>tone<=" 11000000110;code<=n01010"high<=t;-1542,中音 3 "01011 "=>tone<=" 11000101000”;code<="01011 ”;high<=. 11576,中音 4 "01100"=>tone<="11001010110;code<=n01100"high<=t;-1622,中音 5 ”01101 h=>tone<=m 110100001

54、00n;code<="01101”;high二t;-1668,屮音 6£ 坰樞o:e8ral=>sulolor=vopo5j i holool h寸慚榧 >l8l:l=vqonsuoolor=>upst=ol losool 11 £®、66£lal=>qss.uool:=>qpst:h soooo5 2 坰嫗o££l-al-=>qs2uoloor=v3p8t:ololol uou l 坰姬oozllal=>2uoool:=>upst:000002su£ 誑二&#

55、39;/j£,a l=>tb!qol 11 o=>up8u 0101101011=v§2<=hooi =vi<=olool=>ol<=o§ :=>3u2<=:osoi=>!<= j i is =><=01110sssumgqavsqm§qmtpuwtsscdoojd pug oss pug=nu <= sjolpo §q 彡£mt88r-u-=>sullol=vsst:olollolohl.=v§2<=wsk 9mt98l:u-=>

56、;qs2uoiiol=>opst:ollooolouk=vo§x=oolorsqm5心得體會課程設(shè)計是針對某一理論課程的要求,對學(xué)生進行綜合性實踐訓(xùn)練的實踐教學(xué)環(huán)節(jié),可以提高學(xué)生運用 課程屮所學(xué)的理論知識與實踐緊密結(jié)合,獨立地解決實際問題的能力。在這次課程設(shè)計過程屮使我從中學(xué)到許多以前在課本和課堂上所無法學(xué)到的,特別是在課程設(shè)計過程中 查找資料的過程屮從屮學(xué)到許多以前在課本和課堂上所無法學(xué)到的并從中體會到許多的樂趣,從而豐富 了 己,使£1己無論足上課吋還足在課余都感到很充實。在本次課程設(shè)計的過程屮,w得到過老師與幾位hd學(xué)的悉心指導(dǎo)與幫助,i使得我們的設(shè)計非常圓滿的 完成,在此對他們表示我們最衷心的感謝,謝謝你們!因?qū)W習(xí)知識的能力和時間冇限,并且此次eda課程設(shè)計對于我們來說還只是初體驗,兇 此在木次的課程設(shè)計過程屮,難免存在錯誤,懇請老師給以批評

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論