王麗君,李 萌
(1.南華大學 電氣工程學院,湖南 衡陽 421001;2.南華大學 計算機科學與技術學院,湖南 衡陽 421001)
基于FPGA的簡易電子琴設計
王麗君1,李 萌2
(1.南華大學 電氣工程學院,湖南 衡陽 421001;2.南華大學 計算機科學與技術學院,湖南 衡陽 421001)
介紹了一種基于在系統(tǒng)可編程門陣列(FPGA)的簡易電子琴設計方法,可實現手動彈奏、自動演奏預存樂曲和簡譜碼顯示功能。該設計的主體部分采用超高速集成電路硬件描述語言(VHDL)編程實現。根據簡譜記錄的頻率產生方式,通過數控分頻器將基準頻率按一定的分頻比分頻,得到樂曲中所有音符信號的頻率,再由驅動電路驅動發(fā)聲或接耳機,便可實現樂曲的彈奏或播放功能,用數碼管和發(fā)光管來顯示輸出音名對應的簡譜碼。該方法設計簡單、修改方便、設計周期短,實驗證明了該設計的可行性,具有一定的實用價值。
FPGA;電子琴;數控分頻器;數碼管
數字音樂電子琴是是現代電子科技與音樂結合的產物,相比體積龐大、價格昂貴的鋼琴,數字音樂電子琴以其操作簡單、價格低廉的優(yōu)勢受到喜愛[1]。本文介紹的簡易電子琴的設計,采用Alter 公司的現場可編程門陣列(Field-Programmable Gate Array,FPGA)EP3C40Q240C8芯片作為核心控制器件,以該公司提供的Quartus II 9.0為軟件平臺,可實現電子琴以下幾個功能:(1)21個琴鍵手動彈奏,高、中、低音各7個;(2)5首預存簡譜樂曲自動循環(huán)演奏,曲目可通過數字按鈕任意選擇,可快進、后退、暫停、復位;(3)數碼管動態(tài)顯示當前音名的簡譜碼,中音直接顯示,低音在數碼管下方加發(fā)光管點亮表示,高音在數碼管上方加發(fā)光管點亮表示,發(fā)聲通過揚聲器或接耳機實現。由于該設計的主體部分在FPGA中實現,且采用自頂向下的設計方法,提高了開發(fā)和研制的效率,使整個設計和修改過程變得方便、高效[2]。
系統(tǒng)結構圖如圖1所示,其中虛線框內部分在FPGA中實現。
圖1 數字音樂電子琴系統(tǒng)結構圖
硬件電子琴電路圖如圖2所示。
圖2 硬件電子琴電路圖
2.1 音樂與頻率的關系
樂曲演奏包含兩個要素:(1)組成樂曲音符的頻率;(2)該音符持續(xù)的時間。因此只要確定這兩個要素所對應的數值就可以進行音符的輸出了[3]。簡譜中音名與頻率的對應關系如表1所示[4]。根據表中各音符頻率,只要能在音符產生電路模塊給出合適的分頻比和該分頻比持續(xù)的時間,就能在聲音輸出控制模塊產生對應音符的頻率和節(jié)拍,通過揚聲器發(fā)出美妙的音樂[5]。
表1 簡譜中音名與頻率的對應關系
2.2 時鐘電路
設計中采用的FPGA芯片EP3C40Q240C8含有高性能的嵌入式鎖相環(huán)。此鎖相環(huán)可以與輸入的時鐘信號同步, 輸出一個至多個同步倍頻或分頻的片內時鐘, 以供邏輯系統(tǒng)應用[6]。
20 MHz系統(tǒng)時鐘通過FPGA內部鎖相環(huán)分頻后分兩路輸出。一路輸出的頻率為2 kHz,經分頻器分頻后得到4 Hz的時鐘,作為樂譜和節(jié)拍發(fā)生器模塊的節(jié)拍控制。另一路輸出的頻率為1 Hz,作為數控分頻器的基準頻率。
2.3 樂曲長度控制計數器
CNT825T是一個10位二進制計數器,作為樂譜碼ROM的地址發(fā)生器[7]。ROM中存放著“梁?!钡?首樂曲共計825個音符的索引值。該計數器的計數頻率為4 Hz,即每一計數值的停留時間為0.25 s,恰為當全音符設為1 s時,四四拍的4 分音符持續(xù)時間[8]。其中SEL[4..0]為5首預存樂曲的選擇按鈕,外接數字按鈕1-5。按下數字“1”時,選擇第一首樂曲,SEL[4..0]的值為“00001”,計數器從0位置開始計數,所以該鍵也可作為復位鍵使用;按下數字“3”時,選擇第三首樂曲,SEL[4..0]的值為“00100”,計數器跳轉到第三首樂曲的地址值,并開始計數,其余類推。FF和FB分別為快進、快退鍵,按一次計數值加或減15。PP減鍵為播放/暫停鍵,播放時按一下該鍵計數器停止計數,再按一下繼續(xù)計數。若計數值已滿825,則清零重新計數,實現循環(huán)播放功能[9]。
2.4 樂譜碼ROM
樂譜碼ROM中存放著預存樂曲的樂譜索引值,每個音符發(fā)聲的持續(xù)時間控制通過記譜的方式來完成,占用幾拍,就將該音符的索引值連續(xù)記錄幾次[10]。索引值最多可輸出32個,這里只需輸出21個,從“00001”到“10101”,表示從低音“1”到高音“7”的索引值。通過4 Hz的時鐘,把樂譜中的音符索引值連續(xù)送出。
2.5 手動彈奏音階控制模塊
Tone為手動彈奏音階控制模塊。Index[20..0]為彈奏的21琴鍵輸入,當21位發(fā)聲控制輸入Index中某一位為高電平時,則對應該音階的數值將從端口q1[4..0]輸出,作為獲得該音階的分頻預置數的索引值[11]。
2.6 分頻預置數產生模塊
F_CODE為分頻預置數產生模塊。它的輸入端INX[4..0]連接到樂譜碼ROM的輸出, INX1[4..0]連接到手動彈奏音階控制模塊Tone的輸出。AUTO為手動/自動選擇按鈕,當AUTO 為“0”時(默認),通過F_CODE內部的二選一多路選擇器,選擇INX1[4..0]作為輸入,此時為手動彈奏模式;當AUTO 為“1”時,選擇INX[4..0]作為輸入,此時為預存樂曲自動播放模式。
F_CODE內部設置了21個音符所對應的分頻預置數,該模塊的主要功能是接收到手動/自動輸入的音符索引值后,通過內部的樂曲簡譜碼索引值的分頻預置數查表電路,產生該音符所對應的分頻預置值,預置值在輸入口停留的時間即為此音符的節(jié)拍值,由樂曲長度控制計數器CNT825T的輸入時鐘頻率CLK決定。同時由CODE[3..0]輸出對應該音符的簡譜碼,外接數碼管顯示,HIGH和LOW輸出指示該音符的高8度和低8度,外接發(fā)光管顯示[12]。
F_CODE模塊查表電路的部分代碼如下(C調):
CASE INX IS -- 譯碼電路,查表方式,控制音調的預置數
WHEN "00000" => TO<="11111111111" ; CODE<="0000";
HIGH <=’0’; LOW <=’0’ -- 2047, 休止符不發(fā)音
WHEN "00001" => TO<="00010001100" ; CODE<="0001";
HIGH <=’0’; LOW <=’1’ -- 140,低音1,
WHEN "00010" => TO<="00101011011" ; CODE<="0010";
HIGH <=’0’; LOW <=’1’ -,347,低音2
……………………
WHEN "10100" => TO<="11011100100" ; CODE<="0110";
HIGH <=’1’; LOW <=’0’ ——1764,高音6
WHEN "10101" => TO<="11100000011" ; CODE<="0111";
HIGH <=’1’; LOW <=’0’——1795,高音7
WHEN OTHERS => NULL;2.7 聲音輸出控制電路
該模塊由圖2中的數控分頻器實現,通過對給定的基準頻率,按一定的分頻比進行分頻,來產生各音符所對應的頻率[13]。若其基準頻率過低,會使得分頻后的輸出誤差較大;若基準頻率過高,會耗費較多的FPGA資源。綜合考慮,CLK選用1 MHz。數控分頻器其實是一個具有預置功能的可變模計數器,輸出音符頻率與基準頻率的關系為
f=f0/2(2n-TN)
(1)
其中,f為輸出音符頻率;f0為基準頻率1 MHz;n為計數器的位數;TN為計數器11位預置數;2表示二分頻。因為輸出最小的頻率為216.63 Hz,計算后可知n取11即可。
可變模計數器的部分代碼如下:
IF CLK ’EVENT AND CLK=’1’ THEN
IF Count=2047 THEN
--若記滿,將預置數TN輸入
ELSE Count:=Count+1;
--若沒計滿,繼續(xù)計數
FullSpkS<=0’;
……………………
IF FullSpkS’EVENT AND FullSpkS = ’1’
THEN Count2 := NOT Count2;
--將輸出再2分頻,展寬脈沖,使揚聲器有足夠功率發(fā)音
IF Count2 = ’1’ THEN SPKS <= ’1’;
ELSE SPKS <= ’0’;--SPKS為聲音輸出
由于FullSpkS是脈寬極窄的脈沖式信號,不利于驅動揚聲器,故對其二分頻,均衡占空比后,由SPKS輸出。SPKS可外接喇叭或蜂鳴器驅動發(fā)聲[14]。為了不影響他人,也可外接耳機。
按照樂曲要求,根據表1 的音符頻率和式(1),可計算出產生各音符所對應的計數預置數 ,從而產生樂曲所需要的各頻率信號[15]。
自動演奏模式時,隨著樂曲長度控制計數器CNT825T模塊按4 Hz的時鐘速率作加法計數時,即隨地址值遞增時,音符數據ROM 中的音符數據通過INX[4..0]端口輸向F_CODE模塊,樂曲就開始連續(xù)自然地演奏起來了。手動彈奏模式時,21琴鍵輸入的高電平,通過Tone模塊,從INX1[4..0]輸出對應的音符索引值送向F_CODE模塊,產生相應的音符,音符持續(xù)的時間長短由手指按壓琴鍵的時間決定。
系統(tǒng)完成了預期的電子琴的所有功能。該設計將電子琴系統(tǒng)的核心部分集成在可編程邏輯器件FPGA 芯片上,在很大程度上簡化了外部電路;采用VHDL 語言的層次化和模塊化的設計方法,增強了設計的可移植性和可擴展性;精確的數字分頻系數使電子琴的發(fā)音準確,提高了系統(tǒng)的整體性能,為各類大容量語音芯片系統(tǒng)設計開辟了一條新的技術方法,使設計具有廣闊的應用前景。
[1] 鐘秀媚,陳榮軍,李偉健.一種基于FPGA 和超聲波的虛擬電子琴設計[J].電子設計工程,2012,20(19):142-144.
[2] 郭培源,喬美華.基于CPLD/FPGA芯片的音樂存儲與回放系統(tǒng)的設計[J].網絡與多媒體,2004(10):54-57.
[3] 曹康,童聞煥.基于FPGA 的樂曲演奏電路設計[J].成功:教育版,2007(5):98-99.
[4] 吳翠娟.基于FPGA 的簡易電子琴控制電路設計[J].電腦知識與計數,2014,28(10):6777-6780.
[5] 高文華,劉相龍,崔麗娟,等.音樂發(fā)生器的FPGA設計與仿真[J].電聲技術,2013,37(3):25-28.
[6] 裴志強,楊玉飛,劉寶娟.數字時鐘鎖相環(huán)的設計與實現[J].微機處理,2012(1):4-6.
[7] 楊盼盼,李華偉.基于FPGA非正弦波形發(fā)生器的電路設計[J].電子設計工程,2015,23(24):76-78.
[8] 崔智軍,劉昭元,張瑜.基于FPGA的簡易觸摸電子琴設計[J].現代電子技術,2014,37(22):114-116.
[9] 吳進強,蘇凱雄.智能電視TV播放器的設計與實現[J].電視技術,2013,37(21):44-48.
[10] 周若華,顏永紅.一個快速自動音樂記譜方法[J].聲學學報,2010,35(2):282-287.
[11] 王大為,黨世紅.基于AT89C51單片機的簡易電子琴設計[J].電腦知識與技術,2014,10(23):5548-5550.
[12] 張海峰,王福源.基于FPGA 的通用樂曲電路設計[J].中原工學院學報,2005,16(4):54-57.
[13] 羅芬,趙新業(yè),梁小流.多功能音樂演奏器的設計[J].大眾科技,2010(11):36-37.
[14] 何小河.基于FPGA的音樂播發(fā)器設計[J].電子世界,2014(14):172-174.
[15] 李峽.如何讓單片機演奏音樂[J].河南科技,2011(3):88-89.
A Simple Design of the Electronic Piano Based on FPGA
WANG Lijun1,LI Meng2
(1.School of Electric Engineering, University of South China, Hengyang 421001, China;2. School of Computer Science and Technology, University of South China, Hengyang 421001, China)
A simple design of the electronic piano based on FPGA capable of manual-play, auto- play and display of the numbered musical notation codes is presented. It is realized mainly by VHDL. In accordance with the generation method of audio signal frequency, we can get all frequencies of musical note by the NC Frequency divider. By connecting the output to the loudspeaker or headset, manual-play and auto-play functions can be realized. The numbered musical notation codes are shown by nixie tube and luminous. The design has the advantage of simple structure, easy modification and short design cycle. Experiment result shows its feasibility.
FPGA; electronic piano; nc frequency divider; nixie tube
2016- 06- 20
王麗君(1979-),女,碩士,講師。研究方向:電子信息工程。李萌(1975-),男,碩士,講師。研究方向:計算機應用。
10.16180/j.cnki.issn1007-7820.2017.05.017
TN79
A
1007-7820(2017)05-062-04