劉肖婷
(1.北京全路通信信號研究設計院集團有限公司,北京 100070;2.北京市高速鐵路運行控制系統工程技術研究中心,北京 100070)
鐵路信號設備是鐵路運輸的基礎設施,是保證行車安全、提高運輸效率的重要設備,在傳遞信息和改善行車人員勞動條件等方面發揮著重要的作用。為提高鐵路信號的安全性和可靠性,鐵路信號設備多采用冗余結構或混合冗余結構。結合鐵路設備冗余結構,基于現場可編輯門陣列(Field Programmable Gate Array,FPGA)可擴展處理平臺,開發一種高速數據傳輸系統,同時有效減小CPU 負載。
本系統利用ARM Cortex-A9 雙核處理器高速數據通信的功能,同時基于該處理器高性能和高能耗的特性,降低功耗和成本。利用FPGA 可編程平臺,設計高速率、多通道的高速串行計算機擴展總線標準(Peripheral Component Interconnect Express, PCIE)接口。同時設計千兆以太網和萬兆以太網接口,以滿足不同速率以太網的需求。
硬件系統采用Xilinx 公司的UltraScale+XCVU9P-L2FLGA2104 FPGA。 上位機與FPGA 間通過PCIE 2.0 通信,使用直接內存存取(Direct Memory Accessuart,DMA)的數據傳輸方法,能有效減少CPU 負載,提高數據傳輸速率。FPGA 之間通過千兆或萬兆以太網通信。硬件系統還包括串行外圍設備(Serial Peripheral Interface,SPI)接口、通用異步接收/傳送器(Universal Asynchronous Receiver/Transmitter,UART) 接 口、SD 卡 接口、片內RAM 以及外部存儲器控制器等。硬件系統基本結構如圖1 所示。硬件系統外接SD 卡存儲驅動程序,并通過PCIE2.0 與Host PC 通信。

圖1 硬件系統基本結構Fig.1 Hardware system basic structure
FPGA 通過PCIE 2.0×4 連接上位機,FPGA之間通過10 G 或者1 G 以太網通信。發送主機Host PC-A、接收主機Host-B、發送下位機FPGA-a 和接收下位機FPGA-b 之間數據通信系統結構如圖2 所示。該通信系統主要實現PCIE 系統邏輯、以太網數據傳輸以及DMA 數據傳輸。其中PCIE 系統邏輯實現PCIE 總線協議的核心部分,包括物理層和數據鏈路層的全部功能,以及應用邏輯數據傳輸所依賴的傳輸層部分。

圖2 數據通信系統結構Fig.2 Data communication system structure
圖2 中上位機與FPGA 之間的通信是基于DWC PCIE Core 的DMA 數據傳輸,上位機系統內存為DMA 通道分配內存,即DMA 映射區,也叫DMA 緩沖區。用戶將應用數據寫入上位機系統內存,DMA 把數據從DMA 緩存區傳送至FPGA片內RAM。上位機系統內存與FPGA 片內RAM之間就建立了一條DMA 通道。
下位機之間通過以太網進行數據通信。該系統設計成6 組以太網接口,4 路千兆以太網和2 路萬兆以太網,以滿足不同場景對以太網速率的差異化需求。
上位機與FPGA 及FPGA 之間數據通信過程如圖3 所示,FPGA 之間以GMAC 為例說明。Host PC-A 為數據發送端,Host PC-B 為數據接收端。Host PC-A 發送數據時,首先查詢FPGA 片內PCIE 接收數據緩存狀態寄存器。如果該緩存狀態為空,Host PC-A 把數據幀發送出去并啟動DMA操作。

