魏曉艷
(陜西國防工業職業技術學院,計算機與軟件學院, 陜西, 西安 710300)
傳統的設備或系統平臺之間的數據通信通常由并行總線的方式實現,但隨著系統的集成化發展,算法日漸復雜,數據量日益增長,系統功能需要多個芯片協同處理共同支撐。這種情況下并行總線無法滿足數據吞吐量要求,對整體性能反而是一種制約。FPGA利用串行并行轉換、數據時鐘恢復等技術避免了傳輸過程中的時鐘扭曲以及信號衰退等因素的影響,實現了以太網接口的高速傳輸,為高速以太網接口提供了可靠的解決辦法。
以太網是目前局域網中最常見的通信協議標準,包括10 Mbps、 100 Mbps、1 000 Mbps、10 Gbps等。其中,千兆以太網作為高速以太網技術應用最為廣泛,既傳承了之前的技術優勢,又具備自身獨特特性,采用8B/10B編碼規則適應光纖傳輸要求,采用載波擴展技術實現距離覆蓋,采用幀突發技術提升效率。
根據OSI標準,基礎的七層網絡模型包括物理、數據鏈路、網絡、傳輸、會話、表示及應用層。在以太網的層次架構中,核心技術體現在數據鏈路層,主要包括接入控制MAC層、邏輯鏈路控制LLC層。MAC層主要實現將用戶自定義格式封裝為標準的以太網數據幀以及進行地址過濾實現訪問流量管控,是確保數據傳輸可靠性的關鍵。
FPGA(Field-Programmable Gate Array)也稱為可編程門陣列,與傳統的微處理器相比,FPGA技術克服了定制電路的缺點,采用邏輯單元陣列的概念利用并行傳輸實現高速傳輸及信號處理,在資源復用、嵌入式處理器、微控單元方面應用廣泛。
目前TCP/IP網絡協議應用最廣,主要包括TCP、IP、IGMP、UDP等協議。TCP協議需完成3次握手且需要包括數據重傳,在硬件實現上難度較高。相對來說,UDP協議占用資源少,邏輯簡單,因此傳輸層選擇UDP協議,網絡層選擇IP協議用于格式封裝,同時去掉UDP和IP的首部,只保留數據包以降低硬件開銷[1]。基于簡化的UDP/IP協議棧的以太網格式如圖1所示。其中,傳輸層、網絡IP層、用戶層為處理用戶邏輯的上層協議,數據鏈路層為以太網MAC層。

圖1 簡化的協議棧格式
FPGA利用自身硬件加速及并行處理的優勢在大規模信號處理方面應用廣泛,但對于復雜的數據處理并不擅長,但PC具備這種數據處理能力。基于此背景,設計一種嵌入式的數據通信接口將以太網接入系統平臺,通過高速以太網接口將數據傳送至PC,由PC完成復雜運算。利用Xilinx的TEMAC核結合自定義簡化協議棧,實現系統平臺與PC間的高速數據傳輸。
為了完成整體的高速以太網數據通信接口,不僅要實現鏈路層的MAC控制和物理層的收發,還需要實現對用戶邏輯部分的上層協議處理。基于簡化后的UDP/IP協議棧,設計數據通信接口的總體框架包含3個部分:上層協議的數據包封裝與解析、數據鏈路層的MAC控制器、物理層的GTX收發器,設計框架如圖2所示。其中,物理層采用Xilink 7系列的FPGA中GTX收發器內置的串并轉換、線路編碼、時鐘修正以及數據恢復等功能電路實現物理層傳輸[2],因此本研究著重研究上層協議的數據包封裝與解析和數據鏈路層的MAC控制器。

圖2 高速以太網接口總體設計框架
上層協議的用戶邏輯處理主要包括MAC地址過濾、存儲地址解析、自定義協議解析以及數據包封裝4個部分。MAC地址過濾只接收與FPGA端的MAC地址匹配的數據包以實現地址過濾;存儲地址解析實現PC端MAC的提取和儲存;自定義協議解析實現數據字節拆解,結合PC端MAC地址作為數據發送的目標地址;數據包封裝在創建初始數據幀的基礎上完成增加目標地址、幀類型等處理動作后進行數據傳輸。
在數據幀rx_axis_mac_tdata中利用字段Address Field存儲接收數據目標主機的物理地址。rx_axis_mac_tvalid代表MAC輸出是否有效,FPGA端接收之后檢查目標地址pkt_mac_reg,判斷與自身地址my_mac相同則作為接收數據包去掉14個字節的幀頭接收之后的有效數據。不相同則進行復位[3]。整體過濾流程如圖3所示。

