基于-FPGA的音樂播放器的設(shè)計_第1頁
基于-FPGA的音樂播放器的設(shè)計_第2頁
基于-FPGA的音樂播放器的設(shè)計_第3頁
基于-FPGA的音樂播放器的設(shè)計_第4頁
基于-FPGA的音樂播放器的設(shè)計_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、摘要根據(jù)國家發(fā)改委與專業(yè)教學(xué)委員會對教育機(jī)構(gòu)的要求,為培養(yǎng)適應(yīng)我國21世紀(jì)國民經(jīng)濟(jì)發(fā)展的電子設(shè)計人才;同時基于國家教委面向21世紀(jì)電工電子課程體系改革和電工電子工科教學(xué)基地建設(shè)兩項教學(xué)改革研究成果。要求高等本科在校學(xué)生能夠自己動手完成簡單的數(shù)字器件設(shè)計。本次設(shè)計在自己手動焊接簡易的PFGA板子上實現(xiàn),并且在QusrtusII 9.0上利用VHDL設(shè)計數(shù)控分頻器電路,利用數(shù)控分頻原理設(shè)計音樂硬件演奏電路,并制定LPM-ROM存儲音樂數(shù)據(jù),以“梁祝”樂曲為例,將音樂數(shù)據(jù)存儲到LPM-ROM,就達(dá)到了已純硬件的手段來實現(xiàn)樂曲演奏的效果,只要修改LPM-ROM所存儲的音樂數(shù)據(jù),將其轉(zhuǎn)換為其他的音樂數(shù)據(jù)

2、,再重新制定LPM-ROM,在連接到程序中就可以實現(xiàn)其他與取得演奏。本次設(shè)計采用的FPGA主芯片位ALTERA公司的FLEX系列的EPF10K10LC84-4。由于板子是自己手動在萬用板上焊接的所以只焊接了必要的外設(shè)如蜂鳴器和LED。關(guān)鍵詞FPGA;音樂播放器;QuartusII;VHDL;目錄摘要I第一章 前言21.1關(guān)于EDA技術(shù)21.2 關(guān)于VHDL21.3 關(guān)于EDA工具31.4 有關(guān)本次課程設(shè)計3第二章 設(shè)計實現(xiàn)42.1音樂演奏電路原理42.1.1音符頻率的獲得42.1.2樂曲節(jié)奏的控制52.1.3樂譜發(fā)生器52.1.4樂曲演奏電路原理框圖52.2音樂硬件演奏電路的設(shè)計實現(xiàn)52.2.

3、1各個模塊的功能簡介52.2.2 music模塊62.3地址發(fā)生器模塊82.3.1地址發(fā)生器的VHDL設(shè)計82.3.2波形仿真92.4分頻預(yù)置數(shù)模塊92.4.1分頻預(yù)置數(shù)模塊的VHDL設(shè)計92.4.2波形仿真102.5十六進(jìn)制模塊112.5.1十六進(jìn)制模塊的VHDL設(shè)計112.5.2波形仿真112.6數(shù)控分頻模塊122.6.1數(shù)控分頻模塊的VHDL設(shè)計122.6.2 波形仿真132.7 分頻模塊132.8頂層模塊15結(jié)論17參考文獻(xiàn)18第一章 前言1.1關(guān)于EDA技術(shù)隨著科學(xué)技術(shù)的進(jìn)步,電子器件和電子系統(tǒng)設(shè)計方法日新月異,電子設(shè)計自動化(Electronics Design Automatio

4、n,EDA)技術(shù)正是適應(yīng)了現(xiàn)代電子產(chǎn)品設(shè)計的要求,吸收了多學(xué)科最新成果而形成的一門新技術(shù)?,F(xiàn)如今掌握EDA技術(shù)是電子信息類專業(yè)的學(xué)生、工程技術(shù)人員所必備的基本能力和技能。傳統(tǒng)電子電路的設(shè)計,首先要對系統(tǒng)進(jìn)行分析,然后按功能對系統(tǒng)進(jìn)行劃分,接下來就要選擇特定芯片,焊接成PCB電路板,最后對成品PCB電路板進(jìn)行調(diào)試。這樣的設(shè)計沒有靈活性可言,搭成的系統(tǒng)需要的芯片種類多且數(shù)目大,而且對于電路圖的設(shè)計和電路板的設(shè)計都需要很大的工作量,工作難度也很高。然而,隨著可編程器件和EDA技術(shù)的發(fā)展,傳統(tǒng)設(shè)計的劣勢被克服,采用可編程邏輯器件基于芯片的設(shè)計方法,期間的內(nèi)部邏輯和引腳可以由設(shè)計者自行決定,大大提高了設(shè)

