基于FPGA的以太網(wǎng)音頻廣播系統(tǒng),軟硬件協(xié)同
1、課題背景:
課題來源:傳統(tǒng)的廣播系統(tǒng)從傳送音頻信號(hào)到廣播點(diǎn),都須鋪設(shè)專門的線路且傳送的事模擬音頻信號(hào),模擬音頻信號(hào)抗干擾能力弱,長距離的信號(hào)傳輸勢(shì)必造成信號(hào)的衰減,很難保證聲音質(zhì)量。同時(shí)為了對(duì)廣播的方式進(jìn)行控制,控制信號(hào)必須通過另外的控制線來傳送,布線復(fù)雜,成本高,施工及維修困難。采用互聯(lián)網(wǎng)技術(shù)和音頻流技術(shù)實(shí)現(xiàn)在以太網(wǎng)上以數(shù)字化方式傳輸多路音頻信號(hào),使廣播點(diǎn)可以連續(xù)、實(shí)時(shí)地收聽高品質(zhì)聲音,實(shí)現(xiàn)零布線設(shè)計(jì)。以太網(wǎng)數(shù)字音頻廣播系統(tǒng)定位于公用廣播系統(tǒng),主要應(yīng)用于車站、機(jī)場(chǎng)、碼頭等廣場(chǎng)和學(xué)校、大型商場(chǎng)等場(chǎng)合的廣播。主要采用以太網(wǎng)絡(luò)技術(shù),將音頻信號(hào)以TCP/IP協(xié)議形式在以太網(wǎng)上進(jìn)行傳送和接收,解決了傳統(tǒng)廣播系統(tǒng)存在的音質(zhì)不佳、易受干擾、維護(hù)管理復(fù)雜、互動(dòng)性能差等問題。
需求分析:以太網(wǎng)數(shù)字音頻廣播系統(tǒng)可廣泛應(yīng)用于車站、機(jī)場(chǎng)、學(xué)校、大廈等場(chǎng)合,具有低失真度、傳輸距離遠(yuǎn)、高可靠性、易于安裝布線等優(yōu)點(diǎn),可實(shí)現(xiàn)實(shí)時(shí)廣播、自由點(diǎn)播、多路分區(qū)播音,具有廣闊的應(yīng)用前景。以太網(wǎng)作為一種比較成熟的網(wǎng)絡(luò)已經(jīng)廣泛應(yīng)用于各個(gè)領(lǐng)域,其TCP/IP協(xié)議也成為事實(shí)上的標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議。傳統(tǒng)以PC機(jī)為中心的互聯(lián)網(wǎng)應(yīng)用現(xiàn)已開始轉(zhuǎn)向以嵌入式為中心。利用FPGA來實(shí)現(xiàn)嵌入式系統(tǒng)設(shè)計(jì),可以克服定制電路的不足,系統(tǒng)設(shè)計(jì)更加靈活,易于依不同的需要進(jìn)行修改。引入軟處理器和嵌入式操作系統(tǒng),并結(jié)合使用LwIP協(xié)議棧,能夠降低系統(tǒng)平臺(tái)的設(shè)計(jì)復(fù)雜度,可縮短開發(fā)周期,提高系統(tǒng)的穩(wěn)定性和可靠性,軟硬件系部分可分離的設(shè)計(jì)架構(gòu),使得對(duì)系統(tǒng)進(jìn)行修改和重構(gòu)非常方便。
國內(nèi)外研究現(xiàn)狀:以太網(wǎng)數(shù)字音頻廣播系統(tǒng)定位于公用廣播系統(tǒng),主要應(yīng)用于車站、機(jī)場(chǎng)、碼頭等廣場(chǎng)和大廈等場(chǎng)合的廣播。主要特點(diǎn)采用當(dāng)今世界最廣泛使用的以太網(wǎng)絡(luò)技術(shù),將音頻信號(hào)以TCP/IP協(xié)議形式在以太網(wǎng)上進(jìn)行傳送和接收,徹底解決了傳統(tǒng)廣播系統(tǒng)存在的音質(zhì)不佳容易受到干擾,維護(hù)管理復(fù)雜,互動(dòng)性能差等問題。現(xiàn)有的廣播系統(tǒng)可采用多路定向?qū)ぶ返燃夹g(shù)實(shí)現(xiàn)對(duì)廣播節(jié)目播出、接收的智能化管理,安裝在不同區(qū)域的廣播終端可以實(shí)時(shí)接收廣播數(shù)據(jù),突破了傳統(tǒng)廣播系統(tǒng)只能對(duì)全部區(qū)域進(jìn)行公共廣播的局限,并且廣播終端可以是移動(dòng)的(在局域網(wǎng)范圍內(nèi)),并涵蓋了傳統(tǒng)廣播系統(tǒng)的所有功能,包括音樂播放、實(shí)時(shí)講話、播送通知和轉(zhuǎn)播電臺(tái)節(jié)目等。以太網(wǎng)廣播系統(tǒng)具有良好的可靠性、穩(wěn)定性、低失真度、易于安裝布線等優(yōu)點(diǎn),有著廣闊的發(fā)展及應(yīng)用前景,目前已廣泛應(yīng)用于校園廣播、大型商場(chǎng)及公司內(nèi)部廣播。以太網(wǎng)數(shù)字音頻廣播系統(tǒng)可實(shí)現(xiàn)的功能有:多路分區(qū)播音、自由點(diǎn)播、實(shí)時(shí)插播、移動(dòng)播音,并可實(shí)現(xiàn)遠(yuǎn)程管理及監(jiān)控。
2、功能描述:
功能:本系統(tǒng)將實(shí)時(shí)錄制的音頻文件利用以太網(wǎng),以UDP傳輸方式實(shí)現(xiàn)實(shí)時(shí)的信號(hào)的發(fā)送、接收與播放。
- 實(shí)況音頻流服務(wù)器:完成模擬語音信號(hào)的采集,將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),通過以太網(wǎng)上,發(fā)送到終端進(jìn)行接收和播放,滿足用戶播放實(shí)時(shí)聲音的需求;
- 基于FPGA的廣播終端:實(shí)時(shí)接收以太網(wǎng)傳送的數(shù)字音頻信號(hào),存儲(chǔ)并轉(zhuǎn)發(fā)至音頻D/A轉(zhuǎn)換器,將所接收到的數(shù)字信號(hào)解碼轉(zhuǎn)換成模擬信號(hào),并輸出到音響設(shè)備進(jìn)行播放。
- 擴(kuò)展功能:實(shí)現(xiàn)多個(gè)廣播終端的同時(shí)工作;廣播先前已存儲(chǔ)的音頻文件數(shù)據(jù)。
技術(shù)指標(biāo):實(shí)時(shí)傳輸并播放語音信號(hào),可用于遠(yuǎn)程管理,具有低失真度,高可靠性的特征。
3、總體設(shè)計(jì):
以太網(wǎng)數(shù)字音頻廣播系統(tǒng)分為兩個(gè)部分:音頻數(shù)據(jù)采集發(fā)送端和音頻數(shù)據(jù)接收播放端,通過以太網(wǎng)發(fā)送實(shí)時(shí)語音信號(hào)實(shí)現(xiàn)遠(yuǎn)端實(shí)時(shí)接收和播放功能。
系統(tǒng)硬件結(jié)構(gòu)框架:
圖1以太網(wǎng)音頻廣播系統(tǒng)框圖
數(shù)據(jù)流程:
圖2音頻數(shù)據(jù)采集與發(fā)送模塊數(shù)據(jù)流程圖
圖3音頻數(shù)據(jù)接收與播放模塊流程圖
各模塊功能:
①音頻數(shù)據(jù)采集與發(fā)送模塊:通過編程實(shí)現(xiàn)語音信號(hào)的采集、存儲(chǔ),根據(jù)接收端的IP地址,將語音信號(hào)壓縮成廣播包以UDP傳輸方式發(fā)送出去。
②音頻數(shù)據(jù)接收與播放模塊:由Spartan3E FPGA開發(fā)板接收以太網(wǎng)傳來的IP包,進(jìn)行存儲(chǔ),轉(zhuǎn)發(fā)到音頻D/A轉(zhuǎn)換器進(jìn)行解碼,送交音響設(shè)備播放。
4、方案論證:
設(shè)計(jì)思想:采用FGPA模塊接收以太網(wǎng)傳來的數(shù)字語音信號(hào),并進(jìn)行存儲(chǔ),再通過音頻D/A轉(zhuǎn)換器將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)在音響設(shè)備上進(jìn)行播放。分為兩個(gè)部分實(shí)現(xiàn):語音信號(hào)采集與發(fā)送部分和信號(hào)接收與播放部分。①語音信號(hào)采集模塊(編程實(shí)現(xiàn))在PC機(jī)上進(jìn)行,然后采用UDP傳輸方式以IP廣播包方式通過以太網(wǎng)發(fā)送出去。②接收端是在FPGA開發(fā)板上實(shí)現(xiàn)語音數(shù)據(jù)包的接收,并將數(shù)據(jù)處理后送給音頻解碼芯片進(jìn)行解碼,轉(zhuǎn)換成模擬信號(hào)進(jìn)行播放。
方案論證:本系統(tǒng)采用服務(wù)器端和廣播終端的架構(gòu),由音頻流服務(wù)器采集、處理語音信號(hào),通過以太網(wǎng)進(jìn)行傳輸,然后由Spartan 3E作為廣播終端來接收以太網(wǎng)傳輸?shù)臄?shù)據(jù),并進(jìn)行D/A轉(zhuǎn)換處理后輸送到播放設(shè)備。
服務(wù)器端的設(shè)計(jì):服務(wù)器端在PC機(jī)上實(shí)現(xiàn),主要完成語音數(shù)據(jù)的采集、存儲(chǔ)和發(fā)送。其中,語音數(shù)據(jù)的采集和存儲(chǔ)采用WAVE音頻函數(shù)來實(shí)現(xiàn)。使用WAVE低級(jí)音頻函數(shù),可直接與音頻驅(qū)動(dòng)程序交互,通過窗口消息或回調(diào)函數(shù)來管理音頻數(shù)據(jù)塊的錄入和存儲(chǔ),并提供了一個(gè)設(shè)備無關(guān)接口。在使用音頻設(shè)備之前,必須打開設(shè)備驅(qū)動(dòng)程序,確定系統(tǒng)音頻設(shè)備的能力,用完之后必須關(guān)閉音頻設(shè)備。具體流程如下:
①查詢?cè)O(shè)備數(shù)目。使用waveInGetNumDevs函數(shù)來獲取波形輸入設(shè)備的個(gè)數(shù)。只有確定設(shè)備存在,才能打開、使用設(shè)備。
②打開波形輸入設(shè)備。使用waveInOpen函數(shù),該函數(shù)打開與指定設(shè)備ID相關(guān)聯(lián)的設(shè)備,并以給出指定內(nèi)存句柄的方法放回打開波形設(shè)備的句柄。需要在waveInOpen中指定的一個(gè)回調(diào)函數(shù)或者線程,其作用是在一個(gè)數(shù)據(jù)緩沖區(qū)被錄滿后被調(diào)用,以對(duì)這些數(shù)據(jù)進(jìn)行處理,和其他一些相關(guān)的操作。
③準(zhǔn)備音頻數(shù)據(jù)塊。在音頻數(shù)據(jù)錄入之前,必須準(zhǔn)備好音頻數(shù)據(jù)塊。將數(shù)據(jù)塊傳送給設(shè)備驅(qū)動(dòng)程序就可以開始錄音了。使用waveInPerpareHeader函數(shù)為輸入緩沖區(qū)準(zhǔn)備頭部,使用waveInAddBuffer函數(shù)添加一個(gè)輸入用的數(shù)據(jù)緩沖區(qū)。在用完數(shù)據(jù)塊后,必須用waveInUnprepareHeader函數(shù)來清除對(duì)音頻數(shù)據(jù)塊的準(zhǔn)備。
④開始錄音。使用waveInStart函數(shù)。
⑤停止錄音,關(guān)閉設(shè)備。調(diào)用waveInReset和waveInClose函數(shù)。結(jié)束錄音時(shí),在waveInClose之前先調(diào)用waveInReset,以清除尚在等待錄音的緩沖區(qū)。
錄音過程中,若緩沖區(qū)已滿,但錄音還在繼續(xù),為防止語音數(shù)據(jù)丟失,就需要再加入一個(gè)緩沖區(qū)進(jìn)去??紤]到添加緩沖區(qū)的處理是有時(shí)間延遲的,而音頻對(duì)時(shí)間很敏感,所以要預(yù)先設(shè)置好至少兩個(gè)數(shù)據(jù)緩沖區(qū)。當(dāng)一個(gè)緩沖區(qū)滿時(shí),就調(diào)用另外一個(gè),即可保證所錄得的音頻數(shù)據(jù)不會(huì)有斷開的間隔。錄制波形音頻時(shí)如果緩沖區(qū)已滿,系統(tǒng)將發(fā)送MM_WIM_DATA消息給應(yīng)用程序,程序接收到這個(gè)消息后,就可以從消息帶回的參數(shù)中得到緩沖區(qū)的指針,從而讀出緩沖區(qū)的數(shù)據(jù),或?qū)?shù)據(jù)進(jìn)行處理,并且該緩沖區(qū)的數(shù)據(jù)讀完后要用waveInAddBuffer函數(shù)將緩沖區(qū)重新送入設(shè)備,循環(huán)利用。在本設(shè)計(jì)中采用兩個(gè)緩沖區(qū)來存放語音數(shù)據(jù)。
音頻數(shù)據(jù)的發(fā)送:數(shù)據(jù)發(fā)送采用MFC的CSocket類來實(shí)現(xiàn)。CSocket類是由CAsyncSocket類繼承而來,與CSocketFile類和CArchive類一起工作來發(fā)送和接收數(shù)據(jù)。軟件實(shí)現(xiàn):當(dāng)數(shù)據(jù)緩沖區(qū)滿時(shí),需要將已采集到的語音數(shù)據(jù)通過以太網(wǎng)發(fā)送出去,這就要用到Socket網(wǎng)絡(luò)傳輸。利用CSocket類創(chuàng)建一個(gè)套接字,然后將錄音緩沖區(qū)中采集到的語音數(shù)據(jù)依次封裝成IP包進(jìn)行發(fā)送。語音數(shù)據(jù)發(fā)送流程圖如圖4所示:
圖4 數(shù)據(jù)發(fā)送流程圖
要實(shí)現(xiàn)語音信號(hào)的實(shí)時(shí)播放,必須對(duì)語音信號(hào)進(jìn)行實(shí)時(shí)傳輸,所以在以太網(wǎng)上傳輸數(shù)據(jù)采用UDP傳輸方式。雖然TCP提供一種面向連接的、可靠的字節(jié)流服務(wù),可以實(shí)現(xiàn)數(shù)據(jù)的可靠傳輸與出錯(cuò)重傳,但是這也導(dǎo)致了TCP協(xié)議對(duì)資源的占用更多。TCP主要適用于對(duì)數(shù)據(jù)的完整性要求很高的網(wǎng)絡(luò)傳輸?shù)膽?yīng)用。UDP不一定提供可靠的數(shù)據(jù)傳輸,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,并不保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)之前不用在客戶和服務(wù)器之間建立連接,沒有超時(shí)重發(fā)機(jī)制,所以傳輸速度很快。當(dāng)某個(gè)程序的目標(biāo)是盡快地傳輸盡可能多的信息,強(qiáng)調(diào)傳輸性能而不是傳輸?shù)耐暾詴r(shí),如音頻和多媒體應(yīng)用,UDP是最好的選擇。
錄音緩沖區(qū)的大小為1024個(gè)字節(jié),這樣才能避免語音信號(hào)丟失,但是在系統(tǒng)終端對(duì)語音數(shù)據(jù)包進(jìn)行處理的時(shí)候,如果數(shù)據(jù)包過大,則產(chǎn)生嚴(yán)重的噪音,因此系統(tǒng)終端要求接收到的語音數(shù)據(jù)IP包不能過大,設(shè)計(jì)中終端處理IP包的大小為128個(gè)字節(jié),這樣當(dāng)服務(wù)器端錄音緩沖區(qū)滿時(shí),需要對(duì)數(shù)據(jù)進(jìn)行分割,封裝成IP數(shù)據(jù)包,然后再發(fā)送。這里要采用廣播地址。在局域網(wǎng)內(nèi)實(shí)現(xiàn)廣播,只需將IP地址中主機(jī)部分設(shè)為全1,本設(shè)計(jì)中IP廣播地址設(shè)為192.168.1.255。
廣播系統(tǒng)可以有多個(gè)廣播終端,既可實(shí)現(xiàn)全區(qū)域的廣播,還可以實(shí)現(xiàn)局域廣播,即對(duì)指定的終端進(jìn)行廣播。要實(shí)現(xiàn)對(duì)指定的終端的廣播,服務(wù)器端必須知道各個(gè)終端的IP地址,然后才能實(shí)施對(duì)應(yīng)的廣播??紤]到終端數(shù)量不多而且是在相對(duì)固定的局域網(wǎng)中,采用靜態(tài)IP地址分配,其特點(diǎn)是IP地址對(duì)每一臺(tái)計(jì)算機(jī)都是固定的??梢詫⒏鱾€(gè)終端的IP地址寫入一個(gè)配置文檔,如:“IPADDR.txt”。服務(wù)器首先讀取配置文檔中的IP地址,將終端IP地址與服務(wù)器端的終端號(hào)進(jìn)行綁定,然后每次選定廣播終端時(shí)也得到了對(duì)應(yīng)終端的IP地址,即可實(shí)現(xiàn)區(qū)域廣播了。另一方面,也必須使終端能夠判斷出所接收到的IP包是不是發(fā)給自己的。是則存儲(chǔ)并轉(zhuǎn)發(fā)給音頻解碼器;不是則丟棄??梢栽贗P包頭進(jìn)行設(shè)置,廣播終端根據(jù)IP數(shù)據(jù)包包頭來判斷數(shù)據(jù)是否發(fā)給自己。IP數(shù)據(jù)包采用廣播包的形式進(jìn)行數(shù)據(jù)傳輸。
可以將廣播的內(nèi)容保存下來以便在以后可以使用。本設(shè)計(jì)對(duì)每次廣播的內(nèi)容進(jìn)行了存儲(chǔ),存儲(chǔ)文件設(shè)置為Record.wav。每次錄音緩沖區(qū)滿時(shí),即將IP廣播包發(fā)送出去,同時(shí)對(duì)其進(jìn)行存儲(chǔ),在文件末尾將數(shù)據(jù)寫入文件,并改變文件的長度。
廣播終端的設(shè)計(jì):要實(shí)現(xiàn)FPGA與以太網(wǎng)的通信,可以將FPGA終端設(shè)計(jì)為一個(gè)嵌入式系統(tǒng),即采用基于FPGA的嵌入式系統(tǒng)實(shí)現(xiàn)以太網(wǎng)的互聯(lián)??梢岳肵ilinx的MicroBlaze微處理器軟核和相應(yīng)的外設(shè),通過Xilinx EDK搭建系統(tǒng)所需的軟硬件平臺(tái),完成嵌入式系統(tǒng)的設(shè)計(jì)。FPGA控制著以太網(wǎng)物理層的操作,內(nèi)置一個(gè)符合MII標(biāo)準(zhǔn)的以太網(wǎng)控制器MAC,F(xiàn)PGA通過MII連接到開發(fā)板上的LAN83C185 Ethernet PHY,以便和以太網(wǎng)進(jìn)行通信,接收以太網(wǎng)發(fā)送給本終端的IP數(shù)據(jù)包,進(jìn)行存儲(chǔ),并轉(zhuǎn)發(fā)給音頻解碼芯片進(jìn)行播放。
硬件部分:
硬件電路結(jié)構(gòu)分為兩個(gè)部分,基于Spartan 3E開發(fā)板的音頻數(shù)據(jù)接收模塊和音頻解碼模塊。
Xilinx Spartan 3E開發(fā)板上的XC3S500E FPGA作為控制芯片,在EDK中配置MicroBlaze微處理軟核作為CPU,配置FPGA內(nèi)置Ethernet MAC IP核(MAC是EDK開發(fā)平臺(tái)的一部分),外部存儲(chǔ)器采用DDR SDRAM,采用Xilkernel嵌入式操作系統(tǒng)和LwIP協(xié)議棧,構(gòu)建一個(gè)完整的嵌入式系統(tǒng)實(shí)現(xiàn)以太網(wǎng)互聯(lián)。
硬件結(jié)構(gòu)圖如圖5所示:
圖5 硬件結(jié)構(gòu)圖
MicroBlaze微處理器軟核是可嵌入在FPGA中的RISC處理器軟核,采用哈佛結(jié)構(gòu)的32位指令和數(shù)據(jù)總線,具有運(yùn)行速度快、占用資源少、可配置性強(qiáng)等優(yōu)點(diǎn),支持CoreConnect總線,和其他外設(shè)一起可以完成可編程片上系統(tǒng)的設(shè)計(jì)。特征:32個(gè)32位通用寄存器和2個(gè)專用寄存器;32位指令系統(tǒng),支持3個(gè)操作數(shù)和2種尋址方式;分離的32位指令與數(shù)據(jù)總線,符合IBM的OPB總線規(guī)范;通過本地存儲(chǔ)器總線(LMB)直接訪問片內(nèi)塊存儲(chǔ)器;具有高速的指令和數(shù)據(jù)緩存(cache),三級(jí)流水線結(jié)構(gòu);具有硬件調(diào)試模塊;帶8個(gè)輸入輸出快速鏈路接口。
EDK開發(fā)流程:
EDK:所有的系統(tǒng)設(shè)計(jì)包括后面的應(yīng)用程序開發(fā)設(shè)計(jì)均在嵌入式開發(fā)套件軟件EDK內(nèi)完成。EDK(Embedded Development Kit)是針對(duì)FPGA內(nèi)部32位嵌入式處理器開發(fā)而推出的開發(fā)套件,EDK工具包中集成了硬件平臺(tái)產(chǎn)生器、軟件平臺(tái)產(chǎn)生器、仿真模型生成器、軟件編譯器和軟件調(diào)試等工具,利用其集成開發(fā)環(huán)境XPS(Xilinx Platform Studio)可以很方便、快速地完成嵌入式系統(tǒng)開發(fā)的整個(gè)流程。EDK以IP核的形式提供LMB、OPB總線接口、外部存儲(chǔ)控制器、SDRAM控制器、UART中斷控制器、定時(shí)器及其他一些外圍設(shè)備接口等資源,利用這些資源可以構(gòu)建一個(gè)完善的嵌入式處理器系統(tǒng)。這些IP核都有相應(yīng)的設(shè)備驅(qū)動(dòng)和應(yīng)用接口,使用者只需利用相應(yīng)的函數(shù)庫,就可以編寫自己的應(yīng)用軟件和算法程序。
首先完成系統(tǒng)硬件平臺(tái)的搭建和相應(yīng)的驅(qū)動(dòng)配置。在EDK的XPS中先使用基本的系統(tǒng)生成向?qū)SB,自動(dòng)生成MicroBlaze系統(tǒng)的基本構(gòu)架,設(shè)置處理器時(shí)鐘頻率為50MHz,總線時(shí)鐘頻率為50MHz,設(shè)置片上讀寫調(diào)試模塊為調(diào)試接口。生成結(jié)束時(shí)XPS可以自動(dòng)地生成對(duì)硬件進(jìn)行例化的微處理器硬件規(guī)范文件MHS和描述軟件系統(tǒng)結(jié)構(gòu)的微處理器軟件規(guī)范文件MSS以及一些相關(guān)的文件,對(duì)這兩個(gè)文件進(jìn)行修改,以便完成對(duì)系統(tǒng)的優(yōu)化。生成的系統(tǒng)經(jīng)過綜合、布局布線無誤后生成bit文件下載到目標(biāo)開發(fā)板上。
系統(tǒng)軟件平臺(tái):
在硬件系統(tǒng)建立后,利用XPS的集成工具,完成網(wǎng)標(biāo)的生成核軟件的配置,存儲(chǔ)器地址映射默認(rèn)由系統(tǒng)自動(dòng)生成,自動(dòng)分配地址。
為了能夠更好地管理系統(tǒng)資源,選擇Xilinx 精簡(jiǎn)嵌入式操作系統(tǒng)Xilkernel,它是一種可定制的簡(jiǎn)單高效系統(tǒng),能夠與用EDK形成的硬件系統(tǒng)緊密結(jié)合,并支持可移植操作系統(tǒng)界面POSIX開放結(jié)構(gòu)。Xilkernel系統(tǒng)的設(shè)置可以在開發(fā)環(huán)境EDK中手動(dòng)設(shè)置,需要配置調(diào)度原則為SCHED_RR(simple round-robin scheduling),并設(shè)置一個(gè)靜態(tài)線程用于初始化要使用的LwIP協(xié)議棧。Xilkernel操作系統(tǒng)通過移植LwIP協(xié)議棧就可以實(shí)現(xiàn)基于Socket的網(wǎng)絡(luò)通信。LwIP協(xié)議棧支持服務(wù)器模式和客戶機(jī)模式,提供RAW和Socket兩種API,是目前使用最為廣泛的TCP/IP協(xié)議棧。本設(shè)計(jì)中采用Socket API模式,利用Libgen工具對(duì)LwIP庫進(jìn)行鏈接和編譯。
在Xilkernel中設(shè)置一個(gè)靜態(tài)線程serverThread來初始化LwIP協(xié)議棧,即可以使用協(xié)議棧提供的功能函數(shù)。調(diào)用LwIP的線程生成函數(shù)sys_thread_new()生成并啟動(dòng)一個(gè)線程。在這個(gè)線程中設(shè)置開發(fā)板硬件的MAC地址、網(wǎng)關(guān)、IP地址和子網(wǎng)掩碼等參數(shù)。分配內(nèi)存空間開發(fā)板的網(wǎng)絡(luò)接口,再將MAC地址、網(wǎng)關(guān)、IP地址等信息添加到內(nèi)存空間,初始化網(wǎng)絡(luò)接口。
在設(shè)置好系統(tǒng)的軟件平臺(tái)后就可以編寫各種關(guān)于網(wǎng)絡(luò)傳輸控制的應(yīng)用程序了。使用標(biāo)準(zhǔn)C語言進(jìn)行應(yīng)用程序開發(fā),編寫相應(yīng)的算法軟件,將編寫的程序代碼利用mb-gcc編譯工具,根據(jù)系統(tǒng)軟件環(huán)境,生成.ELF文件,完成系統(tǒng)功能的實(shí)現(xiàn),通過JTAG接口連到目標(biāo)開發(fā)板上,將軟件程序下載到系統(tǒng)中進(jìn)行調(diào)試。
程序設(shè)計(jì)思路:
終端同樣需要Socket編程,以接收從以太網(wǎng)傳送來的音頻數(shù)據(jù)。為了實(shí)現(xiàn)數(shù)據(jù)的順序存儲(chǔ)與轉(zhuǎn)發(fā),定義一個(gè)循環(huán)隊(duì)列來存儲(chǔ)接收到的數(shù)據(jù)。
struct Queue
{ int front; //隊(duì)首
int rear; //隊(duì)尾
int count;
char DATA[QueueSize][SIZE];
};
初始化一個(gè)Socket,將它與IP地址和端口號(hào)綁定,然后開始監(jiān)聽網(wǎng)絡(luò),一旦監(jiān)聽到網(wǎng)絡(luò)上有數(shù)據(jù)到來,就生成一個(gè)線程去處理。先定義一個(gè)結(jié)構(gòu)體struct CSTRING,包含目的終端的IP地址,終端通過判斷其成員變量,與自己的IP地址進(jìn)行比較。若有成員變量與自己的IP地址相同,則存儲(chǔ)數(shù)據(jù)包中數(shù)據(jù)到循環(huán)隊(duì)列中。還需要定義一個(gè)接收數(shù)據(jù)結(jié)構(gòu)體struct RECVBUFFER,來存放所接收到的音頻數(shù)據(jù),并且struct CSTRING IP作為它的一個(gè)成員用于判斷目的IP包地址。
struct RECVBUFFER
{ INT32 count;
struct CSTRING IP; //用來判斷IP包是不是發(fā)給自己的
INT8 recvbuffer[SIZE]; //接收數(shù)據(jù)緩沖區(qū)
}RecvBuffer; //接收數(shù)據(jù)的結(jié)構(gòu)體
Socket接收函數(shù)接收數(shù)據(jù)到一個(gè)數(shù)據(jù)緩沖區(qū),然后對(duì)數(shù)據(jù)包進(jìn)行判斷,根據(jù)IP數(shù)據(jù)包頭判斷該包是不是發(fā)給自己的,若是,將數(shù)據(jù)放入循環(huán)隊(duì)列以待轉(zhuǎn)發(fā),否則丟棄。在以太網(wǎng)范圍內(nèi)實(shí)現(xiàn)音頻廣播,終端以太網(wǎng)控制器IP地址要和服務(wù)器處在同一個(gè)網(wǎng)段內(nèi),設(shè)置本地IP地址和端口號(hào),并綁定到服務(wù)器地址。
廣播終端的實(shí)現(xiàn)還需要連接一個(gè)音頻D/A轉(zhuǎn)換器,將開發(fā)板上輸出的數(shù)字音頻信號(hào)轉(zhuǎn)換為模擬音頻信號(hào)。在本設(shè)計(jì)中采用VS1003音頻解碼器。VS1003是一個(gè)單片MP3/WMA/MIDI音頻解碼器和ADPCM編碼器,包含一個(gè)高性能、自主產(chǎn)權(quán)的低功耗DSP處理器核VS_DSP,工作數(shù)據(jù)存儲(chǔ)器,串行的控制和數(shù)據(jù)接口,4個(gè)常規(guī)用途的I/O口,一個(gè)UART,一個(gè)高品質(zhì)可變采樣率的ADC和立體聲DAC,還有一個(gè)耳機(jī)放大器和地線緩沖器。VS1003通過一個(gè)串行口來接收輸入的比特流 。數(shù)據(jù)流程:首先音頻數(shù)據(jù)從SDI接收并解碼,若其SCI_AIADDR非零則應(yīng)用代碼從寄存器所指向的地址開始執(zhí)行;然后數(shù)據(jù)流是否經(jīng)過低音/高音增強(qiáng)器,取決于SCI_BASS寄存器;之后數(shù)據(jù)流向音量控制單元,同時(shí)拷貝數(shù)據(jù)進(jìn)音頻FIFO,鎖存住數(shù)據(jù),通過音頻中斷將數(shù)據(jù)送進(jìn)采樣率變換器和DAC;采樣率變換器將所有不同的采樣率變?yōu)閄TALI/2或128次最高可用采樣率;過采樣的輸出被片上的模擬濾波器進(jìn)行低通濾波;濾波后的信號(hào)前往耳機(jī)放大器。
VS1003通過一個(gè)串行接口來接收輸入的比特流,所以要實(shí)現(xiàn)VS1003與FPGA的互連,還需要在開發(fā)板上模擬實(shí)現(xiàn)SPI總線接口。SPI——串行外設(shè)接口總線系統(tǒng)是一種同步串行外設(shè)接口,允許MCU與各種外設(shè)以串行方式進(jìn)行通信、數(shù)據(jù)交換。在內(nèi)部硬件實(shí)際上是兩個(gè)簡(jiǎn)單的移位寄存器,傳輸?shù)臄?shù)據(jù)為8位。一般使用4條線:串行時(shí)鐘線(SCK)、主機(jī)輸入從機(jī)輸出數(shù)據(jù)線(MISO)、主機(jī)輸出從機(jī)輸入數(shù)據(jù)線(MOSI)和低電平有效的從機(jī)選擇線/SS,即可實(shí)現(xiàn)與具有SPI總線接口功能的各種I/O器件進(jìn)行通信,而擴(kuò)展并行總線則需要8根數(shù)據(jù)線、8~16位地址線、2~3位控制線,因此采用SPI總線接口可以簡(jiǎn)化電路設(shè)計(jì),提高設(shè)計(jì)的可靠性。在本設(shè)計(jì)中,從器件是vs1003音頻解碼器,在主器件產(chǎn)生的從器件時(shí)能和移位脈沖作用下,才能接收主機(jī)傳送的數(shù)據(jù),其數(shù)據(jù)傳輸格式是高位(MSB)在前,低位(LSB)在后。
FGPA為主控芯片,vs1003為從芯片,選擇開發(fā)板上與FPGA連接的Hirose FX2擴(kuò)展連接器模擬實(shí)現(xiàn)SPI接口,實(shí)際上是對(duì)SPI時(shí)序的模擬。FPGA的I/O口與Hirose FX2擴(kuò)展連接器相連,雙向I/O口都可以驅(qū)動(dòng)或接收信號(hào)。選擇FX2連接器上的FX2_CLKOUT模擬實(shí)現(xiàn)SPI接口的時(shí)鐘輸出線,一個(gè)I/O(如FX2_IO1)口模擬實(shí)現(xiàn)MOSI數(shù)據(jù)線,一個(gè)I/O(如FX2_IO2)口模擬實(shí)現(xiàn)/SS選擇線。SPI數(shù)據(jù)傳輸模式采用模式0(CPOL=0,CPHA=0)。數(shù)據(jù)傳輸流程:首先主控芯片F(xiàn)PGA要使能相應(yīng)的/SS信號(hào)(FX2_IO2,直到數(shù)據(jù)發(fā)送完畢),通知從芯片即VS1003數(shù)據(jù)傳輸要開始了;主控芯片產(chǎn)生SPI時(shí)鐘脈沖,將數(shù)據(jù)從每個(gè)時(shí)鐘下降沿發(fā)送出去,每次發(fā)送1bit,從高位開始發(fā)送;待數(shù)據(jù)發(fā)送完畢,主控芯片復(fù)位/SS信號(hào),SPI傳輸結(jié)束。
系統(tǒng)設(shè)計(jì)中的難點(diǎn)與重點(diǎn):
(1)音頻信號(hào)的采集;
(2)IP廣播包的UDP傳輸;
(3)廣播終端對(duì)音頻信號(hào)的接收;
(4)FPGA控制芯片與VS1003解碼芯片之間的數(shù)據(jù)傳輸。
5、項(xiàng)目預(yù)期成果:
實(shí)現(xiàn)音頻數(shù)據(jù)的以太網(wǎng)上實(shí)時(shí)UDP傳輸,同步播放,支持多個(gè)廣播終端同時(shí)工作,實(shí)現(xiàn)網(wǎng)絡(luò)廣播功能。
評(píng)論