圖3 地址過濾流程
去掉14字節幀頭之后的有效數據存儲于64位寄存器out_cmd_i[63:0]之中,預先定義好存儲方式dest_mac_redister[47:0],比較out_cmd_i[63:0]中地址字節out_cmd_i[59:32]和預先地址字節ADD_DEST_MAC_L/H。如果與ADD_DEST_MAC_L相同,則FPGA端的數據包發送目標地址的低32位,如果與ADD_DEST_MAC_H相同,則FPGA端的數據包發送目標地址的高16位,最終解析出PC端的MAC地址,存儲在dest_mac_redister[47:0]之中。
去掉幀頭后的有效數據包括1個字節的操作類型OPCODE、1個字節的信道編碼Channel Num、4個字節的數據塊大小Block Size、4個字節的幀起始位置Start Address,34個字節的填充Zero Padding[4]。在接收到存儲地址解析模塊的PC端MAC地址,將其作為發送FPGA端的目標地址之后,讀取數據庫的幀字段里的Channel Num、Start Address、Block Size字段,將這3個字段加在數據包前端作為控制信息后發送響應包至PC端。
由于以太網的數據鏈路層最終輸出是8位的GMII數據,因此需將64位數據進行拆分,每個時鐘周期傳輸8位,以tx_axis_mac_tdata代表封裝好的標準數據幀,op_code代表操作類型,out_data_reg代表待發送數據包[5]。整體封裝過程如圖4所示。

圖4 數據包封裝過程
數據鏈路層的高速以太網MAC控制器采用GTX串行收發器與外部PHY芯片進行連接,基于TEMAC嵌入式三態以太網MAC硬核實現,控制器整體實現過程如圖5所示。

圖5 以太網MAC控制器
(1) 接收接口:接收數據后判斷是否符合協議標準,去除添加區域,提供接收結果信號。
(2) 發送接口:在待發送數據前增加前導編碼Preamble、起始符SFD、校驗序列FCS以及填充字段Pad使數據滿足以太網幀的長度規范。
(3) 8 bit用戶接口:為了支持GMII接口協議,用戶接口采用8 bit接口。
(4) GMII接口:將數據轉換為GMII格式,簡化外部處理邏輯。
(5) PCS/PMA接口:與GTX收發器相連,將內部并行接口GMII轉換為串行接口SGMII,利用串行收發器與物理層芯片通信[6]。
(6) 管理接口:采用AXI4-Lite總線實現寄存器配置。
為了驗證設計的高速以太網數據通信接口的功能以及性能,針對接口傳輸準確性以及傳輸性能2個方面進行了測試。PC端軟件采用VS軟件,在winpcap驅動的基礎上構建數據包。FPGA端采用26 MHz地寫時鐘,輸入數據流為416Mbps。對于傳輸的任意相鄰數據進行差值運算,相差為1則認為連續,沒有丟幀[7]。每個數據塊由204 800連續數據構成,每個數據為2字節,則數據塊大小為409 600bytes,得到輸出數據塊如下:
Blk Number=336
Prevblk last val=40204
currblk first val=40205
currblk 2nd val=40206
currblk 3rd val=40207
currblk 4 th val=40208
currblk last val=48396
Blk Number=337
Prevblk last val=48396
currblk first val=48397
currblk 2nd val=48398
currblk 3rd val=48399
currblk 4 th val=48400
currblk last val=56588
Blk Number=338
Prevblk last val=56588
currblk first val=56589
currblk 2nd val=56590
currblk 3rd val=56591
currblk 4 th val=56592
接下來將FPGA寫時鐘頻率分別定為30.72和61.44 MHz,利用WireShark抓包工具抓取數據并進行統計分析,根據數據包總數、丟包數、傳輸速率等信息判斷通信接口的性能情況[8]。在寫時鐘頻率為30.72 MHz時,理論上的傳輸速度應為30.72 MHz×16 bit=491.52 Mbps,實際傳輸速率為488.82 Mbit/s,丟包率為3.6×10-6。在寫時鐘頻率為61.44 MHz時,理論上的傳輸速度應為61.44 MHz×16 bit=983.04 Mbps,實際傳輸速率為942.21 Mbit/s,丟包率為0.23%。
由此可知,本研究設計的高速以太網數據通信接口在寫時鐘頻率為26 Mhz時未出現丟包現象,在30.72 MHz時丟包率很低幾乎可以忽略不計,在達到千兆極限的傳輸速率時,丟包率僅在0.23%,在預期范圍之內。
本研究基于FPGA技術在簡化的UDP/IP協議棧的基礎上設計了高速以太網MAC控制器,并對用戶邏輯的數據包封裝及解析進行了詳細設計,經過測試驗證接口準確性高、性能優異。但協議棧相對簡單,TCP協議相較于UDP協議更為安全,后續將對TCP/IP協議棧進行深入研究,以期在硬件開銷允許的情況下實現更安全更復雜的通信接口。