劉 玲, 劉 新, 張鵬鳴
(1. 沈陽師范大學(xué) 物理科學(xué)與技術(shù)學(xué)院, 沈陽 110034;2. 中國科學(xué)院 近代物理研究所, 蘭州 730000)
現(xiàn)場可編程門陣列(Field Programmable Gate Arrays, FPGA)是一種可編程的電子器件[1], 可以利用硬件描述語言(Verilog或VHDL)改變內(nèi)部邏輯結(jié)構(gòu)來實現(xiàn)各種功能。與專用集成電路相比,FPGA具有速度快、串口多、邏輯簡單、開發(fā)周期短等優(yōu)勢[2-3]。它可以在EDA開發(fā)平臺中(如QUARTUS II)通過編程將芯片內(nèi)部的邏輯門連接成電路,仿真通過后將硬件邏輯輸出。這不僅能使設(shè)計的效率有所提高,而且還能降低外部印刷電路板的復(fù)雜性[4]。同時,FPGA技術(shù)在數(shù)據(jù)獲取、信號處理、智能通訊、航天軍工等領(lǐng)域都有廣泛應(yīng)用[5-9]。
近年來,人們對FPGA的設(shè)計研發(fā)產(chǎn)生了極大的興趣。Jin等[10]用基于FPGA的數(shù)據(jù)獲取系統(tǒng)實現(xiàn)了對環(huán)境信息和圖像數(shù)據(jù)的實時感知和獲取,建立了一種無線傳感器網(wǎng)絡(luò)節(jié)點的數(shù)字傳輸與處理系統(tǒng)。同時,Xu等[11]也通過FPGA技術(shù)改良了液晶觸摸屏,提高了幀數(shù)并降低了處理器負(fù)擔(dān)。此外,Arkani等[12]為分析隨機(jī)時間間隔脈沖的隨機(jī)過程,在FPGA設(shè)備上實現(xiàn)了一種雙通道時間分析器數(shù)據(jù)采集系統(tǒng)。由此可見,傳統(tǒng)的集成電路已經(jīng)不能適應(yīng)技術(shù)發(fā)展的要求,FPGA的應(yīng)用具有一定的實用價值。
現(xiàn)如今,由于電子產(chǎn)品在日常生活中占據(jù)很大比例,導(dǎo)致電子市場競爭也愈發(fā)激烈。為了更快地滿足用戶要求,縮短研發(fā)周期就顯得尤為重要。而FPGA恰恰能滿足這一要求,特別是它的可編程性能夠使產(chǎn)品具有很大的升級空間,不同于市面上流通的基于單片機(jī)的產(chǎn)品,一旦設(shè)計完成就不可更改,因此,應(yīng)用FPGA的產(chǎn)品更受歡迎。隨著生活水平提高,人們更加注重生活的品質(zhì),從美化城市的景觀燈,兒童手中的電子玩具,再到住宅中的各種智能家電,無一不體現(xiàn)出FPGA在市場經(jīng)濟(jì)中的巨大潛在價值。雖已有很多人研究了音樂流水燈和帶數(shù)碼管顯示的播放器[13],但對于音樂流水燈的研究,大都只能存放一首歌曲且無法控制流水燈的閃爍頻率,而對帶數(shù)碼管顯示的音樂播放器流水燈功能是如何設(shè)計的并不是十分清楚。因此,本文基于FPGA研發(fā)了一款電子產(chǎn)品----帶數(shù)碼管顯示的音樂流水燈。
本文詳細(xì)地介紹了如何用單一狀態(tài)機(jī)控制音樂、流水燈、數(shù)碼管3個模塊, 通過按鍵控制各個狀態(tài)之間的切換并在硬件上驗證成功。 此產(chǎn)品可以應(yīng)用在公共景觀設(shè)施、汽車外部裝飾及兒童玩具等領(lǐng)域。
人們對于音樂和美的熱愛是永不停歇的,音樂流水燈將視聽完美地結(jié)合起來,并可以根據(jù)個人的喜好自定義歌曲,通過數(shù)碼管上顯示的數(shù)字可以知道當(dāng)前是第幾首歌,燈光的閃爍頻率與歌曲切換都通過按鍵進(jìn)行操作,更顯人性化。圖1所示為帶數(shù)碼管顯示的音樂流水燈的總體設(shè)計思路圖,共4個部分,狀態(tài)機(jī)輸出信號并同時傳入LED模塊,蜂鳴器模塊以及數(shù)碼管模塊。
圖1 原理框圖Fig.1 The principle diagram
要想達(dá)到上述目標(biāo),需要注意以下幾點:
1) 本裝置所有模塊的控制是通過一個狀態(tài)機(jī)(Finite State Machine, FSM)實現(xiàn)的。當(dāng)條件被滿足的時候,狀態(tài)機(jī)就會從一個狀態(tài)轉(zhuǎn)為另一個狀態(tài);沒有條件被觸發(fā)的時候,會保持原有狀態(tài)不變。
2) 采用無源蜂鳴器,由于不帶振蕩源,直流信號無法令其鳴叫,因此只能用不同頻率的方波驅(qū)動它。AC620開發(fā)板上的晶振輸出時鐘頻率為50 MHz,根據(jù)每個音符對應(yīng)的頻率,利用公式求出對應(yīng)的預(yù)設(shè)值,再按照歌曲的音調(diào)順序,依次存入ROM中。
3) 由于AC620開發(fā)板上的led燈數(shù)量有限,因此采用不同的閃爍頻率來區(qū)分不同的歌曲。
改變計數(shù)器的分頻值可以改變LED燈閃爍的快慢,當(dāng)達(dá)到計數(shù)次數(shù)時輸出一個tick1信號給移位寄存器,從而使LED燈依次點亮。當(dāng)為第一首歌的時候,流水燈閃爍頻率為5 Hz; 當(dāng)前為第2首歌時,閃爍頻率為2.5 Hz。FPGA輸出低電平時,LED燈亮;輸出為高電平時,LED燈滅。
本設(shè)計采用的是無源蜂鳴器,需要用2~5 kHz的方波來驅(qū)動。要想使蜂鳴器發(fā)出不同的音調(diào),就是要改變蜂鳴器的驅(qū)動頻率,在程序上體現(xiàn)為改變定時器的分頻值(又稱預(yù)重裝值,counter_arr)。預(yù)重裝值與頻率的對應(yīng)關(guān)系為
表1為50 MHz的時鐘頻率下,頻率與預(yù)重裝值的對應(yīng)關(guān)系。根據(jù)歌曲中音符的先后順序?qū)㈩A(yù)重裝值輸入到查找表當(dāng)中,并與索引值一一對應(yīng)。索引值的位寬取決于樂曲中音符的數(shù)量。查找表采用累加的方式遍歷所有音符。當(dāng)定時器計數(shù)達(dá)到分頻值減1時,會清零并發(fā)送一個tick信號,令電平發(fā)生變化,從而達(dá)到使蜂鳴器發(fā)聲的目的。本設(shè)計有2首歌曲,不同的狀態(tài)對應(yīng)不同的查找表。如果是歌曲比較多的設(shè)計,則可以將各個歌曲的音符分別存入不同的查找表中,然后根據(jù)狀態(tài)的不同讀取相應(yīng)的arr值。圖2為整個音樂模塊的設(shè)計流程。
表1 各音調(diào)頻率預(yù)重裝值對應(yīng)表Tab.1 The relationship between the tone frequency and counter_arr
圖2 音樂模塊設(shè)計圖Fig.2 The design of music module
AC620開發(fā)板上的數(shù)碼管是段式顯示共陽極的數(shù)碼管,需要給其低電平才能使其點亮,共有8個這樣的數(shù)碼管。數(shù)碼管工作的方式采用動態(tài)顯示的方式。將所有位數(shù)碼管段選線并聯(lián)在一起,位選線控制哪一位數(shù)碼管有效。這樣能有效地減少IO口,避免資源的浪費。本設(shè)計以12.5 MHz的頻率進(jìn)行掃描,利用發(fā)光管的余暉與眼睛視覺暫留現(xiàn)象,讓人覺得相應(yīng)的數(shù)碼管都在同時發(fā)光。由于開發(fā)板上是一個8位8段的數(shù)碼管,以級聯(lián)的方式連接2個74HC595芯片,構(gòu)成16位的移位寄存器并將串行的信號變?yōu)椴⑿械男盘栞敵龅蕉芜x和位選口,這樣僅用3個IO口即可控制全部數(shù)碼管。
表2 數(shù)碼管編碼譯碼表Tab.2 Code decoding table of digital tube
在代碼設(shè)計方面:首先,需要一個分頻計數(shù)器產(chǎn)生驅(qū)動時鐘;其次,74HC595內(nèi)部可以看做由一個8位串行移位器和一個8位寄存器組成,當(dāng)數(shù)據(jù)全部存入移位寄存器之后,產(chǎn)生一個stcp信號,存入寄存器,接著才會輸出數(shù)據(jù)。由于有2個這樣的芯片,經(jīng)過16次移位之后才會儲存一次數(shù)據(jù)。因此需要編寫一個查找表來表示這一過程。最后,需要將數(shù)碼管顯示的數(shù)字與段碼一一對應(yīng),它們的對應(yīng)關(guān)系如表2。
只要確定好數(shù)碼管段選與位選的段碼值,即可以在相應(yīng)的數(shù)碼管上輸出數(shù)據(jù)。本設(shè)計在位選數(shù)據(jù)線上為8′b0000_0001,即數(shù)碼管7被選中。當(dāng)為mode1時,段選數(shù)據(jù)線上為8′b1111_1001;當(dāng)為mode2時,段選數(shù)據(jù)線上為8′b1010_0100;當(dāng)為idle時,段選數(shù)據(jù)線上為8′b1111_1111。此處需要注意,移位是從第7位開始,段碼需要從第7位倒著輸入。
圖3 狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換圖Fig.3 State transition diagram
對于本設(shè)計來說,需要3個狀態(tài)來實現(xiàn)歌曲的切換,分別是:idle,mode1,mode2。狀態(tài)機(jī)的設(shè)計如圖3所示。其中KEY[0]、KEY[1]的管腳連接的是AC620板子上的按鍵1,按鍵2。KEY[0]=0代表按鍵1被按下,輸出低電平,電路導(dǎo)通;KEY[0]=1代表按鍵1沒被按下,輸出高電平,電路截止。KEY[1]與之同理。狀態(tài)機(jī)要實現(xiàn)的功能及現(xiàn)象如下:
對于led模塊:當(dāng)按下按鍵1,狀態(tài)變?yōu)閙ode1時,led燈會以很快的頻率滾動閃爍;當(dāng)按下按鍵2,狀態(tài)變?yōu)閙ode2時,led燈以一個較慢的頻率閃爍;當(dāng)狀態(tài)變?yōu)閕dle時,led燈全滅。
對于音樂模塊:當(dāng)為mode1狀態(tài)時,播放第1首歌曲;當(dāng)為mode2狀態(tài)時,播放第2首;為idle狀態(tài)時,不播放音樂。
對于數(shù)碼管模塊:當(dāng)為mode1時,數(shù)碼管顯示數(shù)字“1”;mode2狀態(tài)時,數(shù)碼管顯示“2”;當(dāng)為idle狀態(tài)時,無顯示。
值得注意的是,要保證按鍵1按下后,狀態(tài)繼續(xù)保持為mode1而不回到idle狀態(tài),僅有KEY[0]=0這個條件是不夠的,還需要判斷按鍵1的前一狀態(tài)。(prekey[0]=1表示按鍵1的前一狀態(tài)為抬起,prekey[0]=0表示按鍵1的前一狀態(tài)為按下。)那么如何定義按鍵1的前一狀態(tài)呢?需要編寫一個D觸發(fā)器,通過非阻塞賦值的方式將KEY[0]的值賦給prekey[0],這樣在同一個周期中,prekey[0]的值就等于KEY[0]的舊值。為了實現(xiàn)設(shè)定的功能,需要定義當(dāng)按鍵的前一狀態(tài)與現(xiàn)在的狀態(tài)不同時,狀態(tài)機(jī)才會切換狀態(tài),否則則保持系統(tǒng)的前一狀態(tài)不變。除此之外,因為本設(shè)計由按鍵控制,這樣編寫也可以消除按鍵抖動。
將相應(yīng)的代碼按功能整合到一起,進(jìn)行封裝例化。例化后的模塊像零件一樣,按照正確的順序連接,被頂層調(diào)用,從而構(gòu)成一個清晰的系統(tǒng)。部分仿真波形圖如圖4所示。
圖4 部分仿真波形圖Fig.4 Simulating waveform
由波形圖可知,當(dāng)前選中的是數(shù)碼管7。圖中state的值為1時,說明進(jìn)入到mode1中,7號數(shù)碼管上的顯示為11111001,對應(yīng)在數(shù)碼管上則顯示數(shù)字“1”;當(dāng)state的值為2時,則為mode2狀態(tài),數(shù)碼管值為10100100,對應(yīng)在數(shù)碼管上的結(jié)果為數(shù)字“2”。只有當(dāng)state的值發(fā)生改變時,數(shù)碼管的數(shù)字才發(fā)生改變,否則則保持當(dāng)前顯示結(jié)果不變,與預(yù)期結(jié)果相符。
最后,將配置文件燒寫到FPGA中,進(jìn)行板級驗證,驗證結(jié)果如圖5所示。
(a)—歌曲1顯示結(jié)果; (b)—歌曲2顯示結(jié)果圖5 LED和數(shù)碼管顯示結(jié)果Fig.5 Displaying results of LED and Digital tube
圖5(a):按鍵1按下,數(shù)碼管顯示數(shù)字“1”,LED燈快速閃爍,播放樂曲《生日快樂歌》,圖5(b):按鍵2按下,數(shù)碼管顯示數(shù)字“2”,LED燈閃爍變慢,播放樂曲《兩只老虎》,整個設(shè)計測試成功。
本文研究了一種基于FPGA的帶數(shù)碼管顯示的音樂流水燈控制系統(tǒng)。利用Verilog語言進(jìn)行編譯,一個狀態(tài)機(jī)控制led燈閃爍、音樂播放以及數(shù)碼管的同步輸出,代碼簡潔高效,若想增加新的狀態(tài)或其他功能模塊,便于修改,復(fù)用性好。同時,本文提供的一種消除按鍵抖動設(shè)計思路,可應(yīng)用于其他的控制系統(tǒng)。此外,AC620開發(fā)板上有多個接口,利用SOPC技術(shù)搭建外設(shè),可實現(xiàn)更多的功能,從而本設(shè)計有更多優(yōu)化升級的空間??傊?本裝置以FPGA為核心,代碼簡單,系統(tǒng)穩(wěn)定,可移植性強,應(yīng)用范圍廣,具有一定的市場投資價值。