【正文】
83。 22 基于 FPGA 音樂硬件演奏電路設計 I 摘 要 根據國家教委與專業(yè)教學委員會對教育機構的要求,為培養(yǎng)適應我國 21 世紀國民經濟發(fā)展需要的電子設置人才;同時基于國家教委面向 21 世紀電工電子課程體系改革和電工電子工科教學基地建設兩項教學改革研究成果。要求高等??茖W校學生能夠自己動 手完成簡單數字器件的設計。這不但反應了我國當前在電子電路的實驗教學體系、內容和方法上的改革思路和教學水平的提高,更重要的是在加強以傳統(tǒng)電子設計方法為基礎的工程設計訓練的同時,使學生能夠盡快掌握現代電子設計自動化技術的新方法、新工具和新手段系統(tǒng)的、科學的培養(yǎng)了學生的實際動手能力、理論聯系實際的能力、工程設計能力,創(chuàng)新能力,提高了學生對基礎實驗的興趣。 本 次設計 在 EDA 開發(fā)平臺 QUARTUS II 上利用 VHDL 語言設計數控分頻器電路,利用數控分頻的原理設計音樂硬件演奏電路,并定制 LPMROM 存儲音樂數 據,以 “梁祝 ”和 “月亮代表我的心 ”兩首 樂曲為例,將音樂數據存儲到 LPMROM,就達到了以純硬件的手段來實現樂曲的演奏效果。只要修改 LPMROM 所存儲的音樂數據,將其換成其他樂曲的音樂數據,再重新定制 LPMROM,連接到程序中就可以實現其它樂曲的演奏。 本設計采用的是 武漢理工大學 的 開放設計 實驗 箱 , FPGA 目標芯片型號為 Altera 公司的 Cyclone 系列中 的 EP1C3T144C8N。芯片配置成功后即可進行硬件測試:選擇實驗電路結構圖,發(fā)音輸出接 SPEAKER,當樂曲一遍演奏完成后,樂曲發(fā)生器能自動從頭開 始循環(huán)演奏。 關鍵詞 : FPGA/CPLD, 音樂硬件演奏電路 , VHDL 語言設計 , QUARTUS II 基于 FPGA 音樂硬件演奏電路設計 1 1 系統(tǒng)設計總述 設計要求 這是一種運用純硬件實現樂曲播放的電路,比運用微處理器實現樂曲播放 更加復雜。它運用 了 強大功能的 EDA 工具 —— 開放設計試驗箱和硬件描述語言 VHDL。 本課題以歌曲《媽媽的吻》來實現樂曲播放電路的功能。 ( 1)順序播放樂曲 功能 :當電路開始工作時,如果 存儲器中有多首樂曲,那么 演奏電路 將從頭到尾順序播放這些樂曲。 ( 2) 循環(huán)播放樂曲功能 : 當演奏完后一首樂曲時, 將自動返回到第 一首歌曲開始播放,反復不止,直到關閉電源電路停止工作為止。 ( 3) 樂曲簡譜顯示功能 : 當演奏電路播放樂曲時,能夠將當前播放的音符 通過一列發(fā)光二極管 以 二進制的形式予以顯示。 ( 4) 樂曲高音顯示功能 : 如果電路正在播放 高音音符,那么將有一個發(fā)光二極管點亮來顯示。 ( 5) 音量大小可調功能 : 運 用 EDA 實驗箱上的數字功率放大器 LM386N, 對 數控分頻器 輸出的 音頻 信號予以處理,輸出大小連續(xù)可調的 音頻信號到揚聲器。 系統(tǒng)組成 ( 1) 音樂 硬件 演奏電路 基本 原理 硬件電路的發(fā)聲原理 , 聲音的頻譜范圍約在幾十到幾千赫茲,若能 利用程序來控制FPGA 芯片 某個引腳輸出一定頻率的矩形波,接上揚聲器就能發(fā)出相應頻率的聲音。樂曲中的每一音符對應著一個確定的頻率,要想 FPGA 發(fā)出不同音符的音調,實際上只要控制它輸出相應音符的頻率即可。樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些音符所對應的頻,就可以在揚聲器上連續(xù)地發(fā)出各個音符的音調。而要準確地演奏出一首樂曲,僅僅讓揚聲器能夠發(fā)生是不夠的,還必須準確地控制樂曲的節(jié)奏,即樂曲中每個音符的發(fā)生頻率及其持續(xù)時間是樂曲能夠連續(xù)演奏的兩個關鍵因素。 ( 2) 音符頻率的獲得 多個不同頻率的信 號可通過對某個基準頻率進行分頻器獲得。由于各個音符的頻率多為非整數,而分頻系數又不能為小數,故必須將計算機得到的分頻系數四舍五入取整。若基準頻率過低,則分頻系數過小,四舍五入取整后的誤差較大。若基準頻率過高,雖然可以減少頻率的相對誤差,但分頻結構將變大。實際上應該綜合考慮這兩個方面的因素,在盡量減少誤差的前提下,選取合適的基準頻率。本 設計 中選取 750KHz 的基準頻率。由于現有的高頻時鐘脈沖信號的頻率為 12MHz,故需先對其進行 16 分頻,才能獲得 750KHz基于 FPGA 音樂硬件演奏電路設計 2 的基準頻率。對基準頻率分頻后的輸出信號是一些脈寬極窄 的尖脈沖信號(占空比 =1/分頻系數)。為提高輸出信號的驅動能力,以使揚聲器有足夠的功率發(fā)音,需要再通過一個分頻器將原來的分頻器的輸出脈沖均衡為對稱方波(占空比 =1/2),但這時的頻率將是原來的 1/2。 下 表中各音符的分頻系數就是從 750KHz 的基準頻率二分頻得到的 375KHz 頻率基礎上計算得到的 。 由于最大分頻系數是 1274,故分頻器采用 11 位二進制計數器能滿足要求,樂曲中的休止符,只要將分頻系數設為 0,即初始值 =2111=2047,此時揚聲器不會發(fā)聲。 基于 FPGA 音樂硬件演奏電路設計 3 表 1 各個音符的頻率及其對應的分頻系數(基準頻率 375KHz) 音符名 頻 率 (Hz) 分頻系數 計數初值 音符名 頻率 (Hz) 分頻系數 計數初值 休止符 375000 0 2047 中音 4 468 1579 低音 1 1274 773 中音 5 425 1622 低音 2 1135 912 中音 6 379 1668 低音 3 1011 1036 中音 7 330 1717 低音 4 970 1077 高音 1 319 1728 低音 5 950 1197 高音 2 277 1770 低音 6 757 1290 高音 3 248 1799 低音 7 675 1372 高音 4 233 1814 中音 1 637 1410 高音 5 208 1839 中音 2 587 1480 高音 6 185 1862 中音 3 505 1542 高音 7 165 1882 ( 3) 樂曲節(jié)奏的控制 本 設計 中的梁祝 和月亮代表我的心的 樂曲,最小的節(jié)拍為 1/4 拍,若將 1 拍的時間定為 1 秒,則只需要提供一個 4Hz 的時鐘頻率即可產生 1/4 拍的時長( 秒),對于其它占用時間較長的節(jié)拍(必為 1/4 拍的整數倍)則只需要將該音符連續(xù)輸出相應的次數即可。 計數時鐘信號作為輸出音符快慢的控制信號,時鐘快時輸出節(jié)拍速度就快,演奏的速度也就快,時鐘慢時輸出節(jié)拍的速度就慢,演奏的速度自然降低。 ( 4) 樂譜發(fā)生器 本文將樂譜中的音符數據存儲在 LPMROM 中,如 “梁祝 ”樂曲 中的第一個音符為 “3”,此音在邏輯中停留了 4 個時鐘節(jié)拍,即 1 秒的時間,相應地,音符 “3”就要在 LPMROM中連續(xù)的四個地址上都存儲。當一個 4Hz 的時鐘來時,相應地就從 LPMROM 中輸出一個音符數據。 ( 5) 音樂 硬件 演奏電路 總體設計流程 當一個 4Hz 的時鐘脈沖來到時,樂譜發(fā)生器模塊輸出一個音符數據給分頻系數模塊,分頻系數模塊輸出此音符相應的分頻系數,將分頻系數送給數控分頻器模塊,當 12MHz的時鐘脈沖來到時,數控分頻器就根據分頻系數輸出相應的頻率 (即此音符所對應的發(fā)生頻率 )給揚聲器,揚聲器就可發(fā)出對應音符 的聲音來 .連續(xù)的 4Hz 的時鐘脈沖就將樂譜發(fā)生器里所存儲的音符數據一個接一個的送給了分頻系數模塊,再經過數控分頻模塊 ,最后揚聲器一個接一個的發(fā)出音符數據所對應的聲音來 。 曲子也就流暢的播放出來了 , 當樂曲一遍演奏完成后,樂曲發(fā)生器能自動從頭開始循環(huán)演奏,按下 SEL 鍵時播放第二首歌,按下 RST鍵時從頭開始播放歌曲。 音樂硬件演奏電路主要是用 VHDL 語言來設計,并利用 軟件工具來編譯、測試和仿真 , 音樂 硬件 演奏電路 設計總體設計方框圖如下圖所示 。 基于 FPGA 音樂硬件演奏電路設計 4 R S TSELcl kT o n e I n d e x [ 3 . . 0 ] I n d e x [ 3 . . 0 ]H I G HC O D E [ 3 . . 0 ]T o n e [ 1 0 . . 0 ]cl kT o n e [ 1 0 . . 0 ]S p k SC O D E1 [ 3 . . 0 ]SPK O U TC L K1 2 M H ZSELR STN o t e T a b s : u 1C L K8 H ZT o n e T a b a : u 2 Sp e a ke ra : u 3H I G H 1 圖 音樂 硬件 演奏電路 設計總體設計方框圖 基于 FPGA 音樂硬件演奏電路設計 5 2 總體程序設計 頂層模塊設計流程圖 R S TSELcl kT o n e I n d e x [ 3 . . 0 ] I n d e x [ 3 . . 0 ]H I G HC O D E [ 3 . . 0 ]T o n e [ 1 0 . . 0 ]cl kT o n e [ 1 0 . . 0 ]S p k SC O D E1 [ 3 . . 0 ]SPK O U TC L K1 2 M H ZSELR STN o t e T a b s : u 1C L K8 H ZT o n e T a b a : u 2 Sp e a ke ra : u 3H I G H 1 圖 頂層模塊設計流程圖 頂層電路 VHDL 程序設計 LIBRARY IEEE。 硬件演奏電路頂層設計 USE 。 ENTITY Songer IS PORT ( CLK12MHZ : IN STD_LOGIC。 音調頻率信號 CLK8HZ : IN STD_LOGIC。 節(jié)拍頻率 用于控制音長(節(jié)拍)的時鐘頻率; SEL : IN STD_LOGIC。音樂選擇鍵 RST : IN STD_LOGIC。復位鍵 CODE1 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)。 簡譜碼輸出顯示 HIGH1 : OUT STD_LOGIC。 高 8 度指示 SPKOUT : OUT STD_LOGIC )。聲音輸出 END。 ARCHITECTURE one OF Songer IS COMPONENT NoteTabs元件 U1 例換化 PORT ( clk : IN STD_LOGIC。 SEL : IN STD_LOGIC。 RST : IN STD_LOGIC。 ToneIndex : 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。 基于 FPGA 音樂硬件演奏電路設計 6 COMPONENT Speakera元件 U3 例換化 PORT ( clk : IN STD_LOGIC。 Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0)。 SpkS : OUT STD_LOGIC )。 END COMPONENT。 SIGNAL Tone : STD_LOGIC_VECTOR (10 DOWNTO 0)。 SIGNAL ToneIndex : STD_LOGIC_VECTOR (3 DOWNTO 0)。 BEGIN u1 : NoteTabs PORT MAP (clk=CLK8HZ,RST=RST,SEL=SEL, ToneIndex=ToneIndex)。參數傳遞映射語句 u2 : ToneTaba PORT MAP(Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH1)。 u3 : Speakera PORT MAP(clk=CLK12MHZ,Tone=Tone, SpkS=SPKOUT)。 END。 基于 FPGA 音樂硬件演奏電路設計 7 3 單元模塊程序設計 根據頂層原理圖,共分為 music 模塊、地址發(fā)生器模塊、分頻預置數模塊、十六進制模塊、數控分頻模塊這五個模塊。 music 模塊存放樂曲中的音符數據,地址發(fā)生器模塊作為 music 模塊中所定制的音符數據 ROM 的地址發(fā)生器,分頻預置數模塊提供分頻預置數即給數控分頻模塊提供 計數初值,十六進制模塊對 12MHz 的時鐘脈沖進行 16 分頻,得到750KHz 的頻率,給數控分頻模塊提供時鐘脈沖。數控分頻模塊根據分頻預置數輸出各個音符所對應的頻率。 音樂節(jié)拍和音調發(fā)生器模塊 N ot eT absins tc lkSELR STT oneI ndex [ 3. . 0] 圖 音樂節(jié)拍和音調發(fā)生器模塊 (1) 音樂節(jié)拍和音調發(fā)生器模塊 RTL 電路圖 cl o cka d d r e ss [ 7 . . 0 ]q [ 3 . . 0 ]A [ 7 . . 0 ]B [ 7 . . 0 ]O U T [ 7 . . 0 ]A D D E RD QP R EE N AC L RSELD A T A AD A T A BO U T 0M U X 2 1SELD A T A AD A T A BO U T 0M U X 2 1m u s i c: u 1A d d 08 39。 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 ] 圖 音樂節(jié)拍和音調發(fā)生器模塊 RTL電路圖 (2) 音樂節(jié)拍和音調發(fā)生器模塊 VHDL