圖3 數據傳輸流程設計Fig.3 Data transmission process design
啟動DMA 操作主要包括檢查與配置DMA 控制寄存器。首先查詢DMA 通道狀態是否空閑,如果正在使用則返回錯誤,空閑則獲取數據幀大小。然后使能DMA 讀引擎和Linked List 操作模式,將linked list data 寫入DMA channel context寄存器中,使DMA 能夠多次對多塊內存進行讀寫操作。最后配置Doorbell Number 指定DMA 傳輸通道并開啟DMA 數據傳輸。由于在驅動程序中使能了iATU 單元,內核首先需要檢查TLP 地址域首尾地址是否在outbound 寄存器組中,如果匹配成功,DMA 將會啟動數據傳輸,把Host PC-A 系統內存數據讀至FPGA 片內PCIE 接收數據緩存中。之后Cortex-A9 處理器-a 會收到PCIE 控制器的INTR1。如果INTR1 為數據傳輸錯誤中斷,處理器會進入相應的中斷響應程序。如果為數據傳輸完成中斷,處理器會把PCIE 緩存區狀態置為滿狀態。
FPGA 將通過PCIe 總線接收的數據保存至片上RAM,FPGA 接收數據之后給Cortex-A9 處理器發送中斷,Cortex-A9 處理器接收中斷之后將控制權交給以太網DMA,以太網DMA 將FPGA 片上RAM 中的數據讀出,保存至以太網模塊的內存中。GMAC 控制器等待DMA 數據傳輸完成后,通過以太網把數據發送出去,同時觸發中斷INTR2給本地處理器,處理器檢測到GMAC 中斷之后將緩存區狀態置為空。
接收端GMAC 接收數據后發送中斷INTR3 給Cortex-A9 處理器-b,處理器檢測到接收數據中斷后,將GMAC 接收緩存區狀態置為滿狀態,同時會發送MSI 中斷給Host PC-B。Host PC-B 檢測到MSI 中斷就會啟動DMA。DMA 數據傳輸如果出現錯誤,就會給Host PC-B 發送錯誤中斷,Host PC-B 響應的中斷。如果數據傳輸完成且沒有出錯,PCIE 控制器發送中斷INTR4 給處理器-b,處理器-b 將內存狀態置為空,這就完成了一次DMA 讀寫數據過程。
FPGA 之間的通信基于MAC 層的數據傳輸。基于ucosii 驅動程序,通過socket 編程實現TCP/IP協議,以保證數據的可靠性傳輸。socket 編程的實現以及TCP 服務器端和客戶端通信過程如圖4 所示。

圖4 TCP服務器與客戶端通信過程Fig.4 Communication process between TCP server and client
服務器端調用NetSock_Open 和NetSock_Bind 函數分別創建并監聽套接字。之后調用NetSock_Listen 函數允許操作系統開始接收客戶、完成連接階段并把他們放入被服務的列表。之后服務器進程開始循環,并且依次對客戶進行服務。每次循環,服務器進程都會調用NetSock_Accept 函數從服務列表里取出一個客戶對其進行服務。如果列表為空,那么NetSock_Accept 函數進入阻塞狀態,直到出現一個客戶待服務。NetSock_Accept函數返回一個新套接字,該套接字是由內核為服務器接受客戶連接創建的已連接套接字。
客戶端首先調用NetSock_Open 函數創建套接字,然后調用NetSock_Conn 函數建立與TCP 服務器的連接,發起三路握手。建立連接后,客戶端與服務器端可以交換數據。
使用Wireshark 軟件捕獲建立連接前3 次握手,建立連接后數據發送與接收,數據傳輸完成后、握手結束的完整過程。Wireshark 捕捉到的數據傳輸過程如圖5 所示。

圖5 基于TCP/IP協議的數據傳輸Fig.5 Data transmission based on TCP/IP protocol
本文采用FPGA 設計了上位機與FPGA 之間基于DWC PCIE Core 的DMA 數據傳輸,以及FPGA 之間基于以太網的數據傳輸。通過DMA 的數據傳輸以及共享內存的設計,能夠大大減少上位機CPU 負載,提高數據傳輸效率。通過TCP/IP socket 編程,保證數據的可靠性傳輸。如果采用更高版本的PCIE 或者16 通道,傳輸速率還會有更大的提升空間。