沈 洋,李靖舒,夏東方,王冬華
(中國船舶集團有限公司第八研究院,南京 211153)
隨著雷達系統在陣列規模、波束數、瞬時帶寬、實時性等方面的不斷提升,高速數據傳輸系統的需求也日漸提高,PCIe總線作為第三代高速串行計算機擴展總線標準,因其大吞吐量和支持DMA的特性,被廣泛應用于雷達領域的高速數據傳輸系統和高速數據采集系統中[1-2]。本系統采用PCIe總線實現FPGA芯片與CPU芯片之間的互聯,設計一種由FPGA主動發起的BLOCK DMA傳輸流程,FPGA在DMA包寫入完成后立即將DMA描述符寫入內存,CPU通過不斷查詢內存中的DMA描述符來獲取DMA傳輸完成狀態和信息。同時,本設計支持多通道虛擬DMA和多地址輪流DMA,更適合雷達系統中數據的流水傳輸與處理,有效地減少了數據傳輸過程中CPU的參與和干預,減輕了CPU的負擔,從而使得CPU性能在雷達信息處理中得到更好的發揮。
本系統的實現基于全國產軟硬件環境。硬件部分采用國微的SMQ7VX690T FPGA芯片和飛騰的FT1500A/16 CPU芯片通過PCIe3.0總線x8模式進行互聯,單lane波特率為8 Gbps,編碼方式為128 b/130 b編碼,理論速度高達7.8 GB/s。軟件部分采用國產“銀河麒麟”操作系統,并基于“銀河麒麟”系統開發對應的PCIe設備驅動和應用程序。本系統在雷達中典型應用的數據流如圖1所示,雷達中頻數據由光纖進入FPGA中,FPGA通過PCIe總線的DMA方式將數據送入CPU掛載的內存中,CPU再將數據的處理結果通過網絡發送給下一級處理機。

圖1 雷達數據流
傳統DMA傳輸系統的典型流程如圖2所示。在CPU打開并初始化PCIe設備和DMA資源后,向FPGA發送一次DMA傳輸的大小和DMA傳輸的起始地址等信息,并發送開始一次DMA的命令;FPGA收到開始DMA的命令后,從DDR中讀取已緩存的雷達數據,并通過memory write類型的TLP包將數據直接寫入內存。當寫入的數據達到設置的DMA大小時,FPGA向CPU發送DMA完成中斷;CPU收到中斷后須對收到的DMA數據進行解析,從而形成雷達的幀數據;CPU將數據拷貝到別處后發送下一次DMA參數(DMA參數不變時可以省略該步驟),并向FPGA發送開始新一次DMA的命令;如此循環[3-4]。

圖2 傳統DMA傳輸流程
傳統DMA傳輸流程由CPU發起每次DMA傳輸,且需要提前知曉并設置DMA大小,而雷達幀數據由FPGA向CPU端流動時,CPU往往無法預計雷達幀數據的大小,因此只能設置一個固定的DMA大小,CPU收到數據后再通過查找雷達幀頭的方式來解析并形成雷達幀數據,通常解析數據需占用大量CPU資源。另外,由于每次DMA傳輸需要由CPU發起,而CPU開始DMA命令的本質是寄存器寫命令,因此整個DMA傳輸過程需要CPU頻繁參與并插入相對耗時的操作,從而使得DMA傳輸效率很難提高。同時,由于DMA的發起時間不受FPGA(數據源端)控制,為了保證DMA傳輸過程中雷達的流式數據不被丟棄,需要FPGA先將數據寫入大容量的外掛DDR進行緩存,DMA傳輸時再從DDR中讀取數據并送給PCIe總線。
為了解決傳統DMA傳輸流程在雷達系統中的應用所帶來的弊端,本系統設計了一種新的DMA傳輸流程,如圖3所示。圖3在CPU初始化PCIe設備、設置DMA參數并初始化DMA資源后,向FPGA一次性發送n組DMA傳輸的起始地址、上報地址等信息,并發送啟動DMA的命令; FPGA收到DMA參數和啟動命令后,將循環使用DMA起始地址和上報地址:FPGA將第1幀完整的雷達數據作為一包DMA寫入內存的第1組DMA起始地址處,并將該包DMA的大小、編號等信息寫入內存的第1組DMA上報地址處;第2幀雷達數據抵達時,FPGA將數據寫入第2組DMA起始地址,并將DMA包信息寫入與之對應的DMA上報地址處;第N+1組數據抵達時,重新使用第1組DMA起始、上報地址。CPU啟動DMA后便輪流查詢各組DMA上報地址,發現DMA上報后便可根據DMA包大小獲取一包DMA數據,即對應1幀雷達數據。

圖3 優化的DMA傳輸流程
本設計的DMA流程具有以下優點:
(1) CPU只給FPGA發送一次啟動DMA的命令,每次DMA傳輸的流程由FPGA(數據源端)發起,減少了DMA傳輸過程中CPU與FPGA的反復交互,提高了DMA傳輸的效率;
(2) 由FPGA(數據源端)發起DMA并決定何時結束一包DMA,可實現不定長的DMA包傳輸,一包DMA傳輸結束后通過上報的方式將該包DMA大小寫入內存,便于CPU獲取,更加適合雷達系統中數據流水傳輸的方式;
(3) 將DMA包與雷達數據幀關聯起來,CPU獲取一包DMA便對應一幀雷達數據,減輕了CPU解析雷達幀數據的負擔;
(4) 設計多組DMA傳輸的起始地址和上報地址循環使用,FPGA不用等待CPU的處理結果便可以發起下一次DMA,因此FPGA收到雷達幀數據后可以很短時間內通過PCIe總線寫入內存,免去了FPGA端外掛大容量DDR緩存的需求,簡化了硬件設計的復雜度,降低了硬件設計與調試的難度。DMA傳輸地址的數量主要受驅動所能使用的內存大小限制,以一組DMA占用4 MB內存為例,1 GB內存便可以劃分為256組DMA內存。
針對雷達系統中不同業務和控制數據進行同步傳輸或采集的需求[5-6],本系統設計一種多通道虛擬DMA控制器,如圖4所示。本設計中的DMA控制器可通過多個數據通道接收不同數據源產生的數據,各數據通道使用獨立的FIFO緩存、寄存器組、DMA起始地址、DMA上報地址,且實際使用的數據通道的數量受用戶應用軟件的控制[7]。

