秦固平,毛瑞娟,楊小勇,常振杰
(1.中國人民解放軍66138部隊,北京 100043; 2.國家無線電頻譜管理研究所有限公司,陜西 西安710061)
隨著現代通信技術的發展,在無線電監測領域,大帶寬、高性能和高效率特性已經成為無線電監測設備中高速數據傳輸總線的基本要求。PCIe作為第三代互連技術已經廣泛應用于無線電通信領域[1-3]。PCIe總線采用差分鏈路作為數據傳輸通道,由于差分信號可以使用更高的總線頻率,使得PCIe總線的數據傳輸帶寬較其他總線有很大的提高[4-6]。
本文針對無線電監測設備對高速數據傳輸總線的需求,采用基于FPGA的信號采集處理板卡作為端點設備,以工控板作為根復合體,完成了二者之間PCIe總線的接口設計。其中,FPGA采用Xilinx Kintex 7系列xc7k410tffg900芯片,工控板配置為Windows7 64位操作系統,i5處理器。按PCIe傳輸的流程分模塊設計了PCIe總線的接口邏輯,并在FPGA中實現64位數據接口的DMA模式寫數據傳輸,實現了數據的高速傳輸。這種以模塊式的設計方法實現PCIe接口的DMA傳輸模式可以在無線電監測設備等嵌入式設備中得到應用。
Xilinx 7系列FPGA的PCIe IP核是一種大帶寬、可擴展和可靠性強的串行結構模塊[7-10]。PCIe IP核遵循PCIe基本規范,內部集成了物理層、數據鏈路層和事務層,并且已經完成了物理層和數據鏈路層的相關邏輯功能,預留出了相應的邏輯接口供用戶使用[11-13]。IP核中的事務層采用數據包的形式在設備之間交換信息,用戶只需要對事務層進行操作,即可完成PCIe設備之間的數據交互[14]。PCIe IP核的頂層功能塊和數據接口如圖1所示。

圖1 PCIe IP核的頂層功能塊和數據接口
事務層作為PCIe總線協議的頂層,首先要完成的是對事務層數據包進行組裝和拆解,Xilinx FPGA PCIe IP核分為2種事務層接口:64位事務層接口和128位事務層接口[15-17]。設計中PCIe總線接口選擇64位事務層接口類型。
典型的64位事務層接口32位可尋址存儲器寫請求TLP格式嚴格遵循PCIe總線協議規范,PCIe總線上每個時鐘周期傳輸64位數據。其中Byte0表示第一個時鐘周期的低32位數據,Byte4表示第一個時鐘周期的高32位數據,Byte8表示第2個時鐘周期的低32位數據,Byte12表示第2個時鐘周期的高32位數據,依次類推。
在PCIe體系結構中,根復合體和存儲器在同一層架構上,所以DMA模式在數據傳輸過程中,無需經過CPU主機內存與外設內存之間可以直接進行數據交換,并且可以一次傳輸多包數據,使得設備具有大的數據吞吐量,適用于大帶寬數據傳輸[18-20]。由于數字接收機中傳輸的數據量大,傳輸帶寬大,所以必須采用DMA模式的存儲器寫事務進行。而傳統的DMA模式每傳輸一包數據都需要進行一次DMA啟動過程,這樣會影響數據傳輸帶寬,所以在此采用鏈式DMA模式,鏈式DMA模式下每啟動一次DMA,可以傳輸多包數據。該過程需要配合MSI(Message Signaled Interrupt)中斷才能有效執行,MSI中斷即消息中斷,屬于PCIe總線的消息事務。對于每次中斷傳輸的數據包數以及每一包數據的大小需要PCIe驅動端與邏輯端協商而定。
無線電接收機PCIe DMA控制結構分為6個模塊,分別是PCIe IP核、數據接收模塊、寄存器控制模塊、DMA控制模塊、數據發送模塊以及數據輸入模塊。各模塊的邏輯關系如圖2所示。

