摘 要:大多數(shù)的電子琴設(shè)計(jì)都有彈奏和播放功能,但能自動(dòng)對(duì)彈奏的樂曲進(jìn)行動(dòng)態(tài)錄音并可改變回放快慢的設(shè)計(jì)卻很少,而該設(shè)計(jì)采用VHDL語(yǔ)言有限狀態(tài)機(jī)的設(shè)計(jì)方法對(duì)ROM/RAM控制電路進(jìn)行編程,基于QuartusⅡ6.0開發(fā)平臺(tái)仿真編譯,下載到FPGA芯片(CycloneII EP2C8Q208)中測(cè)試,準(zhǔn)確地實(shí)現(xiàn)了電子琴動(dòng)態(tài)錄音與回放并快慢可調(diào)功能。實(shí)驗(yàn)表明采用FPGA實(shí)現(xiàn)音樂存儲(chǔ)、動(dòng)態(tài)錄音與回放演奏系統(tǒng)是可行的,為實(shí)現(xiàn)音樂存儲(chǔ)與播放展示了良好的應(yīng)用前景,也為各類多媒體大容量語(yǔ)音芯片系統(tǒng)設(shè)計(jì)提供了一種新的技術(shù)方法。
關(guān)鍵詞:FPGA;VHDL;狀態(tài)機(jī);錄音與回放
中圖分類號(hào):TN40文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):1004-373X(2009)03-130-03
Design of Electronic Organ System Recording and Replaying Based on FPGA
LI Xuemei
(Leshan Teachers College,Leshan,614000,China)
Abstract:Most designs of electronic organs have the essential functions of playing and replaying,but few are equipped with the device of dynamic recorging of the music being played and the device of speed adjustment.This design is based upon QuartusⅡ6.0,adopting the design of VHDL state machine,thus making the recording and replaying speed of the electronic organ adjustable,which indicates that it is feasible to adopt FPGA to record and replay music.This design brings forth a favorable prospect for music recording and replaying and provids a new technic for the design of bulky sound chips of diversified multimedia.
Keywords:FPGA;VHDL;state machine;recording and repalying
0 引 言
樂曲都是由一連串的音符組成,因此按照樂曲的樂譜依次輸出這些音符所對(duì)應(yīng)的頻率,就可以在揚(yáng)聲器上連續(xù)地發(fā)出各個(gè)音符的音調(diào)。大多數(shù)的電子琴設(shè)計(jì)都有彈奏和播放功能,但能自動(dòng)對(duì)彈奏的樂曲進(jìn)行錄音并可改變回放快慢可調(diào)的設(shè)計(jì)卻很少[1-3]。要實(shí)現(xiàn)錄音和回放功能,就必須將彈奏的音符值在相應(yīng)的寫控制信號(hào)控制下存儲(chǔ)到FPGA芯片內(nèi)部的隨機(jī)存儲(chǔ)器(RAM)中,而在相應(yīng)的讀控制信號(hào)控制下,將RAM中存儲(chǔ)的音符值讀出來,送給相應(yīng)的發(fā)聲控制等模塊。進(jìn)入20 世紀(jì)90 年代以后,EDA 技術(shù)得到了飛速的發(fā)展,電子系統(tǒng)的設(shè)計(jì)方法發(fā)生了很大的變化,傳統(tǒng)的設(shè)計(jì)方法正逐步退出歷史舞臺(tái),而基于EDA 技術(shù)的可編程邏輯芯片設(shè)計(jì)成為電子系統(tǒng)設(shè)計(jì)的主流。本設(shè)計(jì)基于QuartusⅡ6.0開發(fā)平臺(tái),采用VHDL語(yǔ)言在FPGA芯片上成功地實(shí)現(xiàn)了電子琴動(dòng)態(tài)錄音與回放功能[4-6]。
1 電子琴動(dòng)態(tài)錄音與回放系統(tǒng)設(shè)計(jì)
已經(jīng)設(shè)計(jì)成功的多功能電子琴樂曲硬件演奏設(shè)計(jì)電路主要包括:鍵盤演奏、人工選曲并播放樂曲、錄音/回放、可控制播放歌曲的節(jié)奏快慢、液晶顯示當(dāng)前系統(tǒng)狀態(tài)等功能。其中在FPGA芯片中實(shí)現(xiàn)的電路設(shè)計(jì)有4個(gè)模塊,分別為鍵盤掃描和按鍵功能設(shè)置模塊、ROM/RAM控制器模塊、發(fā)聲控制模塊、LCD驅(qū)動(dòng)控制模塊。系統(tǒng)設(shè)計(jì)框圖如圖1所示。
工作原理如下:首先通過鍵盤掃描和按鍵功能設(shè)置模塊將一個(gè)4*4的鍵盤上各按鍵進(jìn)行功能設(shè)置,然后根據(jù)相應(yīng)的操作要求進(jìn)行發(fā)聲和液晶顯示。如果選中當(dāng)前狀態(tài)是彈奏模式,則發(fā)聲控制模塊直接把琴鍵送來的音符對(duì)應(yīng)的分頻系數(shù)轉(zhuǎn)換成相應(yīng)頻率送到揚(yáng)聲器發(fā)聲,字幕信息通過液晶顯示驅(qū)動(dòng)模塊驅(qū)動(dòng)液晶顯示;如果選中當(dāng)前工作模式為播放模式,則ROM/RAM控制器模塊把事先存儲(chǔ)在ROM中的音樂數(shù)據(jù)提出來送至發(fā)聲模塊,完成自動(dòng)播放功能;如果選中當(dāng)前工作狀態(tài)是錄音回放模式,則啟動(dòng)ROM/RAM控制器模塊中RAM狀態(tài)機(jī)控制器進(jìn)行讀寫操作。
這里重點(diǎn)介紹由ROM/RAM控制模塊通過狀態(tài)機(jī)設(shè)計(jì)產(chǎn)生錄音/回放功能的實(shí)現(xiàn)。
2 ROM/RAM控制模塊的設(shè)計(jì)
ROM/RAM控制模塊的作用是通過對(duì)系統(tǒng)當(dāng)前所處的模式進(jìn)行判斷,并根據(jù)輸入的控制信號(hào),對(duì)CycloneⅡ FPGA內(nèi)嵌的RAM的讀寫信號(hào)、讀寫時(shí)鐘及讀寫地址進(jìn)行控制。其中ROM/RAM控制模塊的外部接口符號(hào)圖如圖2所示。
此模塊定義了10個(gè)輸入端口,分別為:mode_key(鍵盤演奏模式)、mode_auto(播放歌曲模式)、mode_tape(錄音回放模式)、time_up(節(jié)奏上升)、time_down(節(jié)奏下降)、song_select(曲目選擇)、tape(錄音)、playback(放音)、reset(系統(tǒng)復(fù)位)、clk(時(shí)鐘)。定義了15個(gè)輸出端口:rom_add(ROM地址)、rom_clk(ROM時(shí)鐘)、rom_en(ROM時(shí)鐘使能)、ram_wradd(RAM寫地址)、ram_wren(RAM寫使能)、ram_wrclk(RAM寫時(shí)鐘)、ram_rdadd(RAM讀地址)、ram_rden(RAM讀地址)、ram_rdclk(RAM讀地址)、full(錄音滿信號(hào))、over(回放完畢信號(hào))以及5個(gè)提供LCD驅(qū)動(dòng)顯示用的信號(hào)。
RAM/ROM控制模塊中的RAM控制部分分成兩個(gè)小部分,采用有限狀態(tài)機(jī)(FSM)分別對(duì)RAM讀狀態(tài)和RAM寫狀態(tài)進(jìn)行操作控制。當(dāng)系統(tǒng)當(dāng)前模式為“錄音/回放模式”時(shí),如果“錄音”按鍵按下,則RAM進(jìn)行寫操作,從首地址開始進(jìn)行存儲(chǔ)。如果存儲(chǔ)滿1 024個(gè)地址空間,則提示“錄音滿”,寫操作終止,等待用戶命令,以進(jìn)行下一步操作。當(dāng)系統(tǒng)當(dāng)前模式為“錄音/回放模式”時(shí),如果“回放”按鍵按下,則RAM進(jìn)行讀操作,從首地址開始將RAM單元中的數(shù)據(jù)送給發(fā)聲控制模塊進(jìn)行播放。如果讀完1 024個(gè)地址空間,則提示“回放完畢”,讀操作終止,等待用戶命令,以進(jìn)行下一步操作。
寫操作的FSM狀態(tài)轉(zhuǎn)移流程以及轉(zhuǎn)移條件如圖3所示;讀操作的FSM狀態(tài)轉(zhuǎn)移流程以及轉(zhuǎn)移條件如圖4所示。
用狀態(tài)機(jī)對(duì)RAM進(jìn)行讀寫控制的部分源程序如下:
--------------------------
process( ram_wrclk000,reset,mode_tape,tape,playback)
begin
if reset=′0′then tape_state<=tape_state0;
elsif ram_wrclk000′event and ram_wrclk000=′1′ then
tape_state<=tape_state;
case tape_state is
when tape_state0 => if mode_tape=′0′ then tape_state<=tape_state0;
ram_wren<=′0′;
ram_wradd000<=″0000000000″;
else tape_state<=tape_state1;
--如果電子琴使能端reset為0或者錄音模式mode_tape為0,則狀態(tài)機(jī)處于等待狀態(tài)tape_state0,否則進(jìn)入下一狀態(tài)tape_state1。
end if;
when tape_state1 => if tape=′0′ then tape_state<=tape_state0;
ram_wren<=′0′;
ram_wradd000<=″0000000000″;
else tape_state<=tape_state2;
end if;
--如果錄音控制鍵tape為0,則回到初始狀態(tài)。否則進(jìn)入下一狀態(tài)tape_state2。
when tape_state2 => if (playback=′1′ or mode_tape=′0′) then full<=′0′;
ram_wren<=′0′;
ram_wradd000<=″0000000000″;
tape_state<=tape_state0;
elsif tape=′1′ thenfull<=′0′;
ram_wren<=′1′;ram_wradd000<=ram_wradd000+1;
tape_state<=tape_state2;
--如果回放控制鍵playback為1,或錄音模式mode_tape為0則回到初始狀態(tài),且對(duì)RAM寫控制端ram_wren為0。否則進(jìn)入下一狀態(tài)tape_state2。
elsif ram_wradd000=″1111111111″ then full<=′1′;
--錄滿音提示
ram_wren<=′0′;tape_state<=tape_state0;
--如果錄音地址飽和,則回到為tape_state0初始狀態(tài),且對(duì)RAM寫控制端ram_wren為0。
else full<=′0′;
ram_wren<=′1′;
tape_over_add<=ram_wradd000;--錄音截止地址,作為RAM讀地址的末地址
tape_state<=tape_state2;
end if;
when others => tape_state<=tape_state0;
end case;
end if;
ram_wradd<=ram_wradd000;
end process;
---------------------------
其仿真波形圖如圖5所示。從仿真圖上可以看出,RAM/ROM控制模塊電路既產(chǎn)生了控制RAM存儲(chǔ)器的時(shí)鐘ram_wrclk信號(hào),也產(chǎn)生了相應(yīng)的控制RAM的使用使能信號(hào)ram_wren和寫入地址ram_wradd。
3 RAM隨機(jī)存儲(chǔ)器的設(shè)計(jì)
設(shè)計(jì)一個(gè)雙端口的存儲(chǔ)深度為1 024、存儲(chǔ)寬度為6位的隨機(jī)存儲(chǔ)器RAM,用來存儲(chǔ)彈奏的樂曲,并可播放出來。生成的RAM單元如圖6所示。data[5..0]端口為彈奏電子琴時(shí)由發(fā)聲控制模塊產(chǎn)生的音符數(shù)據(jù)。當(dāng)系統(tǒng)處于“錄音/回放模式”的“錄音”狀態(tài)時(shí),將當(dāng)前所彈奏的音符進(jìn)行轉(zhuǎn)換,輸出作為RAM的存儲(chǔ)數(shù)據(jù)“DATA”。wraddress[9..0]代表十位寬度的寫地址端口,rdaddress[9..0]代表十位寬度的讀地址端口。wrclock為RAM寫入時(shí)鐘,rdclock為RAM讀出時(shí)鐘。Q[5..0]為從RAM中讀出所存放數(shù)據(jù),即data。
從圖6可以看出,此雙口RAM具有獨(dú)立的讀寫時(shí)鐘和讀寫使能。選擇這樣的RAM的目的是為了以一個(gè)固定頻率wrclock(本設(shè)計(jì)取4 Hz)的時(shí)鐘對(duì)RAM進(jìn)行寫操作,即以一個(gè)固定的采樣頻率對(duì)所彈奏的樂曲進(jìn)行采樣存儲(chǔ);另一方面以節(jié)奏控制部分輸出的時(shí)鐘rdclock作為RAM的讀時(shí)鐘信號(hào),使得回放過程可以以不同的節(jié)奏將儲(chǔ)存的樂曲播放出來。這是其新穎之處,使電子琴在回放過程中更加靈活多變,功能更多。
其仿真波形圖如圖7所示。從仿真圖上可以看出,RAM存儲(chǔ)器在寫使能信號(hào)和讀使能信號(hào)控制作用下依次寫入數(shù)據(jù)信號(hào),并按寫入地址先后次序再準(zhǔn)確地讀出來,實(shí)現(xiàn)了錄音和回放的功能要求。
本設(shè)計(jì)采用杭州康芯電子有限公司開發(fā)的電子設(shè)計(jì)應(yīng)用板(型號(hào): KX-DVP3F)進(jìn)行對(duì)系統(tǒng)的調(diào)試與功能驗(yàn)證。利用QuartusⅡ6.0軟件生成.sof或者.pof編程文件,通過USB下載器將編程文件配置到CycloneⅡ EP2C8Q208芯片中,經(jīng)過數(shù)次的調(diào)試,多功能電子琴的全部技術(shù)指標(biāo)和功能很好地符合設(shè)計(jì)要求,發(fā)聲準(zhǔn)確,易操作,可視性強(qiáng)。
有限狀態(tài)機(jī)設(shè)計(jì)技術(shù)是實(shí)用數(shù)字系統(tǒng)中的重要組成部分,也是實(shí)現(xiàn)高效率高可靠邏輯控制的重要途徑。它具有類似CPU的高速運(yùn)算和控制能力,程序?qū)哟畏置?結(jié)構(gòu)清晰,易讀易懂;在排錯(cuò)、修改和模塊移植方面也有獨(dú)到之處。
參考文獻(xiàn)
[1]王思聰,康潤(rùn)生.用CPLD實(shí)現(xiàn)簡(jiǎn)易音樂發(fā)生器[J].焦作工學(xué)院學(xué)報(bào):自然科學(xué)版,2001,20(2):98-99.
[2]杜世民,楊潤(rùn)萍,張川.用VHDL設(shè)計(jì)樂曲演奏電路[J].寧波高等??茖W(xué)校學(xué)報(bào),2003,15(4):41-49.
[3]姜田華.基于FPGA的樂曲發(fā)生器設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2003,26(18):67-69.
[4]郭培源,喬美華.基于FPGA,CPLD芯片的音樂存儲(chǔ)與回放系統(tǒng)設(shè)計(jì)[J] .電聲技術(shù),2004(10):54-57.
[5]楊國(guó)慶.基于FPGA動(dòng)態(tài)顯示樂曲演奏片上系統(tǒng)的分析與設(shè)計(jì)[J].電聲技術(shù),2006(19):162-164.
[6]楊國(guó)慶.基于VHDL動(dòng)態(tài)顯示樂曲播放器的設(shè)計(jì)與實(shí)現(xiàn)[J].天津工業(yè)大學(xué)學(xué)報(bào),2006,25(4):34-37.
[7]潘松,黃繼業(yè).EDA技術(shù)實(shí)用教程[M].北京:科學(xué)出版社,2006.
[8]陳瓊,潘禮,黃松.FPGA系統(tǒng)設(shè)計(jì)與實(shí)踐[M].北京:電子工業(yè)出版社,2004.
[9]王振紅.VHDL數(shù)字電路設(shè)計(jì)與應(yīng)用實(shí)踐教程[M].北京:機(jī)械工業(yè)出版社,2006.
[10]顧斌,趙明忠,姜志鵬.數(shù)字電路EDA設(shè)計(jì)[M].西安:西安電子科技大學(xué)出版社,2004.
[11]朱明程,董爾令.可編程邏輯器件原理與應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2004.
作者簡(jiǎn)介
李雪梅 女,1964年出生,副教授,主要從事教學(xué)及實(shí)驗(yàn)室建設(shè)。研究方向?yàn)楝F(xiàn)代電子技術(shù)應(yīng)用。