【正文】
543:6。 539:7。 535:9。 531:6。 527:6。 523:9。 519:10。 515:7。 511:10。 507:7。 503:9。 500:2。 496:2。 492:2。 488:6。 484:3。 480:5。 476:9。 472:5。難忘懷, 468:2。 464:3。 460:5。 456:7。過去的時光難忘懷, 452:6。 448:3。 444:6。 440:5。白發(fā)鬢鬢 436:2。 432:2。 428:2。 424:5。我那親愛的媽媽已 420:6。 416:3。 412:6。 408:7。小呀小山村, 404:5。 400:6。 396:6。 392:7。在那遙遠的小山村, 388:5。 384:2。 380:5。 376:7。第四拍 372:5。 368:2。 364:2。 360:4。 356:1。 352:3。 348:6。 344:7。 340:10。 336:2。 332:6。 328:6。 324:9。 320:5。第一拍 316:2。 312:7。 308:7。 304:10。 300:2。 297:2。 293:2。 289:3。 285:6。媽媽的吻,甜蜜的吻; 281:6。 277:3。 273:6。 269:9。 265:10。 262:2。 258:2。 254:5。 250:6。 246:3。 242:7。 238:9。 基于 FPGA 音樂硬件演奏電路設(shè)計 30 234:10。 230:6。 226:6。 222:9。 218:10。 214:7。 210:10。 206:7。 202:9。 199:2。 195:2。 191:2。 187:6。 183:3。 179:5。 175:9。 171:5。難忘懷 167:2。 163:3。 159:6。 155:6。懷 151:6。 147:3。 143:6。 139:5。白發(fā)斑斑 135:2。 131:2。 127:5。媽已 123:6。 119:3。 115:6。 111:7。小呀小山村 107:5。 103:6。 99:6。 95:7。村 91:5。 87:2。 83:5。 79:7。第一段 75:5。 71:2。 67:2。 63:4。 59:1。 55:3。 51:6。 47:7。 43:10。 39:2。 35:6。 31:6。 27:9。 23:5。 19:2。 15:7。 11:7。 07:10。 03:3。 Data_radix=dec。 end beha。039。139。event and speaks=39。 speaks=q2(21)。)。event and clk0=39。 signal speaks:std_logic。 clkout :out std_logic)。 基于 FPGA 音樂硬件演奏電路設(shè)計 22 參考文獻 [1] 潘松. EDA 技術(shù)實用教程.北京:科學(xué)教育出版社 .2020 [2] Quartus Semiconductor data books. Quartus Semiconductor Corporation. 2020 [3] 杭州康芯電子有限公司 . GW48PK3 實驗系統(tǒng)說明書 . 杭州康芯電子有限公司 . 2020 基于 FPGA 音樂硬件演奏電路設(shè)計 23 附錄 1 音樂演奏電路 VHDL源程序 程序 1: 4Hz 時鐘發(fā)生器模塊程序 CLK4Hz library ieee。 End。139。139。139。139。139。139。139。139。139。139。139。139。139。139。039。039。039。039。039。039。039。039。音樂符對應(yīng)分頻 11 位 End。 Entity toaba is Port( index : in std_logic_vector(4 downto 0)。 在前面的 VHDL 設(shè)計中,我們只能通過程序輸出 “梁祝 ”曲子中的 13 個音符的分頻預(yù)置數(shù)(即計數(shù)初值),但是在其它的樂曲中可能會用到另外的那些音符,因此對程序進行修改完善它的功能,使其能輸出另外那些音符的分頻預(yù)置數(shù)。由表中可知高音 1 的分頻系數(shù)為 319,即對輸入時鐘 Clk 進行 319 次分頻就可得高音 1 的發(fā)聲頻率,因此這個程序?qū)崿F(xiàn)了模塊的功能。 數(shù)控分頻模塊中對 Clk 輸入信號的分頻比由 11 位預(yù)置數(shù) tone[10..0]決定。此時從數(shù)控分頻器中出來的輸出信號是脈寬極窄的脈沖式信號,為了有利于驅(qū)動揚聲器,需另加一個 D 觸發(fā)器以均衡其占空比,這時的頻率就變?yōu)樵瓉淼?1/2,剛好就是相應(yīng)音符的頻率。 仿真結(jié)果如下圖: 圖 音樂節(jié)拍和音調(diào)模塊 NoteTabs 波形仿真 ToneTaba 分頻預(yù)置數(shù)查表模塊的仿真 (1) 波形仿真 將所編寫的分頻預(yù)置數(shù)查表模塊 ToneTaba的程序設(shè)為工程,選用 Altera公司的 Cyclone系列中的 EPIC12Q240C8 為目標芯片進行仿真。 BEGIN q = sub_wire0(3 DOWNTO 0)。 PORT ( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0)。 lpm_widthad : NATURAL。 q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0))。 定制好的 ROM 文件 VHDL 程序如下: LIBRARY ieee。 定制音符數(shù)據(jù)的 ROM 文件 : (1) 進入 QUARTUS||,選菜單 TOOLmegawizard plugin manager,選擇 “creat a new…” ,然后按 “next”鍵,選擇 LPMROM;最后在 browse 下的欄中鍵入路徑與輸出文件名 ,注意后綴 vhd 小寫。首先在 File 菜單下的 New 菜單上選擇 Text Editor File 命令,進入文本編輯器,然后輸入以上格式的數(shù)據(jù)文件。 Data_radix = dec。 END。039。139。EVENT AND FullSpkS = 39。 END IF。 ELSE Count11 := Count11 + 1。139。 END PROCESS。EVENT AND clk = 39。 將 CLK 進行 16 分頻, PreCLK 為 CLK 的 16 分頻 IF Count411 THEN PreCLK = 39。 ARCHITECTURE one OF Speakera IS SIGNAL PreCLK, FullSpkS : STD_LOGIC。 ENTITY Speakera IS PORT ( clk : IN STD_LOGIC。例如在分頻預(yù)置數(shù)模塊中若取 tone[10..0]=1036,將發(fā)出音符為 “3”音的信號頻率。 時鐘( Clk)端輸入的是在十六進制模塊里對 12MHz 的信號進行 16 分頻得到的750KHz, 750KHz 的信號根據(jù)分頻預(yù)置數(shù)模塊中所提供的計數(shù)初值,分別得出相應(yīng)音符頻率的兩倍值。在計數(shù)器的輸入端 給定不同的初值,而此預(yù)置數(shù)就是表 1 中的計數(shù)初值,就可得到不同音符的發(fā)音頻率信號。 h 0 0 1 C o u n t 1 1 ~[ 1 0 . . 0 ]L e s s T h a n 04 39。 音樂符數(shù)控 11 分頻電路模塊 音樂譜對應(yīng)分頻預(yù)置數(shù)查表電路模塊 (1) 音樂符數(shù)控 11 分頻電路模塊 S pe ak erain s tc lkT on e[ 10 ..0]S pk S 圖 音樂符數(shù)控 11 分頻電路模塊 (2) 音樂符數(shù)控 11 分頻電路模塊 RTL 電路圖 DE 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 TE Q U A LDE N AQP R EC L RA [ 3 . . 0 ]B [ 3 . . 0 ]O U TL E S S _ T H A NDE N AQP R EC L RD QP R EE N AC L RD QP R EE N AC L RSELD A T A AD A T A BO U T 0M U X 2 1\ D e l a y Sp kS : C o u n t 2 Sp kS ~re g 0cl kSp kST o n e [ 1 0 . . 0 ]F u l l Sp kS\ G e n Sp kS : C o u n t 1 1 [ 1 0 . . 0 ]Eq u a l 01 39。 WHEN OTHERS = NULL。 CODE=0001。 HIGH =39。139。1542。 WHEN 1010 = Tone=11000000110 。 CODE=0010。 HIGH =39。039。1290。 基于 FPGA 音樂硬件演奏電路設(shè)計 10 WHEN 0110 = Tone=10100001010 。 CODE=0101。 HIGH =39。039。 773。 2047 WHEN 0001 = Tone=01100000101 。 ARCHITECTURE one OF ToneTaba IS BEGIN Search : PROCESS(Index) BEGIN CASE Index IS 譯碼電路,查表方式,控制音調(diào)的預(yù)置數(shù) 13 組頻率 WHEN 0000 = Tone=11111111111 。4 位預(yù)制數(shù)查表 CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) 。 模塊的功能是輸出各個音符所對應(yīng)的分頻預(yù)置數(shù),即當 index 是 “0000”, tone 輸出為2047,即休止符的分頻預(yù)置數(shù);當 index 是 “0101”時, tone 輸出為 1197 即低音 5 的分頻預(yù)置數(shù);當 index 是 “1111”時, tone 輸出為 1728 即高音 1 的分頻預(yù)置數(shù)等 等其它狀態(tài)時,tone 分別輸出相應(yīng)音符的分頻預(yù)置數(shù)。它提供了每個音符所對應(yīng)的分頻預(yù)置數(shù),即給數(shù)控分頻模塊提供計數(shù)初值,這里以 “梁祝 ”樂曲為例,列出了在這個樂曲中所用到的 13 個音符的分頻預(yù)置數(shù)。例如,地址發(fā)生器在以下的 VHDL 邏輯描述中, “梁祝 ”樂曲的第一個音符為 “3”,此音在邏輯中停留了 4個時鐘節(jié)拍,即 1 秒時間。 END。Counter =Counter+1。139。Counter =Counter+1。139。 END COMPONENT。 END。 ENTITY NoteTabs IS PORT ( clk : IN STD_LOGIC。 音樂節(jié)拍和音調(diào)發(fā)生器模塊 N ot eT absins tc lkSELR STT oneI ndex [ 3. . 0] 圖 音樂節(jié)拍和音調(diào)發(fā)生器模塊 (1) 音樂節(jié)拍和音調(diào)發(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