圖2 PCIe DMA控制結構
數據輸入模塊主要用來存儲前端數據。在FPGA板卡中,接收機接收到無線信號首先要進行模擬信號到數字信號的轉換,也就是A/D轉換,然后把轉換后的數據儲存在數據輸入模塊中,當上位機發送傳輸啟動信號之后,再進行DMA傳輸。數據輸入模塊在本設計中用FIFO來實現,不再對此模塊做詳細論述。
數據接收模塊是用來接收用戶對數字接收機的配置信息及DMA傳輸機制的相關參數,并根據PCIe字節規范協議進行解包,提出有用信息傳給寄存器控制模塊進行存儲。
寄存器控制模塊主要用來存儲數據接收模塊解析出的基地址信息、傳輸包長度信息、傳輸包大小信息及無線電監測設備的相關參數信息等,并對數據接收模塊解析后的信息進行重新組包,對數據寫入地址進行控制。寄存器地址及存儲的內容由FPGA部分和驅動部分協議決定。
DMA寫控制模塊主要完成DMA寫數據傳輸過程中數據包長度的控制和相應的DMA寫偏移地址的控制。寫控制模塊是整個傳輸過程的核心,需要在地址匹配和時序方面特別注意,否則就會在調試過程中出現計算機死機或藍屏。具體實現過程將在各模塊的FPGA具體實現中做詳細論述。
數據發送模塊根據DMA寫控制模塊發送的包頭信息和地址信息對每一包數據按PCIe協議規范進行組包,然后將組好的數據包發送至PCIe核,經過PCIe核傳輸至計算機進行存儲。
數據接收模塊用來接收用戶對無線電監測設備的配置信息及DMA傳輸機制的相關參數。用戶在上位機上通過驅動程序設置無線電監測設備的參數,PCIe驅動同時發送DMA傳輸機制的相關配置參數,從而保證PCIe硬件邏輯與上位機驅動匹配。數據接收模塊信號框圖如圖3所示。
數據接收模塊在接收設備配置信息數據之前,需要與PCIe驅動程序配合,先接收驅動發送的復位信號對硬件進行復位,然后接收到前端發送的數據信息rx_data,根據PCIe字節命令規范對接收的數據包解包。常用的TLP包類型有存儲器寫請求0x40,存儲器讀請求0x00,帶數據的完成報文0x4A,不帶數據的完成報文0x0A。這里對數據接收模塊接收到的數據解包,高8 bits為包頭0x40時,表明接收到存儲器寫請求,就會生成PCIE存儲器寫信號pcie_reg_wr。根據協議解析包數據中的信息有基地址信息、傳輸包長度信息、傳輸包大小的設置信息等。信息還可以包括用戶根據需求在上位機端輸入的無線電監測設備的信號參數信息,例如信號帶寬、頻率和通道選擇等信息。最終數據接收模塊把從上位機接收到的相關參數信息rx_data和存儲器寫信號pcie_reg_wr發送至存儲器控制模塊中。
寄存器控制模塊主要用來存儲數據接收模塊解析出的基地址信息、傳輸包長度信息、傳輸包大小信息及無線電監測設備的相關參數信息等。在DMA模式下的數據傳輸過程中,FPGA板卡通過PCIe驅動接收來自PC端發送的傳輸數據包的大小信息以及PC端分配的地址信息。寄存器控制模塊對數據接收模塊解析后的信息進行重新組包,并對數據寫入地址進行控制。
設計中涉及到的數據信息類型所對應的偏移地址及數值如表1所示。其中偏移地址由PCIe的FPGA控制部分與PCIe驅動部分的共同協商確定。