圖4 多通道虛擬DMA傳輸
在同時多波束的雷達系統中,DMA控制器的不同數據通道可接收雷達不同波束的數據,經各自的FIFO緩存后送入仲裁模塊,仲裁模塊根據各數據通道已緩存的數據量和優先級進行仲裁后將待發數據送給封包模塊,由封包模塊封裝形成IP核所要求的AXI總線的數據包格式,IP核完成數據鏈路層和物理層的工作。不同的虛擬DMA通道最終將不同波束的雷達數據寫入內存的不同區域,從而免去了CPU解析拆分不同波束數據的過程,減輕了CPU負擔。
針對雷達系統數據流水處理的特點,本系統設計了一種由FPGA主動發起和結束一次DMA傳輸的流程。以單通道DMA為例,DMA控制器接收用戶數據的接口包括clk(時鐘)、data(數據)、valid(數據有效標志)、sof(數據幀起始標志)、eof(數據幀結束標志)。DMA寫控制狀態機包括RST、IDLE、MWR_H0、MWR_D1、MWR_T2、MWR_T3、MWR_REP等狀態,其中復位狀態RST和空閑狀態IDLE為公用狀態,其余狀態為虛擬DMA通道內部狀態,各通道內部狀態均相同,調整通道數量時只須調整空閑狀態到各通道狀態間的跳轉邏輯即可。DMA寫控制狀態機如圖5所示。

圖5 DMA寫控制狀態機
RST:復位狀態,上電默認進入該狀態;
IDLE:空閑狀態,各通道切換的中轉狀態;
MWR_H0:寫數據包頭狀態,向IP核發送memory write TLP的HEAD部分;
MWR_D1:寫數據狀態,向IP核發送memory write TLP的DATA部分;
MWR_T2:寫普通數據尾狀態,向IP核發送memory write TLP的DATA部分的最后一個節拍;
MWR_T3:寫幀數據尾狀態,向IP核發送一次DMA包的最后一個memory write TLP的DATA部分的最后一個節拍;
MWR_REP:上報狀態,通過memory write TLP向CPU上報此次DMA包的信息,包括包大小、包編號等。
DMA使能打開后,狀態機從RST狀態進入IDLE狀態;當數據幀起始到來且數據緩存夠一個TLP包時,狀態機跳轉進入MWR_H0狀態,寫TLP包頭;當數據有效且IP核的AXI總線ready有效時,狀態機跳轉進入MWR_D1狀態,寫TLP數據部分;當已寫數據即將達到TLP的PAYLOAD時,狀態機跳轉進入MWR_T2狀態,寫完TLP最后一個節拍的數據后,跳轉進入IDLE狀態;否則當數據幀結束到來時,狀態機從MWR_D1狀態跳轉進入MWR_T3狀態,寫完該DMA包最后一個TLP最后一個節拍的數據后,跳轉進入MWR_REP狀態;MWR_REP狀態發送DMA上報TLP包后,進入IDLE狀態。
在該狀態機中每發送完一個TLP包,狀態機都跳轉回IDLE狀態,重新仲裁下一次進入哪個數據通道的狀態機。以PCIe總線中最典型的128 B TLP PAYLOAD為例,256 bit寬的AXI總線只需5個時鐘節拍便能將128 B數據發完,再加上IDLE狀態的仲裁判斷節拍,該狀態機每6個時鐘節拍便可切換到下一個數據通道,因此最小的時間片單元劃分得很短,可以保證各數據通道的數據得以及時寫入PCIe總線。
本研究基于國微電子公司的FPGA芯片SMQ7VX690T和飛騰公司的CPU芯片FT1500A/16進行設計實現,FPGA端使用VHDL語言設計實現,CPU端PCIe驅動、庫函數和應用程序使用C語言設計實現。測試時在FPGA中生成2路速率可控的測試數據(連續遞增的計數器),同時送入兩個虛擬DMA通道,上位機測試程序收到DMA數據后對DMA包內數據的連續性、DMA包間數據的連續性以及DMA包內首尾數據的差值與DMA包大小是否匹配進行校驗,同時對各DMA通道所接收數據的平均速率分別進行統計。
使用傳統和改進DMA傳輸方式的測試結果分別如表1、表2所示,表中所測速率均為最大不丟包傳輸帶寬。可以看出,與傳統DMA通過中斷獲取DMA完成信息相比,改進DMA使用查詢方式獲取DMA完成信息,DMA傳輸效率較穩定,不易受DMA包大小影響。

表1 傳統DMA測試結果

表2 改進DMA測試結果
本系統設計了一種基于PCIe總線的DMA傳輸流程:由FPGA主動發起和結束一次DMA傳輸,實現了不定長DMA包的數據傳輸;將DMA包和雷達數據幀關聯起來,更加貼近雷達系統中對數據進行流水傳輸與處理的需求,同時支持多個虛擬DMA數據通道。實際應用中可同時將不同的業務和控制數據通過DMA方式寫入內存的不同區域,極大地減輕了CPU解析雷達數據幀的負擔,從而使CPU性能在雷達信息處理中得到更加充分的發揮。