5、計的靈活性,提高了工作效率;同時,將系統(tǒng)集成在一個芯片上的設(shè)計,使系統(tǒng)具有體積小、功耗低、可靠性高等特點。EDA技術(shù)的發(fā)展大致經(jīng)歷了三個階段:20世紀(jì)70年代的CAD(計算機(jī)輔助設(shè)計)階段、20世紀(jì)80年代的CAE(計算機(jī)輔助工程)階段、20世紀(jì)90年代后的EDA(電子設(shè)計自動化)階段。以下主要介紹第三個階段。EDA技術(shù)即電子設(shè)計自動化技術(shù),它是以可編程邏輯器件(PLD)為載體,以硬件描述語言(HDL)為主要的描述方式,以EDA軟件為主要的開發(fā)軟件的電子設(shè)計過程。它主要采用“自頂向下”的設(shè)計方法,設(shè)計流程主要包括:設(shè)計輸入、綜合、仿真、適配、下載。EDA技術(shù)主要有以下特征:(1)高層綜合的理論

6、和方法取得進(jìn)展,從而將EDA設(shè)計層次由RT級提高到了系統(tǒng)級,并推出了相應(yīng)的系統(tǒng)級綜合優(yōu)化工具,大大縮短了復(fù)雜ASIC的設(shè)計周期。(2)采用硬件描述語言來描述10萬門以上的設(shè)計,并形成了VHDL和Verilog-HDL兩種標(biāo)準(zhǔn)硬件描述語言。(3)采用平面規(guī)劃技術(shù)對邏輯綜合和物理版圖設(shè)計聯(lián)合管理,做到在邏輯設(shè)計綜合早期階段就考慮到物理設(shè)計信息的影響。(4)可測性綜合設(shè)計。(5)為帶有嵌入式IP核的ASIC設(shè)計提供軟、硬件協(xié)同設(shè)計工具。(6)建立并行設(shè)計工具框架結(jié)構(gòu)的集成化設(shè)計環(huán)境,以適應(yīng)當(dāng)今ASIC規(guī)模大而復(fù)雜、數(shù)字與模擬電路并存、硬件與軟件設(shè)計并存、產(chǎn)品上市速度快等特點??偠灾?,EDA技術(shù)的出

7、現(xiàn),給電子信息產(chǎn)業(yè)帶來了革命性的變革。1.2關(guān)于VHDLVHDL是一種硬件描述語言,它可以對電子電路和系統(tǒng)的行為進(jìn)行描述,基于這種描述,結(jié)合相關(guān)的軟件工具,可以得到所期望的實際電路與系統(tǒng)。使用VHDL語言描述的電路,可以進(jìn)行綜合和仿真。然而,值得注意的是,盡管所有VHDL代碼都是可仿真的,但并不是所有代碼都能綜合。VHDL被廣泛使用的基本原因在于它是一種標(biāo)準(zhǔn)語言,是與工具和工藝無關(guān)的,從而可以方便地進(jìn)行移植和重用。VHDL兩個最直接的應(yīng)用領(lǐng)域是可編程邏輯器件(PLD)和專用集成電路(ASIC),其中可編程邏輯器件包括復(fù)雜可編程邏輯器件(CPLD)和現(xiàn)場可編程門陣列(FPGA)。關(guān)于VHDL最后

8、要說明的是:與常規(guī)的順序執(zhí)行的計算機(jī)程序不同,VHDL從根本上講是并發(fā)執(zhí)行的。在VHDL中,只有在進(jìn)程(PROCESS)、函數(shù)(FUNCTION)和過程(PROCEDURE)內(nèi)部的語句才是順序執(zhí)行的。1.3EDA工具目前有多種EDA工具支持采用VHDL進(jìn)行電路綜合、仿真以及實現(xiàn)。比較常見的是Altera公司的Quartus開發(fā)平臺和Xilinx公司的ISE開發(fā)平臺。這些平臺中使用的綜合工具和仿真工具通常由專業(yè)的EDA廠商提供。本次設(shè)計中所使用的平臺正是Quartus7.2,它是Altera公司提供的一套集成了編譯、布局布線和仿真工具在內(nèi)的綜合開發(fā)環(huán)境。它能完成從代碼輸入到編譯到仿真再到物理實現(xiàn)