表1 寄存器控制分配表
偏移地址0x08中存儲的信息類型為Base_Addr,表示系統分配的基地址信息,基地址的值由所使用的計算機系統硬件分配,在寄存器存儲模塊中把基地址信息存儲到偏移地址0x08中。該偏移地址發送至DMA控制模塊用于控制DMA數據傳輸的地址。
偏移地址0x0C中存儲的信息類型為TLP_Size,表示DMA傳輸中每一個TLP包的數據大小,單位為Byte,它的值由所使用的計算機系統硬件決定,通常為128 Btyes和256 Bytes。設計中使用的計算機系統是Windows7 64位操作系統,TLP_Size被限定在0xXXXX_0020,低13位是有效位,即128 Bytes。
偏移地址0x10中存儲的信息類型為TLP_Count,表示每一次DMA中斷傳輸的TLP數據包數,該包數設置太大則調試會出現死機的情況,若設置太小,則會增加傳輸相同數量的數據產生中斷的次數,根據反復測試和驗證該參數最終設置為0xXXXX_2800,低16位為有效位,即10 240包數據,這個值能夠使PCIe接口的傳輸性能達到較優的水平。
偏移地址0x14中存儲的信息類型為TLP_User_Cmd,表示預留給用戶自定義的信息數據。例如可以通過上位機設置用戶所需要的無線電信號信息,包括信號帶寬、頻率和通道選擇信息等。
偏移地址0x04中存儲的信息類型為DMA_Start,表示DMA啟動和停止信號,其中最低位是有效位,其值為0x0000_0001時啟動DMA操作,啟動DMA寫傳輸后,FPGA板卡根據以上配置信息通過PCIe接口向PC傳輸相關數據。
寄存器控制模塊信號框圖如圖4所示。在寄存器控制模塊中,如果檢測到存儲器寫信號pcie_reg_wr有效,并且接收到的數據為1,對應的地址偏移地址是0x01,這就意味著DMA寫數據啟動信號dma_en有效,并發送給DMA數據傳輸請求模塊DMA_REQ。在DMA_REQ模塊中,如果檢測到dma_en有效,隨即產生DMA寫使能信號dma_wr_enable,并發送至DMA寫數據控制模塊DMA_WRITE模塊。DMA_WRTTE模塊中如果檢測到dma_wr_enable信號有效,則在本模塊中產生傳輸數據請求信號tpl_send_req,使得狀態機跳轉到SEND_TPL發送數據狀態,到此狀態后,生成DMA寫請求信號dma_write_req,并發送至TX模塊。在TX模塊中,如果狀態機處于初始狀態,并且接收到了DMA寫請求信號,就產生DMA寫請求反饋信號dma_write_ack,再次發送給DMA_WRITE模塊。

圖4 寄存器控制模塊信號框圖
DMA寫控制模塊完成DMA寫數據傳輸過程中數據包長度的控制和相應的DMA寫偏移地址的控制。DMA寫控制模塊控制過程的流程圖如圖5所示。在空閑狀態等待數據傳輸包請求信號,如果傳輸包發送請求有效信號,發出數據傳輸包發送請求信號,讀取包信息。在該狀態中,根據系統反饋的傳輸包可攜帶的最大數據長度信息TLP_Size,確定每一包數據攜帶的數據長度。目前,測試系統中每一包數據可攜帶的最大數據長度為32 DW。在PCIe協議中數據長度以DW為單位計數,每個DW等于4 Bytes。

圖5 DMA寫控制模塊控制流程
讀取包信息完畢后準備幀頭數據,在該狀態中對每一包數據的傳輸個數進行計數,一包數據為128 Bytes,每個數據為8 Bytes,即一包數據有16個64 bits數。根據寄存器控制模塊中存儲的基地址Base_Addr對傳輸數據對應的DMA寫偏移地址進行控制。傳輸過程中每傳輸一包數據,在基地址基礎上增加一包數據對應的偏移地址大小,DMA寫偏移地址的增量等于實際傳輸的一包的數據的大小。目前的測試系統中,偏移地址每次遞增0x80(128 Bytes)。
當每包數據都準備好后向數據發送模塊發送DMA寫請求信號dma_write_req,在數據發送模塊處于初始狀態,并且接收到了DMA寫請求信號dma_write_req,就產生DMA寫請求反饋信號dma_write_ack,再次發送給DMA寫控制模塊,如果在DMA寫控制模塊中接收到了DMA寫請求反饋信號dma_write_ack,就會產生釋放數據信號buf_rd_en給數據輸入模塊。在數據輸入模塊接收到buf_rd_en有效之后,就會輸出待傳輸的數據buf_rd_data,發送給DMA寫控制模塊。DMA寫控制模塊把得到的數據dma_wr_data發送給數據發送模塊。如果數據發送模塊中狀態機跳轉到發送數據狀態,就把dma_wr_data發送給數據發送接口trn_td,最后經過PCIe核傳輸給PC。每發送完成一包數據,則跳轉至空閑狀態等待下一次發送請求。
數據發送模塊首先根據DMA寫控制模塊發送的包頭信息和地址信息對每一包數據進行組包,然后將組好的數據包發送至PCIe核,經過PCIe核傳輸至計算機進行存儲。為了避免數據傳輸過程中出現的丟包現象,在此采用狀態機的方式根據PCIe協議的數據包格式將數據分狀態發出。此外,為了解決因傳輸數據量過大而出現的計算機死機問題,在此采用MSI中斷的方式進行處理。MSI中斷機制是PCIe協議規范中的內部中斷機制,當數據發送模塊發起MSI中斷時,停止數據傳輸,等待來自PC端的中斷反饋信號[5,8]。如果數據發送模塊收到了中斷反饋信號,繼續進行數據傳輸。這樣就可以保證在PC機正常工作的情況下數據可以持續高速傳輸。數據發送模塊工作流程如圖6所示。

