呂兆承, 傅小蘭, 李營, 羅靖宇
( 淮南師范學(xué)院 電子工程學(xué)院, 安徽 淮南 232038 )
目前,具有樂曲演奏功能的電子產(chǎn)品大多采用單片機微處理器來實現(xiàn)樂曲演奏,但這些產(chǎn)品因受硬件資源的限制,難以對原設(shè)計進(jìn)行變更或升級[2].FPGA技術(shù)是一種新型的電路設(shè)計技術(shù),其通過軟件編程設(shè)計硬件電路,可極大地提高電路設(shè)計的效率和可靠性,被廣泛使用在5G通信、大數(shù)據(jù)處理、人工智能、工業(yè)控制等領(lǐng)域[3].目前,有學(xué)者嘗試性地將FPGA技術(shù)運用于樂曲演奏中.例如:崔智軍等[4]在FPGA器件上設(shè)計了一個具有簡易觸摸屏的電子琴電路,并實現(xiàn)了觸摸控制彈奏和自動播放樂曲的功能.王麗君等[5]采用VHDL編程技術(shù)設(shè)計了一種基于FPGA的簡易電子琴,該電子琴具有手動彈奏、自動演奏和簡譜碼顯示等功能.基于上述研究,本文利用Altera的FPGA芯片,在Quartus平臺下,采用top-down設(shè)計方法,設(shè)計一款基于UART通信接口的樂曲硬件演奏電路,并通過嵌入式邏輯分析儀SignalTap II對系統(tǒng)的有效性進(jìn)行仿真驗證.
該演奏系統(tǒng)主要包括串口調(diào)試工具、UART串口接收模塊、樂曲演奏模塊和蜂鳴器,其總體結(jié)構(gòu)框圖如圖1所示.串口調(diào)試工具的功能主要是控制指令的發(fā)送;UART串口接收模塊的功能主要是控制指令的接收,并將接收到的控制指令發(fā)送至樂曲演奏模塊;樂曲演奏模塊的功能主要是輸出使樂曲能連續(xù)演奏所需的基本數(shù)據(jù);蜂鳴器的功能主要是演奏樂曲.其中UART串口接收模塊和樂曲演奏模塊在FPGA中實現(xiàn).由此可以看出,該系統(tǒng)只需很少的外圍器件即可演奏音樂,從而可提高系統(tǒng)的可靠性.
圖1 演奏系統(tǒng)的結(jié)構(gòu)框圖
UART串口的通信主要由兩根信號線來實現(xiàn),一根用于串口發(fā)送,另外一根負(fù)責(zé)串口接收.數(shù)據(jù)在傳輸過程中不需要時鐘,只需通信雙方在數(shù)據(jù)傳輸過程中約定好一個特定的波特率即可,典型的波特率有9 600、19 200、115 200 bps等.數(shù)據(jù)的傳輸有起始位、停止位、中間位.起始位表示數(shù)據(jù)傳輸?shù)拈_始,停止位表示數(shù)據(jù)傳輸?shù)慕Y(jié)束,中間位的個數(shù)可以根據(jù)需要設(shè)定,并可以設(shè)定奇偶校驗位(可選)[6].UART的數(shù)據(jù)傳輸格式如圖2所示.數(shù)據(jù)格式為1位起始位、8位數(shù)據(jù)位、1位停止位,無校驗位.
圖2 UART的數(shù)據(jù)傳輸格式
根據(jù)UART通信原理,本文將UART串口接收模塊劃分為波特率發(fā)生器、數(shù)據(jù)接收模塊,如圖3所示.波特率發(fā)生器的功能是產(chǎn)生與UART通信同步的時鐘,通過該功能UART串口接收模塊可方便地按照UART通信的時序要求進(jìn)行數(shù)據(jù)接收或者發(fā)送.數(shù)據(jù)接收模塊的主要功能是接收和轉(zhuǎn)換數(shù)據(jù).數(shù)據(jù)接收模塊在完成接收數(shù)據(jù)后,輸出結(jié)束標(biāo)志信號[7].本文將UART串口接收模塊的端口定義為:
1) clk為系統(tǒng)時鐘輸入端,輸入頻率為50 MHz;
2) rst_n為系統(tǒng)復(fù)位信號輸入端,低電平有效;
3) uart_rx為接收模塊串行數(shù)據(jù)接收端;
4) out_rx_dara為接收模塊并行數(shù)據(jù)輸出端;
因為是連續(xù)運動,著陸過程還會繼續(xù),但碰撞時間已經(jīng)記錄下來,做分析處理,將本文的改進(jìn)算法與一般碰撞檢測算法進(jìn)行對比,可得到如下的檢測效果,如表2:
5) rx_bps_start為數(shù)據(jù)接收標(biāo)志信號,高電平表示接收數(shù)據(jù).
圖3 UART串口接收模塊的RTL級視圖
本文用Quartus自帶的嵌入式邏輯分析儀SignalTap II來捕獲和顯示信號,并用其來分析系統(tǒng)硬、軟件之間的互相作用[8].使用SignalTap II的一般流程為:新建調(diào)試文件,添加信號,設(shè)置信號觸發(fā),設(shè)置時鐘相關(guān)參數(shù),下載仿真.UART串口接收模塊的仿真結(jié)果如圖4所示.由圖4可以看出:串行數(shù)據(jù)接收端uart_rx上的數(shù)據(jù)序列為0100011001,其起始位為“0”,數(shù)據(jù)位為“10001100”,停止位為“1”(最后一位).在數(shù)據(jù)接收標(biāo)志信號rx_bps_start和波特率時鐘計數(shù)器bit_cnt的控制下,UART串口只采集輸入數(shù)據(jù)(串行數(shù)據(jù))的中間8位有效位,并將其逐位存儲到寄存器shift_data中.當(dāng)UART串口接收到所有(9個)的波特率時鐘之后,寄存器shift_data將接收到的數(shù)據(jù)并行輸出給數(shù)據(jù)輸出端out_rx_data.因UART串口在數(shù)據(jù)通信時首先發(fā)送的是最低位數(shù)據(jù),因此接收的數(shù)據(jù)為“00110001”.由表4中的數(shù)據(jù)欄可以看到,當(dāng)UART串口接收完數(shù)據(jù)后,其數(shù)據(jù)接收標(biāo)志信號rx_bps_start為“0”,數(shù)據(jù)輸出端out_rx_data為“00110001”,與串行數(shù)據(jù)接收端uart_rx接收的數(shù)據(jù)一致.這表明,UART串口接收模塊的功能正常.
圖4 UART串口接收模塊的仿真時序
組成樂曲的每個音符的頻率值(音調(diào))及其持續(xù)的時間(音長)是樂曲能夠連續(xù)演奏所需的兩個基本數(shù)據(jù).①音調(diào).因樂曲都是由一連串的音符組成,當(dāng)演奏電路按照樂曲的樂譜依次輸出這些音符所對應(yīng)的頻率時,蜂鳴器即可連續(xù)地發(fā)出音符的音調(diào)[9].這些音符的頻率是通過對基準(zhǔn)頻率進(jìn)行分頻得到的.②音長.音長是由樂曲的速度及每個音符的節(jié)拍數(shù)來確定的.為了實現(xiàn)節(jié)拍,需選擇一個時鐘頻率來控制音長.如:若將全音符的持續(xù)時間設(shè)為1 s,只需提供一個4 Hz的時鐘頻率即可產(chǎn)生四分音符的時長;對于節(jié)拍較長的音符,如二分音符,則連續(xù)讀取2次即可.因此,只要控制好輸出到蜂鳴器的激勵信號(包括頻率的高低和持續(xù)時間)就可以使蜂鳴器發(fā)出連續(xù)的樂曲聲[10].
根據(jù)上述樂曲演奏的原理,本文將樂曲演奏模塊劃分為4個子模塊:音符數(shù)據(jù)ROM模塊、地址發(fā)生器模塊、樂譜碼查表模塊、數(shù)控分頻器模塊.
音符數(shù)據(jù)ROM模塊的功能是存放樂曲中的音符數(shù)據(jù).該功能是利用Quartus軟件自帶的IP核LPM-ROM來實現(xiàn)的,即將樂譜中相應(yīng)的音符按照一定的規(guī)則放在一個連續(xù)的地址上.將音符轉(zhuǎn)換為代碼的規(guī)則為:采用8位二級制數(shù)表示音符,低4位用1(do)、2(re)、3(mi)、4(fa)、5(sol)、6(la)、7(si)代表音階中的7個基本音級,高4位用1、2、3分別表示每個音級的低音、中音和高音,休止符用0表示.本文選用的ROM的容量為8×512 bits,并選擇3首樂曲(《兩只老虎》《送別》和《布娃娃和小熊跳舞》)分別儲存在ROM中,各樂曲的地址值分別為0~71、88~215、240~367.
本文將一個9位二進(jìn)制計數(shù)器(計數(shù)最大值為512)作為音符數(shù)據(jù)ROM模塊的地址發(fā)生器,以此實現(xiàn)按節(jié)拍讀取樂譜.該模塊每收到1次時鐘信號,計數(shù)器就會計數(shù)1次;計數(shù)結(jié)果停留的時間越長,該音符演奏的時間就越長.
樂譜碼查表模塊中包含樂曲全部音符所對應(yīng)的頻率,如表1所示.表1中的計算結(jié)果是四舍五入所得,因此與每個音符的實際頻率相比會出現(xiàn)小于1 Hz的誤差.
表1 簡譜中的音符與頻率的關(guān)系
數(shù)控分頻器模塊的功能是通過對某個基準(zhǔn)時鐘頻率進(jìn)行分頻,獲得與各個音符所對應(yīng)的頻率輸出.
圖5為樂曲演奏模塊的RTL級視圖.樂器演奏模塊的端口定義如下:
1) clk為系統(tǒng)時鐘輸入端,輸入頻率為50 MHz;
2) rst_n為系統(tǒng)復(fù)位信號輸入端;
3) key_cnt為控制信號輸入端,用來選擇ROM中不同的地址段.選擇第1首樂曲,key_cnt的值為“8’h30”,計數(shù)器從位置0~71循環(huán)計數(shù),由此實現(xiàn)樂曲的循環(huán)演奏;
4) beep為驅(qū)動蜂鳴器的輸出信號.
圖5 樂曲演奏模塊的RTL級視圖
為了實現(xiàn)樂曲的播放,首先需要將曲譜數(shù)據(jù)存儲到音符數(shù)據(jù)ROM模塊中,然后按照一定的節(jié)拍從ROM中讀出曲譜.在時鐘的驅(qū)動下,音符數(shù)據(jù)ROM模塊依次輸出該曲譜的音符數(shù)據(jù)并發(fā)送至樂譜碼查表模塊;樂譜碼查表模塊輸出音符的相應(yīng)頻率,并將此頻率輸送至數(shù)控分頻器模塊;數(shù)控分頻器模塊通過對50 MHz時鐘進(jìn)行分頻,輸出此音符所對應(yīng)的發(fā)聲頻率,由此驅(qū)動蜂鳴器發(fā)出連續(xù)的樂曲聲.當(dāng)樂曲被演奏完一遍后,樂曲演奏模塊能自動從頭開始循環(huán)演奏.樂曲演奏模塊根據(jù)key_cnt取值,選擇的地址段不同,演奏不同的樂曲.樂曲演奏的實現(xiàn)過程如圖6所示.
圖7為樂曲演奏模塊的時序仿真圖.圖7中輸入的控制信號key_cnt為“30”,演奏的樂曲為《兩只老虎》.其中第1個音符是中音do,它的輸出頻率是523 Hz,占了2個狀態(tài)的時間(不包括0時刻之前的狀態(tài));第2個音符是中音re,它的輸出頻率是587 Hz,占了2個狀態(tài)的時間;第3個音符是中音mi,它的輸出頻率是659 Hz,占了2個狀態(tài)的時間;第4個音符是中音do,占了4個狀態(tài)的時間.對照《兩只老虎》樂曲的樂譜可知,仿真結(jié)果正確.
圖6 樂曲演奏流程
圖7 樂曲演奏模塊的仿真時序
測試完SignalTap II后,還需進(jìn)行硬件測試.本設(shè)計采用芯航線AC620開發(fā)板(Altera Cyclone IV EP4CE10F17C8N)進(jìn)行系統(tǒng)的調(diào)試和功能驗證.調(diào)試過程為:首先打開串口調(diào)試工具助手,配置串口通信參數(shù);然后根據(jù)用戶需求發(fā)送控制指令給FPGA,F(xiàn)PGA根據(jù)此命令控制樂曲演奏器播放不同的樂曲.經(jīng)測試,系統(tǒng)可實現(xiàn)智能化控制演奏過程,表明本文系統(tǒng)符合設(shè)計要求.
本文在EDA開發(fā)平臺上,利用FPGA技術(shù)設(shè)計了一款基于UART數(shù)據(jù)傳輸?shù)臉非葑嚯娐?測試結(jié)果表明:通過PC機串口調(diào)試助手發(fā)送控制指令給FPGA,F(xiàn)PGA可以準(zhǔn)確地接收相應(yīng)指令,并確定出與該指令相對應(yīng)的樂曲,然后通過蜂鳴器即可完成音樂播放.本文方案穩(wěn)定可靠,使用便捷,因此具有很好的實用性.另外,本系統(tǒng)在實際運行中可根據(jù)外設(shè)和處理器的不同需要,通過調(diào)整波特率和改變數(shù)據(jù)幀的格式設(shè)置等即可將本系統(tǒng)運用于不同的數(shù)字演奏系統(tǒng).