9、的全部設(shè)計流程。1.4有關(guān)于本次課程設(shè)計本次課程設(shè)計要求使用EDA工具,設(shè)計實現(xiàn)簡易音樂演奏器,理解音名與頻率的關(guān)系及數(shù)控分頻原理,經(jīng)過對整體進(jìn)行模塊化分析、編程、綜合、仿真及最終下載,完整實現(xiàn)簡易音樂器的播放功能。我們知道,與利用單片機(jī)來實現(xiàn)樂曲演奏相比,以純硬件完成樂曲演奏電路的邏輯要復(fù)雜得多,如果不借助于功能強大的EDA工具與硬件描述語言,僅憑傳統(tǒng)的數(shù)字邏輯技術(shù),即使最簡單的演奏電路也難以實現(xiàn)。在后面的章節(jié)中會詳細(xì)介紹利用EDA技術(shù)實現(xiàn)簡易音樂演奏器的過程。第二章 設(shè)計實現(xiàn)2.1音樂演奏電路原理先介紹一下硬件電路的發(fā)聲原理。聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制FPGA某個

10、引腳輸出一定頻率的矩形波,接上揚聲器就能發(fā)出相應(yīng)頻率的聲音。樂曲中的每一音符對應(yīng)著一個確定的頻率,要想FPGA發(fā)出不同音符的音調(diào),實際上只要控制它輸出相應(yīng)音符的頻率即可。樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些音符所對應(yīng)的頻,就可以在揚聲器上連續(xù)地發(fā)出各個音符的音調(diào)。而要準(zhǔn)確地演奏出一首樂曲,僅僅讓揚聲器能夠發(fā)生是不夠的,還必須準(zhǔn)確地控制樂曲的節(jié)奏,即樂曲中每個音符的發(fā)生頻率及其持續(xù)時間是樂曲能夠連續(xù)演奏的兩個關(guān)鍵因素。2.1.1音符頻率的獲得多個不同頻率的信號可通過對某個基準(zhǔn)頻率進(jìn)行分頻器獲得。由于各個音符的頻率多為非整數(shù),而分頻系數(shù)又不能為小數(shù),故必須將計算機(jī)得到的分頻系

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

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

13、036中音71136.3633301717低音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.72716518822.1.2樂曲節(jié)奏的控制本文中的梁祝樂曲,最小的節(jié)拍為1/4拍,若將1拍

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

15、樂曲演奏電路原理框圖當(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ù)據(jù)一個接一個的送給了分頻系數(shù)模塊,再經(jīng)過數(shù)控分頻模塊,最后揚聲器一個接一個的發(fā)出音符數(shù)據(jù)所對應(yīng)的聲音來。曲子也就流暢的播放出來了。2.2音樂硬件演奏電路的設(shè)計實現(xiàn)音樂硬件演奏電路主要是用VHDL語言來設(shè)計,并利用QuartusII軟件工具來編譯、

16、測試和仿真。2.2.1各個模塊的功能簡介根據(jù)頂層原理圖,共分為music模塊、地址發(fā)生器模塊、分頻預(yù)置數(shù)模塊、十六進(jìn)制模塊、數(shù)控分頻模塊這五個模塊。music模塊存放樂曲中的音符數(shù)據(jù),地址發(fā)生器模塊作為music模塊中所定制的音符數(shù)據(jù)ROM的地址發(fā)生器,分頻預(yù)置數(shù)模塊提供分頻預(yù)置數(shù)即給數(shù)控分頻模塊提供計數(shù)初值,十六進(jìn)制模塊對12MHz的時鐘脈沖進(jìn)行16分頻,得到750KHz的頻率,給數(shù)控分頻模塊提供時鐘脈沖。數(shù)控分頻模塊根據(jù)分頻預(yù)置數(shù)輸出各個音符所對應(yīng)的頻率。2.2.2 music模塊Music模塊存放樂曲中的音符數(shù)據(jù),它是利用LPM-ROM來實現(xiàn)的,將樂譜中相應(yīng)的音符放在一個連續(xù)的地址上。它

