摘要:
FPGA是現(xiàn)場可編程門陣列的簡稱, 它既有門陣列器件的高度集成和通用性, 又有可編程邏輯器件用戶可編程的靈活性。通過 FPGA實現(xiàn)音樂流水燈的控制, 實質(zhì)上就是將不同音階與特定頻率的方波信號對應(yīng)起來, 以方波信號驅(qū)動蜂鳴器發(fā)出音樂, 再根據(jù)不同音階來控制流水燈的閃爍,。與借助微處理器實現(xiàn)樂曲演奏相比, 以純硬件方式完成樂曲演奏電路更直觀,。EDA工具和硬件描述語言發(fā)揮了強大功能,提供了設(shè)計可能性。
1,、總體設(shè)計方案
音樂流水燈主要是點綴公共場合的裝飾品, 音樂的播放和流水燈有節(jié)奏地閃爍, 同時達到聽覺和視覺的完美結(jié)合, 成為構(gòu)成其必不可少的條件,。要了解如何產(chǎn)生不同音階的音樂, 首先要對樂音的特性有所了解。樂音實際上是有固定頻率的信號,。在樂曲的構(gòu)成中, 樂音的頻率和持續(xù)的時間是其構(gòu)成的要素,。音階的頻率可以通過高頻時鐘進行分頻得到。音頻的高低可以通過外部的 LED燈的閃爍來顯示, 這樣在音樂和流水燈的配合下可以使人產(chǎn)生強烈的節(jié)奏感,。再輔以 LCD來顯示音階的高低長短, 不懂樂理知識的人便可以直觀的看到不同音調(diào)對應(yīng)的音階。
總體設(shè)計要求如下:
( 1)分頻主要是通過一個可控分頻器實現(xiàn)的,。采用時鐘的頻率越高, 分頻系數(shù)越大, 分頻后的音階頻率就越準確,。但同時由于分頻系數(shù)大使用的計數(shù)單元增加, 從而耗費更多的硬件邏輯單元, 因此可以采取一個較為適中的時鐘頻率 12MH z 。
( 2)經(jīng)過分頻后的信號是一個脈寬極窄的時鐘信號, 必須對其進行脈沖寬度調(diào)整, 增大占空比, 才能有效地驅(qū)動蜂鳴器,。在脈沖寬度調(diào)整時會對此信號再次二分頻, 所以在計算時, 以樂音音階的二倍頻率去求取在特定時鐘信號下的分頻系數(shù), 以便在調(diào)整占空比后得到正確的音階頻率,。
( 3)樂曲的頻率變化多端, 對應(yīng)的分頻系數(shù)也不斷變化, 因此需要將播放的樂曲的分頻系數(shù)事先存放在 ROM 中便于讀取。如果將分頻系數(shù)直接作為存儲碼存放在寄存器中, 勢必會占有更大的容量,。因此在這里選取索引值來作為存儲碼以減小容量,。
( 4)開發(fā)平臺上的 LED燈數(shù)量有限, 可以選用有規(guī)律的閃爍, 例如從左到右依次點亮、漸亮,、漸滅等; 也可以用燈閃爍的多少來表示頻率的大小,。本設(shè)計選用第二種。
圖 1為音樂流水燈控制系統(tǒng)的總原理框圖,??梢钥吹皆撓到y(tǒng)包含樂曲播放控制模塊, 流水燈控制模塊和 LCD顯示模塊 3個模塊。其中樂曲播放控制模塊分為樂譜播放控制模塊, 音階分頻模塊和音階頻率產(chǎn)生模塊,。
圖1 音樂流水燈控制系統(tǒng)的總體原理框圖
2,、 模塊設(shè)計
2.1 、樂曲播放控制模塊
樂曲播放控制模塊的主要功能是在一定的時鐘信號驅(qū)動下將事先存儲在 ROM 里的樂譜所對應(yīng)的索引值依次輸出, 控制分頻, 并產(chǎn)生相應(yīng)的分頻信號頻率, 以此來控制蜂鳴器的發(fā)聲,。
2.1.1,、音階分頻器的設(shè)計
為了能夠在播放樂曲的同時顯示當前音階, 用LED的位數(shù)來指示當前音階的高低音。程序中的音階分頻系數(shù)通過索引值來進行選取, 即在音樂播放過程中由樂譜存儲電路傳遞來的當前音階的索引值,。
2.1.2 ,、音階頻率產(chǎn)生的設(shè)計
音階頻率產(chǎn)生電路在獲取上面的音階索引值對應(yīng)的分頻系數(shù)后, 通過可控計數(shù)器進行分頻。分頻電路中的計數(shù)器進行減 1計數(shù), 計數(shù)器的進位信號即為分頻信號,。因為此信號的脈沖寬度極小, 所以需要調(diào)整占空比才使外部驅(qū)動電路提供足夠的驅(qū)動蜂鳴器的功率, 而具體是對分頻信號再進行二分頻實現(xiàn)的,。
2.1.3,、 樂譜播放控制模塊設(shè)計
音樂播放就是通過外部的 8 H z時鐘驅(qū)動, 內(nèi)部以計數(shù)器進行計數(shù)、產(chǎn)生地址, 送到 ROM 單元中作為存儲器地址, 將對應(yīng)地址的數(shù)據(jù) 音階索引值輸出,。
在本設(shè)計中, 每個音的發(fā)出由另一個 8H z的時鐘信號來控制,。樂譜中的 4分音符由 4個時鐘信號來驅(qū)動。每個時鐘下, 其對應(yīng)的音階輸出以索引值的形式存儲在 ROM中,。文中 ROM 的地址線為 10位, 數(shù)據(jù)線寬度為 4位,。ROM 里存儲的數(shù)據(jù)即各音節(jié)的索引值, 根據(jù)樂譜轉(zhuǎn)換的需要, 16個索引值即可滿足樂曲曲譜編寫的需求, 所以設(shè)置了 4位數(shù)據(jù)線。地址線的寬度主要取決于樂曲的長度,。本設(shè)計中用到了約520個 4 bit單元, 為了留有一定裕度, 將數(shù)據(jù)線寬度定義為 10位, 即 1 024個 4 b i t單元,。其中不同的音階對應(yīng)的索引值如表 1所示。
表 1 音階索引表
按照樂譜, 將音階對應(yīng)的索引值連續(xù)地存儲到ROM中,。例如, 樂譜上一個 4分音符的中音 3 , 在ROM存儲器中對應(yīng)的索引值是 10 , 并且連續(xù)放置 4次, 而一個 8分音符 5也就是半拍的 5 , 則是將對應(yīng)索引值 5在 ROM 中連續(xù)存放兩次,。播放時在播放時鐘( 8H z )的驅(qū)動下, 索引值不斷地從 ROM 輸出。索引值送到音階分頻模塊中, 轉(zhuǎn)換為計數(shù)初值輸出, 再送到音階分頻產(chǎn)生模塊中, 作為計數(shù)初值, 產(chǎn)生音階頻率輸出驅(qū)動蜂鳴器,。這樣, 就能在蜂鳴器上發(fā)出要播放的樂曲了,。確定了樂譜后, 即 ROM 的存儲內(nèi)容后, 就可以定制 ROM, 將其初始化文件指定為mif文件即可。
2.2,、流水燈控制模塊設(shè)計
由于此設(shè)計是基于 DE270開發(fā)板之上的, 因此將對應(yīng)的音階輸出, 應(yīng)用 LED燈來顯示流水燈閃爍效果,。根據(jù)音調(diào)"hight"的高低設(shè)置點亮燈的數(shù)量,當"hight "為低時播放低音信號, 為高時播放中音信號。如果要用到高音信號可以將! hight!長度改為 2bit ,。選取板上的 oLEDR [ 6..0]前 7盞燈與低音信號對應(yīng), oLEDR[ 13..7]與中音信號對應(yīng),。在本設(shè)計中,為了看到明顯的流水燈變化, 當發(fā)出中音音頻時低音顯示燈全亮。
2.3,、 LCD顯示模塊設(shè)計
首先需要在 SOPC Builder中構(gòu)建 SOPC系統(tǒng), 按要求依次添加 NiosII處理器, 4 kB的片上 RAM, LCD模塊, 4位輸入口, 給處理器分配復位向量地址和異常向量地址,。
LCD顯示模塊用來實現(xiàn)樂譜和音頻強度的實時顯示, 可以顯示 16 ? 2個字符, 其軟件流程如圖 2所示。
圖 2 LCD軟件流程圖
其中 LCD初始化包括對 LCD的功能設(shè)置, 顯示開關(guān)設(shè)置和模式設(shè)置,。LCD定位到首行首列是通過對LCD寫定位指令, 將顯示位置確定到第一行第一列,。寫字符" jian pu"到第一行是通過寫數(shù)據(jù)指令將字符jian pu : 和實時變化的樂譜顯示在液晶屏的第一行。
低,、中,、高音分別用 L、M,、H表示并且加上對應(yīng)的音階值進行顯示,。LCD顯示換行是通過定位指令來實現(xiàn)的。顯示音頻強度到第二行是用符號# > !的個數(shù)表示音調(diào)的高低, 一個表示低音 1 , 兩個表示低音 2 ,依次類推,。
在對 LCD模塊進行顯示控制時, 用到了寫控制命令和寫數(shù)據(jù)命令,。這些命令是針對具體配置的硬件電路而編寫的 .h頭文件。LCD模塊的頭文件如下:
#definelcd_write_cmd(base,data)
IOWR(base,0,data)
#definelcd_read_cmd(base)
IORD(base,1)
#definelcd_write_data(base,data)
IOWR(base,2,data)
#definelcd_read_data(base)
IORD(base,3)
這樣編寫是為了和具體的硬件電路相對應(yīng), 在LCD模塊的硬件描述語言中, 液晶模塊 RW 和 RS的地址分配如下:
assi gn LCD_ RW = address[ 0]
assi gn LCD_ RS = address[ 1]
其中 RS信號是命令與數(shù)據(jù)線, 高電平表示目前數(shù)據(jù)線上交換的是數(shù)據(jù), 低電平表示目前數(shù)據(jù)線上交換的是命令。液晶模塊根據(jù)這個信號做出正確的響應(yīng),。RW 是電平信號, 高電平表示對液晶模塊執(zhí)行讀取操作, 低電平表示對液晶模塊寫入數(shù)據(jù)或命令,。這樣便可以確定各讀寫操作對應(yīng)于基地址的偏移量。
3,、 頂層設(shè)計和驗證
系統(tǒng)的頂層設(shè)計就是將各個底層功能模塊例化,在頂層調(diào)用, 進行正確的連接, 構(gòu)成最后的系統(tǒng),。整個系統(tǒng)的硬件電路如圖 3所示。
圖3 系統(tǒng)硬件電路
至此, 一個硬件音樂流水燈電路就完成了,。外部提供兩路時鐘信號( 12MH z和 8 Hz) , 再將樂曲輸出端連接到帶有驅(qū)動裝置的蜂鳴器或揚聲器上, 就可以欣賞所添加的樂曲了,。若硬件設(shè)計上只有一路時鐘信號輸入, 可在 FPGA 內(nèi)部設(shè)計分頻器, 將其分頻到8H z 再使用, 還可以在此基礎(chǔ)上更改。另外還可以在一個 ROM 種存儲多首樂曲, 通過按鍵選擇播放樂曲,。
3,、 結(jié)束語
文中在 FPGA芯片上, 利用 VHDL語言設(shè)計了功能強大的 32位 ALU。由于 ALU是 CP U的重要組成部分, 各類系統(tǒng)中都不可避免地需要 ALU, 因此本設(shè)計的應(yīng)用泛圍較廣,。