【正文】
12 定制音符數(shù)據(jù)的 ROM 文件 14 4. VHDL 音樂(lè)硬件演奏電路系統(tǒng)仿真與調(diào)試 NoteTabs 音樂(lè)節(jié)拍和音調(diào)發(fā)生器模塊的仿 16 ToneTaba 分頻預(yù)置數(shù)查表模塊的仿真 16 Speakera 音樂(lè)符數(shù)控分頻模塊的仿真 17 擴(kuò)大 此 音樂(lè)硬件演奏電路的通用性 19 5. 心得體會(huì) 21 6. 參考文獻(xiàn) 21 河南機(jī)電高等專科學(xué)校課程設(shè)計(jì)論文 《 VHDL 硬件語(yǔ)言》課程設(shè)計(jì)論文 摘要 根據(jù)國(guó)家教委與專業(yè)教學(xué)委員會(huì)對(duì)教育機(jī)構(gòu)的要求,為培養(yǎng)適應(yīng)我國(guó) 21 世紀(jì)國(guó)民經(jīng)濟(jì)發(fā)展需要的電子設(shè)置人才;同時(shí)基于國(guó)家教委面向 21世紀(jì)電工電子課程體系改革和電工電子工科教學(xué)基地建設(shè)兩項(xiàng)教學(xué)改革研究成果。要求高等專科學(xué)校學(xué)生能夠自己動(dòng)手完成簡(jiǎn)單數(shù)字器件的設(shè)計(jì)。 本 次設(shè)計(jì) 在 EDA 開(kāi)發(fā)平臺(tái) QUARTUS|| 上利用 VHDL 語(yǔ)言設(shè)計(jì)數(shù)控分頻器電路,利用數(shù)控分頻的原理設(shè)計(jì)音樂(lè)硬件演奏電路,并定制 LPMROM 存儲(chǔ)音樂(lè)數(shù)據(jù),以“梁?!?和“月亮代表我的心”兩首 樂(lè)曲為例,將音樂(lè)數(shù)據(jù)存儲(chǔ)到 LPMROM,就達(dá)到了以純硬件的手段來(lái)實(shí)現(xiàn)樂(lè)曲的演奏效果。 本設(shè)計(jì)采用的是杭州康芯電子有限公司生產(chǎn)的 GW48CK 實(shí)驗(yàn)系統(tǒng), FPGA 目標(biāo)芯片型號(hào) 為 Altera 公司的 Cyclone 系列 中 的 EPFl0K10LC84。 關(guān)鍵詞 : FPGA/CPLD, 音樂(lè)硬件演奏電路 , VHDL 語(yǔ)言設(shè)計(jì) , QUARTUS|| 1. 系統(tǒng)設(shè)計(jì)總述 ( 1) 順序播放樂(lè)曲 功能 ( 2) 具有通過(guò)按鍵 任意 切換樂(lè)曲 功能 系統(tǒng)組成 ( 1) 音樂(lè) 硬件 演奏電路 基本 原理 硬件電路 的發(fā)聲原理 , 聲音的頻 譜范圍約在幾十到幾千赫茲,若能利用程序來(lái)控制FPGA 芯片 某個(gè)引腳輸出一定頻率的矩形波,接上揚(yáng)聲器就能發(fā)出相應(yīng)頻率的聲音。樂(lè)曲都是由一連串的音符組成,因此按照樂(lè)曲的樂(lè)譜依次輸出這些音符所對(duì)應(yīng)的頻,就可以在揚(yáng)聲器上連續(xù)地發(fā)出各個(gè)音符的音調(diào)。 河南機(jī)電高等??茖W(xué)校課程設(shè)計(jì)論文 《 VHDL 硬件語(yǔ)言》課程設(shè)計(jì)論文 ( 2) 音符頻率的獲得 多個(gè)不同頻率的信號(hào)可通過(guò)對(duì)某個(gè)基準(zhǔn)頻率進(jìn)行分頻器獲得。若基準(zhǔn)頻率過(guò)低,則分頻系數(shù)過(guò)小,四舍五入取整后的誤差較大。實(shí)際上應(yīng)該綜合考慮這兩個(gè)方面的因素,在盡量減少誤差的前提下,選取合適的基準(zhǔn)頻率。由于現(xiàn)有的高頻時(shí)鐘脈沖信號(hào)的頻率為 12MHz,故需先對(duì)其進(jìn)行 16分頻,才能獲得 750KHz 的基準(zhǔn)頻率。為提高輸出信號(hào)的驅(qū)動(dòng)能力,以使揚(yáng)聲器有足夠的功率發(fā)音,需要再通過(guò)一個(gè)分頻器將原來(lái)的分頻器的輸出脈沖均衡為對(duì)稱方波(占空比 =1/2),但這時(shí)的頻率將是原來(lái)的 1/2。由于最大分頻系數(shù)是 1274,故分頻器采用 11位二進(jìn)制計(jì)數(shù)器能滿足要求,樂(lè)曲中的休止符,只要將分頻系數(shù)設(shè)為 0,即初始值 =2111=2047,此時(shí)揚(yáng)聲器不會(huì)發(fā)聲。 計(jì)數(shù)時(shí)鐘信號(hào)作為輸出音符快慢的控制信號(hào),時(shí)鐘快時(shí)輸出節(jié)拍速度就快,演奏的速度也就快,時(shí)鐘慢時(shí)輸出節(jié)拍的速度就慢,演奏的速度自然降低。當(dāng)一個(gè) 4Hz 的時(shí)鐘來(lái)時(shí),相應(yīng)地就從LPMROM 中輸出一個(gè)音符數(shù)據(jù)。 曲子也就流暢的播放出來(lái)了 , 當(dāng)樂(lè)曲一遍演奏完成后,樂(lè)曲發(fā)生器能自動(dòng)從頭開(kāi)始循環(huán)演奏 ,按下 SEL 鍵時(shí)播放第二首歌,按下 RST 鍵時(shí) 從頭開(kāi)始 播放歌曲。 硬件演奏電路頂層設(shè)計(jì) USE 。 音調(diào)頻率信號(hào) CLK8HZ : IN STD_LOGIC。音樂(lè)選擇鍵 RST : IN STD_LOGIC。 簡(jiǎn)譜碼輸出顯示 HIGH1 : OUT STD_LOGIC。聲音輸出 END。 SEL : IN STD_LOGIC。 ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) )。 COMPONENT ToneTaba元件 U2 例換化 PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) 。 HIGH : OUT STD_LOGIC。 END COMPONENT。 Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0)。 END COMPONENT。 SIGNAL ToneIndex : STD_LOGIC_VECTOR (3 DOWNTO 0)。參數(shù)傳遞映射語(yǔ)句 u2 : ToneTaba PORT MAP(Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH1)。 END。 h 0 1 cl kSELR S TT o n e I n d e x [ 3 . . 0 ]co m b ~ [ 7 . . 0 ]co m b ~ [ 1 5 . . 8 ]C o u n t e r[ 7 . . 0 ] 3. 單元模塊程序設(shè)計(jì) 根據(jù)頂層原理圖,共分為 music 模塊、地址發(fā)生器模塊、分頻預(yù)置數(shù)模塊、十六進(jìn)制模塊、數(shù)控分頻模塊這五個(gè)模塊。數(shù)控分頻模塊根據(jù)分頻預(yù)置數(shù)輸出各個(gè)音符所對(duì)應(yīng)的頻率。音樂(lè)節(jié)拍和音調(diào)發(fā)生器模塊 USE 。 ENTITY NoteTabs IS PORT ( clk : IN STD_LOGIC。音樂(lè)選擇鍵 RST : IN STD_LOGIC。 END。 clock : IN STD_LOGIC 。 END COMPONENT。8位二進(jìn) 制計(jì)數(shù)器 BEGIN CNT8 : PROCESS(clk, Counter,sel,rst) BEGIN IF ((clk39。139。039。Counter =Counter+1。 IF ((clk39。139。039。Counter =Counter+1。 END PROCESS。 END。每來(lái)一個(gè)時(shí)鐘脈沖信號(hào) (Clk), 8位二進(jìn)制計(jì)數(shù)器就計(jì)數(shù)一次, ROM 文件中的地址也就隨著遞增,音符數(shù)據(jù) ROM 中的音符也就一個(gè)接一個(gè)連續(xù)的取出來(lái)了。例如,地址發(fā)生器在以下的 VHDL 邏輯描述中,“梁祝”樂(lè)曲的第一個(gè)音符為“ 3”,此音在邏輯中停留了 4個(gè)時(shí)鐘節(jié)拍,即 1秒時(shí)間。這樣梁祝樂(lè)曲中的音符就一個(gè)接一個(gè)的通過(guò) toneindex[3..0]端口輸向分頻預(yù)置數(shù)模塊。它提供了每個(gè)音符所對(duì)應(yīng)的分頻預(yù)置數(shù),即給數(shù)控分頻模塊提供計(jì)數(shù)初值,這里以“梁祝”樂(lè)曲為例,列出了在這個(gè)樂(lè)曲中所用到的 13 個(gè)音符的分頻預(yù)置數(shù)。這 13個(gè)值的輸出由程序 [3]的 4位輸入值 index[3..0]確定。 模塊的功能是輸出各個(gè)音符所對(duì)應(yīng)的分頻預(yù)置數(shù), 即 當(dāng) index 是“ 0000”, tone輸出為 2047,即休止符的分頻預(yù)置數(shù);當(dāng) index 是“ 0101”時(shí), tone 輸出為 1197即低音 5 的分頻預(yù)置數(shù);當(dāng) index 是“ 1111”時(shí), tone 輸出為 1728 即高音 1的分頻預(yù)置數(shù)等等其它狀態(tài)時(shí), tone 分別輸出 相應(yīng)音符的分頻預(yù)置數(shù)。音樂(lè)譜對(duì)應(yīng)分頻預(yù)制數(shù)查表電路模塊 USE 。4 位 預(yù)制數(shù)查表 CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) 。音樂(lè)高 8 度 指示 Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0) )。 ARCHITECTURE one OF ToneTaba IS BEGIN Search : PROCESS(Index) BEGIN CASE Index IS 譯碼電路,查表方式,控制音調(diào)的預(yù)置數(shù) 13組頻率 WHEN 0000 = Tone=11111111111 。 HIGH =39。 2047 WHEN 0001 = Tone=01100000101 。 HIGH =39。 773。 CODE=0010。039。 WHEN 0011 = Tone=10000001100 。 HIGH =39。1036。 CODE=0101。039。 WHEN 0110 = Tone=10100001010 。 HIGH =39。1290。 CODE=0111。039。 WHEN 1000 = Tone=10110000010 。 HIGH =39。1410。 CODE=0010。139。 河南機(jī)電高等??茖W(xué)校課程設(shè)計(jì)論文 《 VHDL 硬件語(yǔ)言》課程設(shè)計(jì)論文 S pe ak erain s tc lkT on e[ 10 . . 0]S pk SDE N AQP R EC L RA [ 3 . . 0 ]B [ 3 . . 0 ]O U T [ 3 . . 0 ]A D D E RA [ 1 0 . . 0 ]B [ 1 0 . . 0 ]O U T [ 1 0 . . 0 ]A D D E RA [ 1 1 . . 0 ]B [ 1 1 . . 0 ]O U T