沈 洋,李靖舒,夏東方,王冬華
(中國船舶集團(tuán)有限公司第八研究院,南京 211153)
隨著雷達(dá)系統(tǒng)在陣列規(guī)模、波束數(shù)、瞬時帶寬、實時性等方面的不斷提升,高速數(shù)據(jù)傳輸系統(tǒng)的需求也日漸提高,PCIe總線作為第三代高速串行計算機(jī)擴(kuò)展總線標(biāo)準(zhǔn),因其大吞吐量和支持DMA的特性,被廣泛應(yīng)用于雷達(dá)領(lǐng)域的高速數(shù)據(jù)傳輸系統(tǒng)和高速數(shù)據(jù)采集系統(tǒng)中[1-2]。本系統(tǒng)采用PCIe總線實現(xiàn)FPGA芯片與CPU芯片之間的互聯(lián),設(shè)計一種由FPGA主動發(fā)起的BLOCK DMA傳輸流程,F(xiàn)PGA在DMA包寫入完成后立即將DMA描述符寫入內(nèi)存,CPU通過不斷查詢內(nèi)存中的DMA描述符來獲取DMA傳輸完成狀態(tài)和信息。同時,本設(shè)計支持多通道虛擬DMA和多地址輪流DMA,更適合雷達(dá)系統(tǒng)中數(shù)據(jù)的流水傳輸與處理,有效地減少了數(shù)據(jù)傳輸過程中CPU的參與和干預(yù),減輕了CPU的負(fù)擔(dān),從而使得CPU性能在雷達(dá)信息處理中得到更好的發(fā)揮。
本系統(tǒng)的實現(xiàn)基于全國產(chǎn)軟硬件環(huán)境。硬件部分采用國微的SMQ7VX690T FPGA芯片和飛騰的FT1500A/16 CPU芯片通過PCIe3.0總線x8模式進(jìn)行互聯(lián),單lane波特率為8 Gbps,編碼方式為128 b/130 b編碼,理論速度高達(dá)7.8 GB/s。軟件部分采用國產(chǎn)“銀河麒麟”操作系統(tǒng),并基于“銀河麒麟”系統(tǒng)開發(fā)對應(yīng)的PCIe設(shè)備驅(qū)動和應(yīng)用程序。本系統(tǒng)在雷達(dá)中典型應(yīng)用的數(shù)據(jù)流如圖1所示,雷達(dá)中頻數(shù)據(jù)由光纖進(jìn)入FPGA中,F(xiàn)PGA通過PCIe總線的DMA方式將數(shù)據(jù)送入CPU掛載的內(nèi)存中,CPU再將數(shù)據(jù)的處理結(jié)果通過網(wǎng)絡(luò)發(fā)送給下一級處理機(jī)。
圖1 雷達(dá)數(shù)據(jù)流
傳統(tǒng)DMA傳輸系統(tǒng)的典型流程如圖2所示。在CPU打開并初始化PCIe設(shè)備和DMA資源后,向FPGA發(fā)送一次DMA傳輸?shù)拇笮『虳MA傳輸?shù)钠鹗嫉刂返刃畔?,并發(fā)送開始一次DMA的命令;FPGA收到開始DMA的命令后,從DDR中讀取已緩存的雷達(dá)數(shù)據(jù),并通過memory write類型的TLP包將數(shù)據(jù)直接寫入內(nèi)存。當(dāng)寫入的數(shù)據(jù)達(dá)到設(shè)置的DMA大小時,F(xiàn)PGA向CPU發(fā)送DMA完成中斷;CPU收到中斷后須對收到的DMA數(shù)據(jù)進(jìn)行解析,從而形成雷達(dá)的幀數(shù)據(jù);CPU將數(shù)據(jù)拷貝到別處后發(fā)送下一次DMA參數(shù)(DMA參數(shù)不變時可以省略該步驟),并向FPGA發(fā)送開始新一次DMA的命令;如此循環(huán)[3-4]。
圖2 傳統(tǒng)DMA傳輸流程
傳統(tǒng)DMA傳輸流程由CPU發(fā)起每次DMA傳輸,且需要提前知曉并設(shè)置DMA大小,而雷達(dá)幀數(shù)據(jù)由FPGA向CPU端流動時,CPU往往無法預(yù)計雷達(dá)幀數(shù)據(jù)的大小,因此只能設(shè)置一個固定的DMA大小,CPU收到數(shù)據(jù)后再通過查找雷達(dá)幀頭的方式來解析并形成雷達(dá)幀數(shù)據(jù),通常解析數(shù)據(jù)需占用大量CPU資源。另外,由于每次DMA傳輸需要由CPU發(fā)起,而CPU開始DMA命令的本質(zhì)是寄存器寫命令,因此整個DMA傳輸過程需要CPU頻繁參與并插入相對耗時的操作,從而使得DMA傳輸效率很難提高。同時,由于DMA的發(fā)起時間不受FPGA(數(shù)據(jù)源端)控制,為了保證DMA傳輸過程中雷達(dá)的流式數(shù)據(jù)不被丟棄,需要FPGA先將數(shù)據(jù)寫入大容量的外掛DDR進(jìn)行緩存,DMA傳輸時再從DDR中讀取數(shù)據(jù)并送給PCIe總線。
為了解決傳統(tǒng)DMA傳輸流程在雷達(dá)系統(tǒng)中的應(yīng)用所帶來的弊端,本系統(tǒng)設(shè)計了一種新的DMA傳輸流程,如圖3所示。圖3在CPU初始化PCIe設(shè)備、設(shè)置DMA參數(shù)并初始化DMA資源后,向FPGA一次性發(fā)送n組DMA傳輸?shù)钠鹗嫉刂?、上報地址等信息,并發(fā)送啟動DMA的命令; FPGA收到DMA參數(shù)和啟動命令后,將循環(huán)使用DMA起始地址和上報地址:FPGA將第1幀完整的雷達(dá)數(shù)據(jù)作為一包DMA寫入內(nèi)存的第1組DMA起始地址處,并將該包DMA的大小、編號等信息寫入內(nèi)存的第1組DMA上報地址處;第2幀雷達(dá)數(shù)據(jù)抵達(dá)時,F(xiàn)PGA將數(shù)據(jù)寫入第2組DMA起始地址,并將DMA包信息寫入與之對應(yīng)的DMA上報地址處;第N+1組數(shù)據(jù)抵達(dá)時,重新使用第1組DMA起始、上報地址。CPU啟動DMA后便輪流查詢各組DMA上報地址,發(fā)現(xiàn)DMA上報后便可根據(jù)DMA包大小獲取一包DMA數(shù)據(jù),即對應(yīng)1幀雷達(dá)數(shù)據(jù)。
圖3 優(yōu)化的DMA傳輸流程
本設(shè)計的DMA流程具有以下優(yōu)點(diǎn):
(1) CPU只給FPGA發(fā)送一次啟動DMA的命令,每次DMA傳輸?shù)牧鞒逃蒄PGA(數(shù)據(jù)源端)發(fā)起,減少了DMA傳輸過程中CPU與FPGA的反復(fù)交互,提高了DMA傳輸?shù)男剩?/p>
(2) 由FPGA(數(shù)據(jù)源端)發(fā)起DMA并決定何時結(jié)束一包DMA,可實現(xiàn)不定長的DMA包傳輸,一包DMA傳輸結(jié)束后通過上報的方式將該包DMA大小寫入內(nèi)存,便于CPU獲取,更加適合雷達(dá)系統(tǒng)中數(shù)據(jù)流水傳輸?shù)姆绞剑?/p>
(3) 將DMA包與雷達(dá)數(shù)據(jù)幀關(guān)聯(lián)起來,CPU獲取一包DMA便對應(yīng)一幀雷達(dá)數(shù)據(jù),減輕了CPU解析雷達(dá)幀數(shù)據(jù)的負(fù)擔(dān);
(4) 設(shè)計多組DMA傳輸?shù)钠鹗嫉刂泛蜕蠄蟮刂费h(huán)使用,F(xiàn)PGA不用等待CPU的處理結(jié)果便可以發(fā)起下一次DMA,因此FPGA收到雷達(dá)幀數(shù)據(jù)后可以很短時間內(nèi)通過PCIe總線寫入內(nèi)存,免去了FPGA端外掛大容量DDR緩存的需求,簡化了硬件設(shè)計的復(fù)雜度,降低了硬件設(shè)計與調(diào)試的難度。DMA傳輸?shù)刂返臄?shù)量主要受驅(qū)動所能使用的內(nèi)存大小限制,以一組DMA占用4 MB內(nèi)存為例,1 GB內(nèi)存便可以劃分為256組DMA內(nèi)存。
針對雷達(dá)系統(tǒng)中不同業(yè)務(wù)和控制數(shù)據(jù)進(jìn)行同步傳輸或采集的需求[5-6],本系統(tǒng)設(shè)計一種多通道虛擬DMA控制器,如圖4所示。本設(shè)計中的DMA控制器可通過多個數(shù)據(jù)通道接收不同數(shù)據(jù)源產(chǎn)生的數(shù)據(jù),各數(shù)據(jù)通道使用獨(dú)立的FIFO緩存、寄存器組、DMA起始地址、DMA上報地址,且實際使用的數(shù)據(jù)通道的數(shù)量受用戶應(yīng)用軟件的控制[7]。
圖4 多通道虛擬DMA傳輸
在同時多波束的雷達(dá)系統(tǒng)中,DMA控制器的不同數(shù)據(jù)通道可接收雷達(dá)不同波束的數(shù)據(jù),經(jīng)各自的FIFO緩存后送入仲裁模塊,仲裁模塊根據(jù)各數(shù)據(jù)通道已緩存的數(shù)據(jù)量和優(yōu)先級進(jìn)行仲裁后將待發(fā)數(shù)據(jù)送給封包模塊,由封包模塊封裝形成IP核所要求的AXI總線的數(shù)據(jù)包格式,IP核完成數(shù)據(jù)鏈路層和物理層的工作。不同的虛擬DMA通道最終將不同波束的雷達(dá)數(shù)據(jù)寫入內(nèi)存的不同區(qū)域,從而免去了CPU解析拆分不同波束數(shù)據(jù)的過程,減輕了CPU負(fù)擔(dān)。
針對雷達(dá)系統(tǒng)數(shù)據(jù)流水處理的特點(diǎn),本系統(tǒng)設(shè)計了一種由FPGA主動發(fā)起和結(jié)束一次DMA傳輸?shù)牧鞒獭R詥瓮ǖ繢MA為例,DMA控制器接收用戶數(shù)據(jù)的接口包括clk(時鐘)、data(數(shù)據(jù))、valid(數(shù)據(jù)有效標(biāo)志)、sof(數(shù)據(jù)幀起始標(biāo)志)、eof(數(shù)據(jù)幀結(jié)束標(biāo)志)。DMA寫控制狀態(tài)機(jī)包括RST、IDLE、MWR_H0、MWR_D1、MWR_T2、MWR_T3、MWR_REP等狀態(tài),其中復(fù)位狀態(tài)RST和空閑狀態(tài)IDLE為公用狀態(tài),其余狀態(tài)為虛擬DMA通道內(nèi)部狀態(tài),各通道內(nèi)部狀態(tài)均相同,調(diào)整通道數(shù)量時只須調(diào)整空閑狀態(tài)到各通道狀態(tài)間的跳轉(zhuǎn)邏輯即可。DMA寫控制狀態(tài)機(jī)如圖5所示。
圖5 DMA寫控制狀態(tài)機(jī)
RST:復(fù)位狀態(tài),上電默認(rèn)進(jìn)入該狀態(tài);
IDLE:空閑狀態(tài),各通道切換的中轉(zhuǎn)狀態(tài);
MWR_H0:寫數(shù)據(jù)包頭狀態(tài),向IP核發(fā)送memory write TLP的HEAD部分;
MWR_D1:寫數(shù)據(jù)狀態(tài),向IP核發(fā)送memory write TLP的DATA部分;
MWR_T2:寫普通數(shù)據(jù)尾狀態(tài),向IP核發(fā)送memory write TLP的DATA部分的最后一個節(jié)拍;
MWR_T3:寫幀數(shù)據(jù)尾狀態(tài),向IP核發(fā)送一次DMA包的最后一個memory write TLP的DATA部分的最后一個節(jié)拍;
MWR_REP:上報狀態(tài),通過memory write TLP向CPU上報此次DMA包的信息,包括包大小、包編號等。
DMA使能打開后,狀態(tài)機(jī)從RST狀態(tài)進(jìn)入IDLE狀態(tài);當(dāng)數(shù)據(jù)幀起始到來且數(shù)據(jù)緩存夠一個TLP包時,狀態(tài)機(jī)跳轉(zhuǎn)進(jìn)入MWR_H0狀態(tài),寫TLP包頭;當(dāng)數(shù)據(jù)有效且IP核的AXI總線ready有效時,狀態(tài)機(jī)跳轉(zhuǎn)進(jìn)入MWR_D1狀態(tài),寫TLP數(shù)據(jù)部分;當(dāng)已寫數(shù)據(jù)即將達(dá)到TLP的PAYLOAD時,狀態(tài)機(jī)跳轉(zhuǎn)進(jìn)入MWR_T2狀態(tài),寫完TLP最后一個節(jié)拍的數(shù)據(jù)后,跳轉(zhuǎn)進(jìn)入IDLE狀態(tài);否則當(dāng)數(shù)據(jù)幀結(jié)束到來時,狀態(tài)機(jī)從MWR_D1狀態(tài)跳轉(zhuǎn)進(jìn)入MWR_T3狀態(tài),寫完該DMA包最后一個TLP最后一個節(jié)拍的數(shù)據(jù)后,跳轉(zhuǎn)進(jìn)入MWR_REP狀態(tài);MWR_REP狀態(tài)發(fā)送DMA上報TLP包后,進(jìn)入IDLE狀態(tài)。
在該狀態(tài)機(jī)中每發(fā)送完一個TLP包,狀態(tài)機(jī)都跳轉(zhuǎn)回IDLE狀態(tài),重新仲裁下一次進(jìn)入哪個數(shù)據(jù)通道的狀態(tài)機(jī)。以PCIe總線中最典型的128 B TLP PAYLOAD為例,256 bit寬的AXI總線只需5個時鐘節(jié)拍便能將128 B數(shù)據(jù)發(fā)完,再加上IDLE狀態(tài)的仲裁判斷節(jié)拍,該狀態(tài)機(jī)每6個時鐘節(jié)拍便可切換到下一個數(shù)據(jù)通道,因此最小的時間片單元劃分得很短,可以保證各數(shù)據(jù)通道的數(shù)據(jù)得以及時寫入PCIe總線。
本研究基于國微電子公司的FPGA芯片SMQ7VX690T和飛騰公司的CPU芯片F(xiàn)T1500A/16進(jìn)行設(shè)計實現(xiàn),F(xiàn)PGA端使用VHDL語言設(shè)計實現(xiàn),CPU端PCIe驅(qū)動、庫函數(shù)和應(yīng)用程序使用C語言設(shè)計實現(xiàn)。測試時在FPGA中生成2路速率可控的測試數(shù)據(jù)(連續(xù)遞增的計數(shù)器),同時送入兩個虛擬DMA通道,上位機(jī)測試程序收到DMA數(shù)據(jù)后對DMA包內(nèi)數(shù)據(jù)的連續(xù)性、DMA包間數(shù)據(jù)的連續(xù)性以及DMA包內(nèi)首尾數(shù)據(jù)的差值與DMA包大小是否匹配進(jìn)行校驗,同時對各DMA通道所接收數(shù)據(jù)的平均速率分別進(jìn)行統(tǒng)計。
使用傳統(tǒng)和改進(jìn)DMA傳輸方式的測試結(jié)果分別如表1、表2所示,表中所測速率均為最大不丟包傳輸帶寬??梢钥闯?,與傳統(tǒng)DMA通過中斷獲取DMA完成信息相比,改進(jìn)DMA使用查詢方式獲取DMA完成信息,DMA傳輸效率較穩(wěn)定,不易受DMA包大小影響。
表1 傳統(tǒng)DMA測試結(jié)果
表2 改進(jìn)DMA測試結(jié)果
本系統(tǒng)設(shè)計了一種基于PCIe總線的DMA傳輸流程:由FPGA主動發(fā)起和結(jié)束一次DMA傳輸,實現(xiàn)了不定長DMA包的數(shù)據(jù)傳輸;將DMA包和雷達(dá)數(shù)據(jù)幀關(guān)聯(lián)起來,更加貼近雷達(dá)系統(tǒng)中對數(shù)據(jù)進(jìn)行流水傳輸與處理的需求,同時支持多個虛擬DMA數(shù)據(jù)通道。實際應(yīng)用中可同時將不同的業(yè)務(wù)和控制數(shù)據(jù)通過DMA方式寫入內(nèi)存的不同區(qū)域,極大地減輕了CPU解析雷達(dá)數(shù)據(jù)幀的負(fù)擔(dān),從而使CPU性能在雷達(dá)信息處理中得到更加充分的發(fā)揮。