17、首先是編寫音符數(shù)據(jù)文件,將樂譜中相應(yīng)的音符存放在一個連續(xù)的地址上。因為1拍的時間定為1秒,提供的是4Hz的時鐘頻率(即1/4拍的整數(shù)倍),則需將這個音符存儲在相應(yīng)次數(shù)的連續(xù)幾個地址上。然后對音符數(shù)據(jù)進(jìn)行ROM定制,最后對定制好的ROM文件進(jìn)行測試和仿真。圖2-1 音符數(shù)據(jù)文件形成ROM中的配置數(shù)據(jù)(初始化數(shù)據(jù))文件的方法如下:在QuartusII中編輯.mif文件。首先在File菜單下的New菜單上選擇Memory Initialization File命令,進(jìn)入編輯器,然后在空格處輸入以上格式的數(shù)據(jù)文件。如46位置處為9,表示46為地址,9為該地址中的數(shù)據(jù)。這樣每讀到一個地址,即可輸出其相應(yīng)

18、的數(shù)據(jù)。文件編輯好后,保存時取文件名為“c.mif”,存盤的路徑為“工程文件夾下”。LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY c ISPORT(address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);clock: IN STD_LOGIC := 1;q: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END c;ARCHITECTURE SYN OF c ISSIGNAL sub_wire0: STD_LOGIC_VEC

19、TOR (3 DOWNTO 0);COMPONENT altsyncramGENERIC (clock_enable_input_a: STRING;clock_enable_output_a: STRING;init_file: STRING;intended_device_family: STRING;lpm_hint: STRING;lpm_type: STRING;numwords_a: NATURAL;operation_mode: STRING;outdata_aclr_a: STRING;outdata_reg_a: STRING;widthad_a: NATURAL;width

20、_a: NATURAL;width_byteena_a: NATURAL);PORT (clock0: IN STD_LOGIC ;address_a: IN STD_LOGIC_VECTOR (7 DOWNTO 0);q_a: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END COMPONENT;BEGINq BYPASS,clock_enable_output_a = BYPASS,init_file = c.mif,intended_device_family = FLEX,lpm_hint = ENABLE_RUNTIME_MOD=NO,lpm_type =

21、altsyncram,numwords_a = 256,operation_mode = ROM,outdata_aclr_a = NONE,outdata_reg_a = CLOCK0,widthad_a = 8,width_a = 4,width_byteena_a = 1)PORT MAP (clock0 = clock,address_a = address,q_a = sub_wire0);END SYN;定制的基本步驟如下:1)進(jìn)入QuartusII,選菜單 tools-megawizard plug-in manager,選擇“creat a new”,然后按“next”鍵,進(jìn)入

22、圖3所示界面。選擇LPM-ROM;最后在browse下的欄中鍵入路徑與輸出文件名:“f:FPGA_musicc.vhd”,注意后綴vhd小寫。2)單擊“next”鍵,將出現(xiàn)圖4所示的界面,選擇ROM數(shù)據(jù)位寬度為4,地址線寬為8,即設(shè)置此ROM能存儲8位二進(jìn)制數(shù)據(jù)共64個,然后進(jìn)入圖5所示的窗口。3)通過在圖5所示窗口的“browse”鈕,找到ROM中的加載文件路徑和文件名:“f:FPGA_musicc.mif”,注意ROM元件的inclock是地址鎖存時鐘。4)在QuartusII中打開已定制的ROM文件。將它設(shè)置為工程,并確定目標(biāo)器件,進(jìn)行測試。2.3地址發(fā)生器模塊地址發(fā)生器模塊設(shè)置了一個8

