刘肖婷
(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 通道,传输速率还会有更大的提升空间。