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