23、位二進(jìn)制計數(shù)器(計數(shù)最大值為138),作為音符數(shù)據(jù)ROM的地址發(fā)生器。每來一個時鐘脈沖信號(Clk),8位二進(jìn)制計數(shù)器就計數(shù)一次,ROM文件中的地址也就隨著遞增,音符數(shù)據(jù)ROM中的音符也就一個接一個連續(xù)的取出來了。2.3.1地址發(fā)生器的VHDL設(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個音符

24、“3”通過toneindex3.0端口輸向分頻預(yù)置數(shù)模塊。這樣梁祝樂曲中的音符就一個接一個的通過toneindex3.0端口輸向分頻預(yù)置數(shù)模塊。程序如下Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity notetabs is Port( clk : in std_logic;Toneindex : out std_logic_vector(3 downto 0); End;Architecture one of notetabs is Component c Port(address:

25、 in std_logic_vector(7 downto 0);clock : in std_logic;q : out std_logic_vector(3 downto 0); End component; Signal counter : std_logic_vector(7 downto 0); Begin Cnt8 : process(clk) Begin If counter=then counter=; Elsif(clkevent and clk=1)then countercounter,q=toneindex,clock=clk);End;2.3.2波形仿真將所編寫的地址

26、發(fā)生器模塊的程序設(shè)為工程,選用FLEX10K中的EPF10K10LC84-4為目標(biāo)芯片進(jìn)行仿真。仿真結(jié)果如下圖:圖2-2 地址發(fā)生器模塊的仿真波形圖程序的功能是每來一個時鐘,地址值遞增1,并將這個地址上所存儲的音符數(shù)據(jù)輸出。從圖中可以看到,當(dāng)Clk來了一個時鐘脈沖,輸出相應(yīng)地址上的音符3, 地址值遞增1;接下來的三個時鐘脈沖來時,輸出也是音符3,地址連續(xù)遞增3次;再下一個脈沖來時,輸出為音符5等等都符合模塊中的音符數(shù)據(jù)文件中的地址/數(shù)據(jù)表。這個仿真波形圖證明了程序?qū)崿F(xiàn)了地址發(fā)生器模塊的功能。2.4分頻預(yù)置數(shù)模塊分頻預(yù)置數(shù)模塊是樂曲簡譜碼對應(yīng)的分頻預(yù)置數(shù)查表電路。它提供了每個音符所對應(yīng)的分頻預(yù)置

27、數(shù),即給數(shù)控分頻模塊提供計數(shù)初值,這里以“梁?!睒非鸀槔?,列出了在這個樂曲中所用到的13個音符的分頻預(yù)置數(shù)。2.4.1分頻預(yù)置數(shù)模塊的VHDL設(shè)計在這個模塊的VHDL邏輯描述中設(shè)置了“梁祝”樂曲中全部音符所對應(yīng)的分頻預(yù)置數(shù),共13個,每一音符的停留時間由音樂節(jié)拍和地址發(fā)生器模塊的時鐘(Clk)的輸入頻率決定,在此為4Hz。這13個值的輸出由程序3的4位輸入值index3.0確定。輸向程序中index3.0的值又由地址發(fā)生器模塊的輸出toneindex3.0的輸出值和持續(xù)時間決定。程序如下:Library ieee;Use ieee.std_logic_1164.all;Entity tonet

28、aba is 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;Architecture one of tonetaba isBegin Search : process(index) Begin Case index is When 0000=tone=;code=0000;hightone=;code=0001;hightone=;co

29、de=0010;hightone=;code=0011;hightone=;code=0101;hightone=;code=0110;hightone=;code=0111;hightone=;code=0001;hightone=;code=0010;hightone=;code=0011;hightone=;code=0101;hightone=;code=0110;hightone=;code=0001;high null; End case; End process;End;End;2.4.2 波形仿真將所編寫的分頻預(yù)置數(shù)模塊的程序設(shè)為工程,仿真選用的目標(biāo)芯片是EPF10K10LC8

30、4-4。仿真結(jié)果如下圖:圖2-3 分頻預(yù)置數(shù)模塊的仿真波形圖模塊的功能是輸出各個音符所對應(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ù)。這個仿真波形圖證明了程序?qū)崿F(xiàn)了模塊的功能。2.5十六進(jìn)制模塊由其clk端輸入一具有較高頻率的信號(這里是12MHz)的信號,通過分頻后由cout輸出。這里是對12MHz的信號進(jìn)行16分頻得到75

31、0KHz的信號。750KHz的時鐘脈沖信號是給數(shù)控分頻模塊提供時鐘信號。2.5.1十六進(jìn)制模塊的VHDL設(shè)計用以下的VHDL邏輯描述來實現(xiàn)十六進(jìn)制模塊的功能。Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt16 is port( clk : in std_logic; cout : out std_logic);end cnt16;architecture shiliu of cnt16 is begin process(clk) variable cqi : std_logi

32、c_vector(3 downto 0); begin if cqi1111 then cqi:=0000; elsif clkevent and clk=1 then cqi:=cqi+1; end if; if cqi=1111then cout=1; else cout=0; end if; end process;end shiliu;2.5.2 波形仿真將程序設(shè)為工程,選用目標(biāo)芯片為EPF10K10LC84-4對程序進(jìn)行編譯和仿真。仿真結(jié)果如下圖:圖2-4 十六進(jìn)制仿真波形圖此模塊的功能是對輸入的時鐘脈沖信號的頻率進(jìn)行16分頻。從仿真波形圖上可以看到cout輸出一個脈沖,此時的Clk

33、剛好來第16個脈沖,即cout的頻率是Clk頻率的16分之一。可見所編寫的程序?qū)崿F(xiàn)了模塊的功能。2.6 數(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ù)大,溢出信號周期長,揚聲器

