賴義漢 盧彬鋒 王宇松
摘要:本文介紹了樂曲播放的基本原理及基于FPGA芯片樂曲播放器系統(tǒng)的組成,分析了紅外遙控器的工作原理及紅外遙控接收解碼器、按鍵消抖的有限狀態(tài)機(jī)設(shè)計(jì)方法,系統(tǒng)以FPGA內(nèi)部嵌入式存儲(chǔ)塊作為樂曲存儲(chǔ)器,能夠動(dòng)態(tài)顯示樂曲的音符,通過SignalTap II邏輯分析儀進(jìn)行在線仿真和硬件測(cè)試,系統(tǒng)控制穩(wěn)定,音質(zhì)效果好,外圍電路簡(jiǎn)單.
關(guān)鍵詞:FPGA;紅外遙控;樂曲;播放器
中圖分類號(hào):TN912.2? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):1673-260X(2019)02-0068-04
1 引言
傳統(tǒng)的音樂播放器主要以單片機(jī)為主控制芯片[1-2],由芯片中的定時(shí)器來產(chǎn)生樂曲的音調(diào)及音調(diào)的持續(xù)時(shí)間,從而實(shí)現(xiàn)樂曲的連續(xù)演奏.由于單片機(jī)運(yùn)行速度及內(nèi)部存儲(chǔ)容量有限,其音調(diào)頻率的精度及樂曲的存儲(chǔ)數(shù)量會(huì)受到一定的限制[3].而FPGA芯片內(nèi)部含有豐富的邏輯陣列、嵌入式存儲(chǔ)器塊、PLL鎖相環(huán)等硬件資源,以FPGA芯片為控制芯片,以Verilog硬件描述語(yǔ)言來設(shè)計(jì)樂曲的播放器,具有低功耗、外圍電路簡(jiǎn)單,速度快、功能可擴(kuò)展等特點(diǎn).樂曲播放器具有上一首、下一首、播放/暫停、自動(dòng)/手動(dòng)和紅外遙控等多種控制模式,能夠動(dòng)態(tài)顯示音符等功能.
2 系統(tǒng)總體結(jié)構(gòu)
系統(tǒng)主要由FPGA核心模塊及系統(tǒng)時(shí)鐘、按鍵模塊、紅外一體接收電路,音樂放大電路等外圍電路組成.系統(tǒng)總體框圖如圖1所示.其中系統(tǒng)時(shí)鐘頻率為50MHz, FPGA采用Altera公司的Cyclone IV系列的EP4C4E10F174CN芯片,F(xiàn)PGA核心模塊包含按鍵消抖模塊、分頻器模塊、樂曲播放模塊、樂譜存儲(chǔ)及動(dòng)態(tài)音符驅(qū)動(dòng)模塊等.
3 系統(tǒng)各模塊的FPGA實(shí)現(xiàn)
3.1 樂曲演奏的基本原理
聲音的頻譜范圍為20Hz~20KHz范圍,樂曲主要由音調(diào)(音符的頻率值)和音長(zhǎng)(持續(xù)時(shí)間)兩個(gè)基本數(shù)據(jù)組成,即只要控制輸出信號(hào)的頻率高低及持續(xù)的時(shí)間就可以使揚(yáng)聲器發(fā)出連續(xù)的樂曲聲.根據(jù)音樂的十二平均率規(guī)定[4]:每?jī)蓚€(gè)八度之間的頻率相差一倍,在兩個(gè)八度音之間,又可分為12個(gè)半音,每?jī)蓚€(gè)半音的頻率比為■,如音名A(簡(jiǎn)譜中的低音6)的頻率為440Hz,音名B到C之間、E到F之間為半音,其余為全音,由此可以計(jì)算出簡(jiǎn)譜中從低音1到高音7之間每個(gè)音名對(duì)應(yīng)的頻率,樂曲就是由一連串的音符組成的,按照樂曲的樂譜依次輸出這些音符所對(duì)應(yīng)音調(diào)的頻率,就可以在揚(yáng)聲器上連續(xù)發(fā)出各個(gè)音符的音調(diào),因此,要演奏一首音樂,關(guān)鍵是控制樂曲中的音符的發(fā)生頻率及樂曲的節(jié)拍的.由于每?jī)蓚€(gè)音的音頻比值(高音比低音)正好是2或是2n,因此,對(duì)于所有八度關(guān)系的樂音除了音高上的差異外,本質(zhì)上聽起來不會(huì)任何區(qū)別.
3.2 樂曲播放控制模塊實(shí)現(xiàn)
準(zhǔn)確獲取音符的發(fā)音頻率及持續(xù)的時(shí)間是樂曲無失真演奏的重要因素,為產(chǎn)生樂譜中不同的音符的頻率,系統(tǒng)采用預(yù)置數(shù)分頻法對(duì)基準(zhǔn)時(shí)鐘信號(hào)進(jìn)行分頻,預(yù)置數(shù)不同,其計(jì)數(shù)值不同分頻數(shù)也不同,就能得到不同的頻率值.由于音階頻率多為非整數(shù),分頻后會(huì)存在或多或少的誤差,一般采用四舍五入法.本設(shè)計(jì)以6MHz的時(shí)鐘信號(hào)為基準(zhǔn)頻率,通過設(shè)置不同的初值使分頻器產(chǎn)生各種音符頻率.如要產(chǎn)生低音的“1”,則分頻數(shù)為6MHz/216.6Hz≈22935.8,即分頻數(shù)約為22936,為提高信號(hào)的驅(qū)動(dòng)能力,使音調(diào)的頻率輸出占空比為50%,則分頻數(shù)為22936/2=11468,其他音符以此類推,本設(shè)計(jì)以C調(diào)為例,各音階頻率、分頻數(shù)、音符編碼之間關(guān)系如表1所示.
音長(zhǎng)即音樂的節(jié)拍,也就是音調(diào)持續(xù)的時(shí)間,以2/4節(jié)拍為例,如果每個(gè)小節(jié)持續(xù)的時(shí)間為1s,則每拍的演奏時(shí)間為0.5s,為提高驅(qū)動(dòng)能力及節(jié)拍精度,系統(tǒng)由占空比為50%的4Hz的時(shí)鐘來產(chǎn)生節(jié)拍信號(hào),即每一個(gè)半節(jié)拍為0.25s.
3.3 基準(zhǔn)時(shí)鐘的產(chǎn)生
基準(zhǔn)時(shí)鐘是產(chǎn)生樂曲音調(diào)的基礎(chǔ),根據(jù)設(shè)計(jì)要求,需要得到音調(diào)所需的6MHz基準(zhǔn)時(shí)鐘和節(jié)拍所需的4Hz信號(hào),為提高時(shí)鐘的精度,采用FPGA內(nèi)部集成的嵌入式鎖相環(huán)PLL來實(shí)現(xiàn),鎖相環(huán)可以與輸入的系統(tǒng)時(shí)鐘信號(hào)同步,并以其作為參考信號(hào)實(shí)現(xiàn)鎖相,從而可以輸出一個(gè)或多個(gè)同步倍頻或分頻的片內(nèi)時(shí)鐘,得到高精度的頻率,以供邏輯系統(tǒng)使用,與直接來自外部的時(shí)鐘相比,這種片內(nèi)時(shí)鐘會(huì)減少時(shí)鐘的延時(shí)和時(shí)鐘信號(hào)的變形,減少干擾,能很好地保證系統(tǒng)穩(wěn)定高速可靠工作.通過設(shè)置ALTPLL模塊的分頻數(shù),由50MHz系統(tǒng)時(shí)鐘得到6MHz和4MHz的頻率,再由4MHz的頻率再經(jīng)過分頻得到占空比為50%的4Hz的節(jié)拍時(shí)鐘信號(hào).從而保證基準(zhǔn)時(shí)鐘的穩(wěn)定性和準(zhǔn)確性.
3.4 樂曲的定制及動(dòng)態(tài)音符的顯示
為提高樂曲的直觀性和可讀性,樂曲中用變量q[11:0]表示音名,其中高4位q[11:8]表示高音的■:■,q[7:4]表示中音的1~7,q[3:0]表示低音的■:■,其編碼方式如表1所示.通過定制FPGA中LPM- ROM存儲(chǔ)音樂數(shù)據(jù),通過改變ROM的地址就可以輸出不同的音符編碼,通過查表可得到不同的分頻預(yù)置數(shù),從而得到不同的音調(diào)頻率,通過控制地址產(chǎn)生的頻率就可以控制樂符輸出的節(jié)拍,以純硬件的方法來實(shí)現(xiàn)樂曲的演奏效果.若要實(shí)現(xiàn)其他樂曲的演奏,只要修改LPM-ROM所存儲(chǔ)的音樂數(shù)據(jù),再重新定制LPM-ROM,就可以實(shí)現(xiàn)其他樂曲的演奏.為使演奏能循環(huán)進(jìn),需另外設(shè)計(jì)置一節(jié)拍時(shí)長(zhǎng)計(jì)數(shù)器,保證演奏完后又重新開始,或跳到下一首的樂曲的首地址.
LPM-ROM中存儲(chǔ)的是樂曲音符的編碼,由3位的BCD碼組成,分別表示不同音階,系統(tǒng)采用3位數(shù)碼管分別動(dòng)態(tài)顯示樂曲中的高中低音的音符,顯示模塊采用動(dòng)態(tài)掃描方式,由8位的段碼信號(hào)和3位的位碼信號(hào)來驅(qū)動(dòng)3位的共陰數(shù)碼管,從而實(shí)現(xiàn)音符的動(dòng)態(tài)顯示.
3.5 按鍵消抖模塊
鍵盤模塊有四個(gè)按鍵:上一首(key_up)、下一首(key_down)、暫停/播放(key_pause);自動(dòng)/手動(dòng)(key_auto).由于機(jī)械按鍵存在抖動(dòng),為保證每按一次,產(chǎn)生一個(gè)負(fù)脈沖,執(zhí)行一次操作,這里采用有限狀態(tài)機(jī)分別對(duì)按鍵按下和釋放進(jìn)行消抖處理[5].其按鍵識(shí)別與消抖的狀態(tài)轉(zhuǎn)換圖如圖2所示.
工作過程:初始狀態(tài)為IDLE,當(dāng)檢測(cè)有下降沿時(shí),進(jìn)入STATE0狀態(tài),并通過一個(gè)計(jì)數(shù)器計(jì)時(shí)電平持續(xù)的時(shí)間.在按鍵按下時(shí),計(jì)數(shù)器開始計(jì)數(shù),并且每個(gè)周期判斷該鍵是否為低電平,如果仍為低電平且計(jì)數(shù)器計(jì)數(shù)值達(dá)一定值(約10ms)后,則按鍵切換標(biāo)志變量key_flag產(chǎn)生一個(gè)高電平脈沖,按鍵狀態(tài)變量key_state為低電平,進(jìn)入穩(wěn)定狀態(tài)DOWN,若計(jì)數(shù)值未達(dá)到預(yù)定值,則為抖動(dòng)重新返回IDLE狀態(tài);在DOWN狀態(tài)時(shí),如果檢測(cè)到上升沿,則進(jìn)入STATE1狀態(tài),啟動(dòng)計(jì)數(shù)器,并且每個(gè)周期判斷該鍵是否仍為高電平,當(dāng)高電平保持時(shí)間達(dá)10ms后,則按鍵切換標(biāo)志變量key_flag產(chǎn)生一個(gè)高電平脈沖,按鍵狀態(tài)變量key_state為高電平,一次完整的按鍵識(shí)別結(jié)束,重新回到IDLE狀態(tài),若計(jì)數(shù)值未達(dá)到預(yù)定值,則為抖動(dòng)重新返回DOWN狀態(tài).如果滿足(key_flag==1&&key_state==0)則按鍵按下有效,按鍵為低電平,如果(key_flag== 1&&key_state==1)則按鍵釋放完成,按鍵為高電平.
3.6 紅外遙控系統(tǒng)接收電路及解碼模塊設(shè)計(jì)
3.6.1 紅外遙控接收電路
紅外遙控系統(tǒng)分為發(fā)射和接收兩部分,紅外發(fā)射部分主要由紅外發(fā)光二極管、矩陣鍵盤、編碼和調(diào)制電路等組成[6],紅外接收部分采用Holtek公司的HT6221一體化紅外接收頭模塊,該接收頭集紅外接收、放大、濾波和比較輸出等模塊功能,性能穩(wěn)定可靠,其接口電路如圖3所示,其中IR輸出信號(hào)接FPGA的紅外遙控解碼模塊.
3.6.2 紅外遙控解碼模塊設(shè)計(jì)
HT6221紅外遙控器是一款基于NEC紅外通信協(xié)議的遙控編碼芯片,其采用脈沖寬度編碼(PPM)的編碼格式,其數(shù)據(jù)幀格式由:引導(dǎo)碼、8位地址碼、8位地址反碼、8位按鍵數(shù)據(jù)碼、8位按鍵數(shù)據(jù)反碼以及1位結(jié)束位組成[7],如圖4所示.
其中,引導(dǎo)碼由9ms高電平和4.5ms的低電平組成,其代表一個(gè)數(shù)據(jù)的幀頭.NEC協(xié)議采用脈沖之間不同時(shí)長(zhǎng)的時(shí)間間隔來區(qū)分“0”和“1”編碼.
編碼“0”是0.56ms高電平+0.56ms的低電平,編碼“1”是0.56ms的高電平+1.69ms的低電平,以上分析的是遙控器發(fā)射端信號(hào)的編碼方法,其接收端信號(hào)的編碼方法與發(fā)射端的編碼電平正好相反.
通過上面的分析可知,能否正確接收一幀數(shù)據(jù),其核心是識(shí)別9ms、4.5ms、0.56ms、1.69ms這四個(gè)關(guān)鍵時(shí)序信號(hào),這里采用4個(gè)計(jì)數(shù)器分別對(duì)這四種時(shí)序信號(hào)進(jìn)行計(jì)時(shí),考慮信號(hào)傳輸時(shí)會(huì)有不同程度的誤差,因此,計(jì)數(shù)值要有一定的范圍.為準(zhǔn)確讀取遙控識(shí)別碼,采用有限狀態(tài)機(jī)來識(shí)別各種控制狀態(tài)及數(shù)據(jù)的接收解碼過程,狀態(tài)轉(zhuǎn)換圖如圖5所示,其中IDLE:空閑狀態(tài),等待紅外一體化輸出信號(hào)IR下降沿到來;LEADER_9:識(shí)別9ms的低電平引導(dǎo)碼;LEADER_45:識(shí)別4.5ms的高電平引導(dǎo)碼,若識(shí)別成功則進(jìn)行讀碼狀態(tài),否則返回空閑狀態(tài).DATA_STATE:讀碼狀態(tài),連續(xù)讀取32位的地址、數(shù)據(jù)信號(hào),若讀完或讀取過程發(fā)生錯(cuò)誤,返回空閑狀態(tài),重新識(shí)別.狀態(tài)機(jī)的編碼采用“0001、0010、0100、1000”的四位獨(dú)熱碼編碼方式,由于設(shè)計(jì)只需要得到遙控器8位的按鍵碼值IR_db[7:0],因此,地址碼及反碼不輸出.紅外遙控解碼模塊接口功能如表2所示.
4 系統(tǒng)仿真與測(cè)試
系統(tǒng)頂層原理圖如圖6所示,由分頻模塊(pll6_4m)、按鍵消抖模塊(key_filt)、音樂控制模塊(music_control)、音曲存儲(chǔ)模塊(music_rom)、紅外一體解碼模塊(IR)及樂曲顯示驅(qū)動(dòng)模塊等組成,系統(tǒng)通過QuartusII軟件進(jìn)行綜合并對(duì)部分模塊進(jìn)行仿真測(cè)試.
首先對(duì)紅外遙控模塊進(jìn)行編譯及管腳分配,并在頂層中嵌入ISSP(In-System Sources and Probes Editor)模塊,探測(cè)口與紅外模塊的IR_db[7:0]連接,并下載到FPGA開發(fā)板中,然后在QuartusII中調(diào)用ISSP,在紅外遙控器中按下不同的功能鍵,觀察prober探測(cè)端口采集的數(shù)據(jù),如在遙控器中按下CH+(按鍵值為47H)和PLAY(按鍵值為43H)鍵,ISSP抓取的數(shù)據(jù)如圖7所示,從圖中看出其IR_db的數(shù)據(jù)值,與HT6221手冊(cè)上的編碼值相同[8].
利用QuartusII集成的SignalTap II邏輯分析儀,對(duì)樂曲播放器電路的音符編碼及音頻等信號(hào)進(jìn)行測(cè)試.SignalTap II提供了一個(gè)不使用外部I/O口引腳就能檢測(cè)內(nèi)部信號(hào)狀態(tài),SignalTap II采樣時(shí)鐘頻率設(shè)為12.8KHz,采樣深度為8K,保存SignalTap II設(shè)置后,編譯并下載至FPGA開發(fā)板,啟動(dòng)SignalTap II邏輯分析儀,對(duì)LPM-ROM的地址信號(hào)addr、樂曲編碼信號(hào)q以及音頻信號(hào)audio進(jìn)行在線采集,采集信號(hào)如圖8所示,從圖中可以看出,地址信號(hào)addr發(fā)生變化,能夠調(diào)用LPM-ROM中的音符編碼,同時(shí)在audio端輸出不同頻率的方波,同時(shí)在開發(fā)板上的揚(yáng)聲器上也能聽到優(yōu)美準(zhǔn)確的樂曲旋律,實(shí)現(xiàn)了預(yù)定的功能,達(dá)到設(shè)計(jì)要求.
5 結(jié)束語(yǔ)
樂曲播放系統(tǒng)采用單片的FPGA完成紅外遙控按鍵碼的識(shí)別、按鍵信號(hào)的采集及樂曲的存儲(chǔ)及播放,能動(dòng)態(tài)顯示音符,經(jīng)實(shí)際電路板測(cè)試音調(diào)準(zhǔn)確,音質(zhì)效果好,控制靈活,樂曲可根據(jù)用戶需求隨意變更或自行增加,具有功能擴(kuò)展方便,且外圍電路簡(jiǎn)單,穩(wěn)定可靠等特點(diǎn),可應(yīng)用于車載MP3等場(chǎng)合.
參考文獻(xiàn):
〔1〕邱燕.基于51單片機(jī)音樂播放器的設(shè)計(jì)[J].通訊世界,2016(10):252-253.
〔2〕何諧,唐大權(quán),張淑廷等.一種基于51單片機(jī)的音樂播放器的設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2014,36(16):11-13.
〔3〕劉垣,李外云,趙嘉怡.基于STC單片機(jī)WAVE音樂播放器的設(shè)計(jì)與實(shí)現(xiàn)[J].科技創(chuàng)新與應(yīng)用,2015(34):50-51.
〔4〕段耀勇,劉鵬,周瑞琪.中國(guó)傳統(tǒng)數(shù)學(xué)與“十二平均率”的產(chǎn)生[J].贛南師范學(xué)院學(xué)報(bào),2005(6):22-24.
〔5〕于晶,楊曉慧,黃勇.基于FPGA的按鍵消抖電路設(shè)計(jì)方法的研究[J].電子設(shè)計(jì)工程,2011,19(22):1-3.
〔6〕崔巖,吳國(guó)興,顧媛媛,等.基于FPGA的紅外遙控密碼鎖的設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2013,39(11):44-46.
〔7〕常濤,雪琦.基于FPGA的紅外遙控信號(hào)接收模塊設(shè)計(jì)[J].電子元器件應(yīng)用,2010,13(5):44-46.
〔8〕袁玉卓,曾凱鋒,梅雪松.FPGA自學(xué)筆記-設(shè)計(jì)與驗(yàn)證[M].北京航空航天大學(xué)出版社,2017.8.