圖6 數據發送模塊工作流程
在數據傳輸過程中,需要對數據流量進行實時控制,主機系統會實時向FPGA反饋當前剩余的內存容量,只有內存充足時才能進行高速傳輸。在開始狀態如果檢測到當前的內存充足,并且接收到了DMA寫請求信號,則將組好的數據幀頭信息發送出去,第2個時鐘周期傳輸第2個數據,其中包含數據和地址信息,第3個周期傳輸數據。
傳輸包數據的大小由TLP_Size決定,TLP_Size存儲在寄存器控制模塊的reg中。目前測試系統中TLP_Size為0x0000_0020,即128 Bytes,而每個數據大小是8 Bytes,所以每一個TLP包攜帶了16個數據。發送16個數據需要16個時鐘周期,第16個數據發送完成時一包數據發送結束。在寄存器控制模塊reg中存儲了驅動設置的每次中斷傳輸的數據包數TLP_Count,目前測試系統中TLP_Count為0x0000_2800,即10 240包數據,一次中斷發送的包數未達到TLP_Count時狀態機跳轉至IDLE狀態,繼續發送數據包,當發送包數達到TLP_Count時,標志一次DMA發送完成,狀態機跳轉至中斷響應狀態MSI_trig。在MSI_trig狀態FPGA向計算機端發送中斷信號,等待系統的響應。如果收到了計算機端的中斷反饋信號,則將發送至PCIe總線上的數據傳輸到計算機上,完成一次DMA數據傳輸。一次DMA數據傳輸結束后繼續進行下一次DMA數據傳輸過程,直到上位機發起DMA停止指令結束DMA傳輸。
根據以上設計分析,在賽靈思FPGA開發平臺Vivado2017. 1上實現了各個模塊的邏輯程序編寫。采用某型號數字接收機中的FPGA數字處理板卡和工控板作為硬件平臺,其中FPGA型號為xc7k410tffg900芯片,工控板配置為Windows7 64位操作系統,i5處理器,128 G固態硬盤。PCIe總線為PCIe1. 0版本,數據鏈路×8通道,考慮物理層編碼損耗,×8鏈路的理論傳輸速率16 Gbps。測試過程中采用Vivado開發軟件提供的Debug IP核對各模塊的主要信號波形進行捕捉。DMA寫控制模塊中的信號波形如圖7所示。
DMA寫控制模塊波形中adc_buf_data信號為發送的數據信號,由波形圖可以看出發送一包有效數據所占用的時間為30個時鐘周期,每個時鐘周期4 ns,每一包數據大小128 Bytes,由此可以估算出傳輸帶寬為8. 5 Gbps。

圖7 DMA寫控制模塊調試波形
文章采用Xilinx FPGA實現了PCIe高速總線上的數據傳輸,完成了DMA寫控制各個模塊的邏輯程序及調試。測試結果表明:在i5處理器、Windows7 64位操作系統、PCIe1. 0版本和數據鏈路為×8條件下DMA寫數據傳輸帶寬達到8. 5 Gbps。該設計已在具體項目中使用,且均能保證穩定可靠的傳輸速率。如果采用更高配置的操作系統,更高的PCIe協議版本,數據的傳輸存儲速率會得到進一步提高。PCIe總線技術在未來的無線電監測領域中將會有更加廣泛的應用。