34、發(fā)出的聲音低,Tone隨音樂的樂譜變化大,自動控制分頻比,實現(xiàn)了數(shù)控分頻,發(fā)生信號的頻率與音調(diào)Tone成正比。這就是利用數(shù)控分頻器自動演奏音樂的原理。52.6.1 數(shù)控分頻模塊的VHDL設(shè)計其時鐘(Clk)端輸入的是在十六進(jìn)制模塊里對12MHz的信號進(jìn)行16分頻得到的750KHz,750KHz的信號根據(jù)分頻預(yù)置數(shù)模塊中所提供的計數(shù)初值,分別得出相應(yīng)音符頻率的兩倍值。此時從數(shù)控分頻器中出來的輸出信號是脈寬極窄的脈沖式信號,為了有利于驅(qū)動揚聲器,需另加一個D觸發(fā)器以均衡其占空比,這時的頻率就變?yōu)樵瓉淼?/2,剛好就是相應(yīng)音符的頻率。數(shù)控分頻模塊中對Clk輸入信號的分頻比由11位預(yù)置數(shù)tone10.

35、0決定。Fout的輸出頻率將決定每一個音符的音調(diào),這樣,分頻計數(shù)器的預(yù)置值tone10.0與Fout的輸出頻率就有了對應(yīng)關(guān)系。例如在分頻預(yù)置數(shù)模塊中若取tone10.0=1036,將發(fā)出音符為“3”音的信號頻率。程序3如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pulse is port ( clk : in std_logic; d : in std_logic_vector(10 downto 0); fout : out std_logic );end;archite

36、cture ONE of pulse is signal full : std_logic;begin p_reg: process(clk) variable cnt11,cnt111 : std_logic_vector(10 downto 0); begin if clkevent and clk = 1 then cnt111:= 2046 - d; if cnt11 = cnt111 then cnt11 := ; full = 1; else cnt11:= cnt11 + 1; full = 0; end if; end if; end process p_reg ; p_div

37、: process(full) variable cnt2 : std_logic; begin if fullevent and full = 1 then cnt2 := not cnt2; if cnt2 = 1 then fout = 1; else fout = 0; end if; end if; end process p_div ;end;2.6.2 波形仿真將以上程序設(shè)為當(dāng)前工程,選用FLEX10K中的EPF10K10LC84-4為目標(biāo)芯片對程序進(jìn)行編譯和仿真。仿真結(jié)果圖如下圖。圖2-5 數(shù)控分頻模塊的仿真波形圖此模塊的功能是根據(jù)初始值d的值,對輸入時鐘信號Clk的頻率進(jìn)行分

38、頻,得到想要的音符的發(fā)聲頻率。在這個仿真波形圖中,d的值設(shè)為6c0(即高音1的分頻預(yù)置數(shù)1728),Clk的頻率為750KHz,F(xiàn)out輸出的脈沖信號的周期為848.587us(即1178.43Hz),接近高音1的發(fā)聲頻率。由表1中可知高音1的分頻系數(shù)為319,即對輸入時鐘Clk進(jìn)行319次分頻就可得高音1的發(fā)聲頻率。因此這個程序?qū)崿F(xiàn)了模塊的功能。2.7分頻模塊 由于系統(tǒng)需要4hz的頻率和25Mhz的輸入由于只用一塊25M晶振所以需要將25Mhz分頻成為4hz,有如下兩段代碼:-分配器-*庫定義、 包定義*library IEEE;use IEEE.STD_LOGIC_1164.ALL;use

39、 IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-*實體定義*Entity clk25Mhz_4khz isgeneric(duty:integer:=3125 );-類屬參數(shù)說明語句-端口說明 port(clkin_25Mh:instd_logic;-時鐘輸入clkout_4khz: out std_logic-分頻輸出 );end clk25Mhz_4khz;-*構(gòu)造體定義*Architecture div6250 of clk25Mhz_4khz is constant period : integer:=6250;-常

40、數(shù)定義,分頻數(shù) signal count : integer range 0 to period-1;-信號定義,計數(shù)作用 beginprocess(clkin_25Mh)-進(jìn)程,由clk這個信號啟動 beginif rising_edge(clkin_25Mh) then -上升沿驅(qū)動,還有另一種寫法,見其他例程 if countduty thenclkout_4khz=0;count=count+1;elsif countperiod-1 then clkout_4khz=1;count=count+1;elsecount=0;end if;end if;end process;end div6250;-分配器-*庫定義、 包定義*library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論