隨著軟件無(wú)線電思想與技術(shù)的發(fā)展,現(xiàn)代數(shù)字通信系統(tǒng)中,越來(lái)越多地使用DSP等數(shù)字信號(hào)處理器結(jié)合高速AD、DA轉(zhuǎn)換器進(jìn)行OSI 7層通信體系模型中物理層(信號(hào)的調(diào)制、解調(diào))和數(shù)據(jù)鏈路層(信道編、解碼)部分的數(shù)據(jù)處理工作。近年來(lái),數(shù)字信號(hào)處理理論發(fā)展迅猛,數(shù)字信號(hào)處理器工作頻率及能力不斷提高,數(shù)字通信系統(tǒng)中越來(lái)越多的工作能夠通過(guò)DSP來(lái)完成,因而DSP本身的程序結(jié)構(gòu)也越來(lái)越復(fù)雜。由于通信信號(hào)(尤其是無(wú)線通信)本身具有很強(qiáng)的實(shí)時(shí)性、隨機(jī)性的特點(diǎn),造成DSP的輸入數(shù)據(jù)缺乏規(guī)律性,一閃即逝,從而導(dǎo)致相應(yīng)的處理程序出現(xiàn)了問(wèn)題不易復(fù)現(xiàn),且問(wèn)題難于追蹤、捕捉,這就給DSP的程序設(shè)計(jì)與調(diào)試帶來(lái)了較大困難。針對(duì)這一問(wèn)題,本文根據(jù)一般底層通信協(xié)議棧的數(shù)據(jù)處理方法,設(shè)計(jì)了一套適合于對(duì)底層協(xié)議棧進(jìn)行開(kāi)發(fā)和調(diào)試的數(shù)據(jù)采集與仿真系統(tǒng),以達(dá)到追蹤、再現(xiàn)問(wèn)題并查找程序缺陷的目的。
1 數(shù)據(jù)采集系統(tǒng)
數(shù)據(jù)采集系統(tǒng)主要完成從正在工作中的通信終端中采集數(shù)據(jù)的任務(wù)。
1.1 采集點(diǎn)的選擇
整個(gè)通信系統(tǒng)中有多個(gè)數(shù)據(jù)采集切入點(diǎn)可選,可以對(duì)中頻信號(hào)直接采樣,也可以對(duì)基帶信號(hào)采樣,還可以通過(guò)模擬系統(tǒng)中的AD數(shù)據(jù)接收時(shí)序,直接接收AD輸出數(shù)據(jù)。但前兩種采集點(diǎn)不能確保采集到的信號(hào)數(shù)據(jù)與DSP輸入數(shù)據(jù)完全一致,而模擬AD數(shù)據(jù)時(shí)序的方式則可能影響DSP與AD之間的主從關(guān)系,影響DSP協(xié)議棧的正常運(yùn)行,而且各種外部中斷的采集也比較困難。因而最為穩(wěn)妥的方式是DSP通過(guò)數(shù)據(jù)總線輸出其接收到的數(shù)據(jù)。這種方法的缺點(diǎn)是需要占用DSP少量資源,但這與協(xié)議棧運(yùn)行相比,完全可以忽略不計(jì),不計(jì)不會(huì)影響協(xié)議棧本身的運(yùn)行。
1.2 硬件連接
參考文獻(xiàn)[1]對(duì)各種數(shù)據(jù)采集系統(tǒng)進(jìn)行了分析比較,并指出USB總線為數(shù)據(jù)采集卡與PC機(jī)較理想的接口,因此選用CY68013A作為USB接口芯片。采用1片FPGA進(jìn)行DSP與CY68013A之間數(shù)據(jù)格式的轉(zhuǎn)換,CY68013A固件程序存放在E2PROM中,通過(guò)I2C總線連接,連接方式如圖1所示。
其中,DSP除了輸出16位數(shù)據(jù)總線之外,還引出7位地址線(A0~A6),用以區(qū)分不同的數(shù)據(jù)類(lèi)型。FPGA須將DSP外部總線輸出的數(shù)據(jù)格式轉(zhuǎn)換為CY68013A外部GPIF可兼容的格式。
1.3 FPGA程序設(shè)計(jì)
CY68013A外部GPIF端口可作為數(shù)據(jù)輸入端口的僅有16位(FD0~FD15),而DSP輸出的信息數(shù)據(jù)一共有23位(16位數(shù)據(jù)線D0~D15和7位地址線A0~A6),故而需要將多出的7位地址信息嵌入到數(shù)據(jù)中去。將1個(gè)16位數(shù)據(jù)拆分成2個(gè),每個(gè)數(shù)據(jù)中的低8位(FD0~FD7)用于存儲(chǔ)原數(shù)據(jù)信息(D0~D7或D8~D15),高7位(FD8~FD14)存放地址類(lèi)型信息(A0~A6),最高位(FD15)用于標(biāo)識(shí)當(dāng)前數(shù)據(jù)中FD0~FD7是原數(shù)據(jù)的D0~D7或是D8~D15,具體格式如圖2(b)所示。CY68013A GPIF端口使用內(nèi)部48 MHz時(shí)鐘,根據(jù)參考文獻(xiàn)[2],每個(gè)GPIF信號(hào)周期為20.83 ns,二者時(shí)鐘不同步,F(xiàn)PGA為了與高速設(shè)備兼容,需要使用更高的時(shí)鐘源。因此,為了保證GPIF能夠采集到RDY信號(hào),F(xiàn)PGA輸出的信號(hào)至少需要保持1.5個(gè)GPIF信號(hào)周期。GPIF每次從外部讀取數(shù)據(jù)存入FIFO需要6個(gè)狀態(tài),故而每個(gè)輸出數(shù)據(jù)間隔應(yīng)大于6個(gè)GPIF信號(hào)周期。以TI公司C55系列DSP為例,主頻時(shí)鐘144 MHz,與FPGA連接的為EMIFS外部總線,則FPGA轉(zhuǎn)換信號(hào)時(shí)序如圖2所示。其中,圖2(a)為DSP EMIFS輸出時(shí)序, 圖2(b)為經(jīng)FPGA轉(zhuǎn)換后的CY68013A GPIF輸入時(shí)序及數(shù)據(jù)格式。
考慮到DSP輸出數(shù)據(jù)時(shí)鐘可能較CY68013A GPIF采集時(shí)鐘快,因而FPGA需要設(shè)計(jì)內(nèi)置的FIFO存儲(chǔ)器,用于緩存DSP輸出的數(shù)據(jù)。
1.4 USB固件設(shè)計(jì)
由于CY68013A內(nèi)置的8051內(nèi)核時(shí)鐘周期較慢,不適于高速傳輸,因而采集程序中僅使用8051進(jìn)行初始化配置,而不干預(yù)數(shù)據(jù)傳輸過(guò)程。CY68013A通過(guò)外部GPIF讀取數(shù)據(jù)存入FIFO中,F(xiàn)IFO滿時(shí)通過(guò)USB傳入PC機(jī)。采用Cypress公司提供的通用程序框架以及圖形化GPIF設(shè)計(jì)工具,參照?qǐng)D2(b)的時(shí)序,編輯GPIF波形。USB總線選擇傳輸大量數(shù)據(jù)時(shí)比較常用的Bulk傳輸模式,硬件配置程序采用Cypress公司提供的程序模板,參考文獻(xiàn)[3]對(duì)該模板進(jìn)行了詳細(xì)說(shuō)明,這里不再贅述,程序框架與參考文獻(xiàn)[4、5]類(lèi)似。
1.5 PC機(jī)接收程序
USB接口驅(qū)動(dòng)程序可直接使用Cypress公司提供的ez-usb驅(qū)動(dòng)。由于ez-usb驅(qū)動(dòng)沒(méi)有提供高級(jí)的文件操作IO方式,因而需要調(diào)用比較底層的DeviceIoControl函數(shù)來(lái)處理??紤]到Bulk傳輸方式完全是由主機(jī)端(PC機(jī))發(fā)起讀操作,從機(jī)端(采集板)只能被動(dòng)地等待,而當(dāng)CY68013A內(nèi)置的FIFO寫(xiě)滿之后,如果主機(jī)不能及時(shí)地發(fā)起讀操作,則FIFO不再接收數(shù)據(jù)寫(xiě)入操作,因而會(huì)有少量的數(shù)據(jù)丟失。對(duì)于底層協(xié)議棧調(diào)試,這種少量的數(shù)據(jù)丟失可能引起程序流程錯(cuò)誤,是不能接受的。因此PC機(jī)端接收程序應(yīng)采用多線程處理方式,將接收USB數(shù)據(jù)的工作列為單獨(dú)的線程,并將其優(yōu)先級(jí)設(shè)置為實(shí)時(shí)性最高的THREAD_PRIORITY_TIME_CRITICAL,防止接收數(shù)據(jù)過(guò)程被系統(tǒng)中其他進(jìn)程打斷,以確保每次讀操作能夠及時(shí)發(fā)出。同時(shí)也要保證負(fù)責(zé)數(shù)據(jù)采集的PC機(jī)操作系統(tǒng)中同時(shí)運(yùn)行的進(jìn)程盡量少,關(guān)掉不必要的后臺(tái)進(jìn)程。
PC機(jī)接收到的數(shù)據(jù)先存入臨時(shí)文件中,以備后續(xù)解析、仿真程序使用。臨時(shí)文件以字(16 bit)為單位存儲(chǔ),每個(gè)數(shù)據(jù)用2個(gè)字來(lái)表示,低字節(jié)在前,與FPGA轉(zhuǎn)換后的數(shù)據(jù)格式一致,如表1所示。
2 仿真系統(tǒng)
仿真系統(tǒng)使用采集系統(tǒng)采集到的數(shù)據(jù),再現(xiàn)通信終端中的協(xié)議棧運(yùn)行狀態(tài),便于開(kāi)發(fā)者隨時(shí)檢查程序錯(cuò)誤,對(duì)程序進(jìn)行調(diào)試。
2.1 系統(tǒng)框架
要想再現(xiàn)底層協(xié)議棧運(yùn)行狀態(tài),除了保證協(xié)議棧整體輸入、輸出一致外,最大的難度在于系統(tǒng)的定時(shí),要能夠準(zhǔn)確再現(xiàn)各種事件的發(fā)生時(shí)刻?;谲浖o(wú)線電技術(shù)的數(shù)字通信系統(tǒng)大都采用過(guò)采樣方式,AD/DA速率都比較高而且穩(wěn)定,因而底層協(xié)議棧也大多以AD/DA的輸入、輸出中斷作為系統(tǒng)定時(shí)。當(dāng)通信終端作為接收機(jī)時(shí),底層協(xié)議棧需要以AD采樣數(shù)據(jù)作為其他部分(信道估計(jì)與均衡、解調(diào)、信道解碼等)的驅(qū)動(dòng)數(shù)據(jù);作為發(fā)射機(jī)時(shí),DA輸出數(shù)據(jù)是底層協(xié)議棧的最終輸出結(jié)果,需要仿真程序進(jìn)行驗(yàn)證。故而仿真程序可以采用AD/DA中斷來(lái)劃分程序運(yùn)行的最小時(shí)間片,其他各種事件的發(fā)生都通過(guò)中斷個(gè)數(shù)來(lái)計(jì)時(shí),仿真程序通過(guò)判斷AD/DA數(shù)據(jù)的個(gè)數(shù)調(diào)用各程序函數(shù)來(lái)再現(xiàn)底層協(xié)議棧運(yùn)行狀況及數(shù)據(jù)流向。這樣就可以在不增加開(kāi)銷(xiāo)的情況下,盡最大可能保證仿真程序與實(shí)際DSP中運(yùn)行的協(xié)議棧一致,方便再現(xiàn)問(wèn)題。
2.2 輸出數(shù)據(jù)
根據(jù)1.1節(jié)所選擇的數(shù)據(jù)采集點(diǎn),需在DSP的底層協(xié)議棧代碼中輸出仿真時(shí)所用的數(shù)據(jù): (1)需要輸出的為前端AD/DA數(shù)據(jù),以及底層協(xié)議棧與上層協(xié)議棧之間的交互數(shù)據(jù),這是底層通信協(xié)議棧接收、發(fā)射信息時(shí)所需的輸入數(shù)據(jù)與最終的輸出結(jié)果; (2)其他外圍設(shè)備產(chǎn)生的中斷和輸入數(shù)據(jù)也會(huì)影響底層協(xié)議棧流程,是仿真時(shí)所必須的部分;(3)底層協(xié)議棧各任務(wù)掛起、運(yùn)行、結(jié)束等狀態(tài)變化需要輸出,以保證仿真程序運(yùn)行時(shí)刻與實(shí)際情況一致。另外,在2次AD/DA中斷之間會(huì)發(fā)生多次變化的全局變量也需要輸出,以彌補(bǔ)時(shí)間片劃分的不足。
2.3 數(shù)據(jù)解析
1.5節(jié)中所存儲(chǔ)的接收數(shù)據(jù)不方便直接用于仿真,需要進(jìn)行格式轉(zhuǎn)換。根據(jù)2.1節(jié)中所述系統(tǒng)框架,所有事件通過(guò)AD/DA數(shù)據(jù)計(jì)時(shí),故而除AD/DA數(shù)據(jù)外,其他類(lèi)型數(shù)據(jù)需要記錄AD/DA數(shù)據(jù)個(gè)數(shù)信息,作為時(shí)間戳,因而可將所有數(shù)據(jù)分為兩大類(lèi):AD/DA數(shù)據(jù)和非AD/DA數(shù)據(jù)。為仿真方便,將這2種類(lèi)型數(shù)據(jù)分別存放于2個(gè)文件中。在解析數(shù)據(jù)時(shí),需要將1.3小節(jié)中為了與CY68013A兼容而通過(guò)FPGA拆分開(kāi)的2個(gè)16位數(shù)據(jù)重新合并為1個(gè),并將不同類(lèi)型的數(shù)據(jù)分開(kāi)。AD/DA數(shù)據(jù)一般長(zhǎng)度固定,由AD/DA轉(zhuǎn)換器分辨率(位數(shù))而定,例如,AD/DA數(shù)據(jù)為16位,每次中斷輸出1個(gè)數(shù)據(jù),則解析后的數(shù)據(jù)格式如表2所示。
非AD/DA數(shù)據(jù)根據(jù)程序需求,長(zhǎng)度不固定,可在協(xié)議棧程序輸出數(shù)據(jù)中包含長(zhǎng)度信息,也可在接收程序與輸出程序中提前規(guī)定好數(shù)據(jù)長(zhǎng)度。例如,非AD/DA數(shù)據(jù)以字為單位,數(shù)據(jù)長(zhǎng)度為N,則解析后的數(shù)據(jù)格式如表3所示。
由于底層協(xié)議棧需要兼顧外圍硬件控制,各種外部中斷比較多,很可能會(huì)打斷數(shù)據(jù)輸出,因而在解析數(shù)據(jù)時(shí),需要考慮各種數(shù)據(jù)之間的嵌套。為此,可以對(duì)每種數(shù)據(jù)采用單獨(dú)的緩沖區(qū),待解析到1條完整數(shù)據(jù)之后再存入文件中,同時(shí)還要保證文件中各種非AD/DA數(shù)據(jù)按照發(fā)生時(shí)間的先后順序排列。其流程如圖3所示。
2.4 系統(tǒng)仿真
系統(tǒng)仿真之前,首先要將運(yùn)行于DSP中的底層協(xié)議棧代碼轉(zhuǎn)換為PC機(jī)上可運(yùn)行的代碼,一般DSP大多采用C語(yǔ)言和匯編語(yǔ)言相結(jié)合的方式進(jìn)行開(kāi)發(fā),C代碼基本上不需要進(jìn)行大量修改,而匯編代碼需要根據(jù)其工作原理,轉(zhuǎn)譯成C代碼。系統(tǒng)仿真時(shí)采用2.3節(jié)中解析后的數(shù)據(jù)文件作為輸入,按照2.1節(jié)定義的仿真系統(tǒng)框架,以AD/DA數(shù)據(jù)為驅(qū)動(dòng),通過(guò)判斷非AD/DA數(shù)據(jù)的發(fā)生時(shí)刻(AD/DA數(shù)據(jù)計(jì)數(shù)值)來(lái)調(diào)動(dòng)底層協(xié)議棧各部分任務(wù)運(yùn)行,以達(dá)到再現(xiàn)協(xié)議棧運(yùn)行狀況、調(diào)試程序的目的。仿真流程如圖4所示。有些硬件操作需要底層協(xié)議棧控制,仿真時(shí)可以按照“[發(fā)生時(shí)間] 硬件操作內(nèi)容”的格式寫(xiě)到文件中作為仿真程序的輸出。這樣通過(guò)查詢輸出文件,各種硬件操作的先后關(guān)系一目了然,更形象化,有利于發(fā)現(xiàn)硬件控制上的邏輯錯(cuò)誤。
本文設(shè)計(jì)了一種專(zhuān)門(mén)用于底層協(xié)議棧開(kāi)發(fā)的數(shù)據(jù)采集與仿真系統(tǒng),利用USB高速傳輸特點(diǎn)以及物理連接的便利性,采用CY68013A進(jìn)行數(shù)據(jù)傳遞,充分利用其GPIF資源,使用FPGA進(jìn)行格式轉(zhuǎn)換。文中對(duì)仿真系統(tǒng)的整體框架和數(shù)據(jù)轉(zhuǎn)換細(xì)節(jié)進(jìn)行了詳細(xì)說(shuō)明。該系統(tǒng)可用于各種類(lèi)型協(xié)議棧調(diào)試,便于追蹤、再現(xiàn)問(wèn)題。經(jīng)過(guò)實(shí)驗(yàn)驗(yàn)證,系統(tǒng)可承受100 Mb/s的實(shí)時(shí)數(shù)據(jù)流,在數(shù)字集群手持終端開(kāi)發(fā)中進(jìn)行了廣泛應(yīng)用,不僅降低了協(xié)議棧的開(kāi)發(fā)難度,而且縮短了開(kāi)發(fā)周期,有很高的實(shí)用性。(電子技術(shù)應(yīng)用 作者:黃建堯 劉開(kāi)華 李 琨 )
參考文獻(xiàn):
[1].Bulkdatasheethttp://www.dzsc.com/datasheet/Bulk_2523104.html.
[2].ez-usbdatasheethttp://www.dzsc.com/datasheet/ez-usb_305660.html.
-
dsp
+關(guān)注
關(guān)注
552文章
7959瀏覽量
347929 -
FPGA
+關(guān)注
關(guān)注
1625文章
21620瀏覽量
601239 -
數(shù)據(jù)采集
+關(guān)注
關(guān)注
38文章
5808瀏覽量
113426
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論