孙欣欣,李 娟,田粉仙,杨 军
(云南大学 信息学院,云南 昆明650500)
随着现场信号采集速率、链路速度和处理器性能的不断提升,高速数据采集系统需要越来越高的数据传输速率将现场数据传输到计算机[1],因此设计高总线传输速率的数据采集系统至关重要.高速串行计算机扩展总线标准(Peripheral Component Interconnect Express,PCIE)作为目前使用最频繁的高速总线,优胜于以太网、USB、PCI,具有传输速率快、兼容性和扩展性好的特点,广泛用于PC端和外部设备之间的通信,如何利用PCIE总线对大规模数据进行高效传输已成为研究热点[2].
目前商业上直接存储器访问(Direct Memory Access,DMA)解 决 方 案 如Hitechglobal,PLDA,CAST和Northwest Logic等均使用分散聚集式DMA引擎的设计方法[3],DMA引擎可通过多个DMA进程并行运行,且每个进程通过PCIE接口进行连接.DMA引擎是实现DMA工作方式的功能部件,它负责在主机与网卡之间交互数据,并产生数据接收和发送中断,分散聚集DMA则从分布在内存非连续部分的缓冲区链表中收集数据.因现有DMA只能从连续物理内存的单个缓冲区中收集数据,所以本文以分散聚集DMA方式进行传输以取得更大的缓冲区,减少DMA数据传输的次数、现场可编程逻辑门阵列(Field Programmable Gate Array,FPGA)逻辑资源的使用,提高数据传输系统的整体性能.
本文对于高速网卡的通信需求,设计了基于描述符机制的DMA引擎,为提高数据吞吐量,采用DMA引擎控制操作系统CPU调度带来的限制.商业上可用的高性能DMA组件没有提供完全可配置的硬件控制传输数据流,并且通常仅限于单一的FPGA设备,文献[4-5]中出现的解决方案无法满足本文应用程序吞吐量的需求.针对以上问题,本文提出高性能的DMA引擎架构,该架构与Xilinx FPGA 6系列和7系列完全兼容,在此基础上设计出DMA双核引擎架构,并根据DMA引擎设计的Linux驱动程序,实现了FPGA板卡于PC之间的通信,满足高速实时采集、处理和传输数据的要求.经实验测试结果表明,本设计占用CPU资源小,且传输数据稳定可靠,可满足高速数据传输需求.
1.1 PCI ExpressPCIE使用高速差分总线,并采用端到端的连接方式[6].PCIE总线以数据包形式传递信息,数据报文在接收和发送过程中,需要通过多个层次,包括事务层(TL)、数据链路层(DL)和物理层(PHY)[7].事务层主要功能是传输和接收事务层数据包(TLPs),根据PCIE接口对事务层数据包进行组装和拆解以及配置数据包信息.数据链路层主要职责是为TLPs的交换提供可靠的机制.物理层用于链路数据交换,负责帧、去帧、置乱、解压缩、8B/10B编码和TLPs和DLLPs的编码.完整的PCIE数据包结构如图1所示,要求PCIE实现集成到任何特定的系统设计中,底层DL和PHY层的实现至关重要.
图1 PCIE总线数据包结构Fig.1 The structureof thedata packet of the PCIE bus
PCIEGen1以每条单通道2.5 Gb/s速度进行数据传输,PCIE Gen2将增加到5.0 Gb/s[8].由于PCIE Gen1和PCIEGen2使用8B/10B编码,所以每个通道的带宽分别降低到2 Gb/s和4 Gb/s[9].DL和TRN层中引入了额外的数据包开销,并使用8B/10B编码,则PCIEGen1以每条2.5 Gb/s速率传输的字节数为250 Mbps,PCIE Gen2吞吐量的峰值V可用公式(1)计算.
其中,Pa表示最大有效载荷大小,Hpice表示协议报头,N用作通道数,M表示每通道传输字节数.
1.2 分散聚集DMA原理在现有分散集聚DMA的传输过程中,如图2所示,DMA控制器首先从驱动读取描述符链表中的一个描述符并存到描述符引擎中,DMA控制器根据描述符引擎中的信息完成对应内存的数据传输后,描述符更新引擎将此描述符的更新信息传到描述符链表中,然后描述符引擎通过指向下一个描述符的指针向驱动获取下一个描述符的信息,由此进行下一个描述符对应内存的数据传输[10].此方式在传输完成一个描述符对应内存的数据后,需要等待描述符更新引擎、信息和描述符引擎读取下一个描述符的信息,降低了数据传输的持续性.
图2 传统分散聚集DMA结构图Fig.2 The structure of traditional scatter-gather DMA
2.1 DMA引擎设计在上位机驱动中对描述符链表作了提取处理,且每个链表项控制着一个数据块的传输,将这个数据块传输完毕后,选择并装载另一个链表项继续DMA操作或停止DMA流.本设计直接选取上位机内存地址位和数据长度位发送至DMA控制器[10],当DMA控制器初始化以后,描述符引擎将直接进行提取描述符链表,不需与驱动进行握手操作,而驱动也将描述符系统的地址位和数据位发送至描述符引擎,因此取消了描述符更新引擎.改进后分散聚集DMA结构如图3所示.
图3 改进后分散聚集DMA结构图Fig.3 The structure diagram of improved scatter-gather DMA
根据改进后的DMA分散聚集的传输模式,提出了一种DMA引擎新架构,该构架的描述符链表存储于FPGA内存中,DMA引擎在写操作时自动加载内存块的物理地址,然后驱动程序编写描述符,列出初始化视图.DMA引擎的完整架构如图4所示,TX 引擎和RX引擎通过地址表和基址寄存器进行配置,配置后的寄存器通过PCIE接口进行DMA传输,TX FIFO和RX FIFO对传输数据进行存储.TX/RX引擎与用户之间的接口逻辑类似于128 bit的FIFO接口,该接口根据PCIE IP核的输入/输出设置数据宽度.
图4 DMA引擎构架Fig.4 Theenginearchitecture of DMA
由于预期数据的大小超过操作系统可分配的最大内存,因此驱动程序在用户内存中使用了一个有限大小的环形缓冲区,输入数据包被放置在环形缓冲区中的下一个可用缓冲区.驱动程序将输入数据包传给内核的其它部分处理,并在环形缓冲区中放置一个新的DMA缓冲区,减少在FPGA内存描述符所需的内存数量.在FPGA和驱动之间运行DMA引擎时,DMA引擎将数据写入环形缓冲区,同时驱动程序将数据移动到更大的应用程序内存空间,以便进行快速实时细化、防止数据丢失和吞吐量降低.
内存写入握手序列使用两个不同的指针WR和RD,分别为写入和读取的数据.WR指针存储在外部内存中,由DMA引擎更新,并指向包含最后写入的4 KB内存页地址的描述符.RD指针存储在FPGA内部,由Linux驱动程序更新,并指向驱动程序读取的最后一个4 KB内存页的地址.完整的工作流程如图5所示,具体描述如下.DMA引擎加载一个描述符(1)并将数据从FPGA移动到环形缓冲区(2),驱动程序读取更新后的WR指针(4),并且在将数据移动到GPU(5)之后,用最后读取的地址(6)更新FPGA中的RD指针,DMA引擎从内部列表加载一个新的描述符,为了避免覆盖循环缓冲区中的数据,它将这个地址与RD指针(7)进行比较,如果驱动程序比DMA写入数据慢,写入过程暂停,直到RD更新.当所有数据从FPGA移动到PC时,DMA用最后一个描述符更新WR指针,并通知驱动程序在最后4 KB页面中写入的确切数据量,中断产生并通知中央处理器传输结束.
图5 握手序列流程图Fig.5 The flowchart of Handshake sequence
2.2 双核DMA引擎设计在2.1 节DMA引擎架构的基础上设计出双核DMA引擎,如图6所示.本文双核DMA引擎设计方案中选择主从架构,地址表设置在DMA Master和DMA Slave之间,DMA Master和DMA Slave通过M2S_START和S2M_DONE进行数据传输,之后通过PCIE Gen2 x8 IP核并行运行,连接到外部的x16 PCIe桥接器,通过x16通道将数据传输到PC机.本设计FPGA卡板连接到一个x16 PCIE插槽,并通过双核DMA引擎方式,使每个Xilinx PCIEIP核达到最大通道数量,以确保PCIEIP核数据的一致性,占用FPGA最小化区域.
图6 双核DMA引擎架构Fig.6 The engine architecture of dual-core DMA
图7 双核DMA引擎时序图Fig.7 The engine timing diagram of dual-core DMA
双核架构的时序图如图7所示,DMA引擎使用两个控制信号同步传输.在系统初始化和握手过程中,Linux驱动程序只需要与DMA主引擎交换控制命令,从引擎以空闲状态等待,当主引擎从表中加载一个新地址时,M2S_START启动,表示内存写操作开始.在此阶段,主从引擎以交错模式工作,将数据写入4 KB同一页面的不同部分,其中TLP大小和地址之间的对应偏移量由负载值的大小决定.双核架构的握手序列步骤如下:当主引擎写入2 KB,等待S2M_DONE的断言,取消对M2S_START的断言;当从引擎写入2 KB时,断言S2M_DONE标志并等待M2S_START被断言.完成上述序列后,主引擎从地址表加载一个新地址,传输继续,此时主从引擎之间存在速度不对称,也能保持正确的数据顺序.
双核DMA引擎框架对DMA写数据的步骤如下:DMA写数据被加载到工作频率为250 MHz的256 bit FIFO中,之后DMA写数据的数据流被分成和最大有效负载大小相等的数据包,交替发送到位于DMA引擎之前的FIFO中,此时两个引擎并行运行,无需Linux驱动程序进行任何进一步处理,也可以按照正确的顺序将数据写入环形缓冲区.其中,FIFO用于将数据位的宽度256 bit转换为128 bit,根据环形缓冲区中页面的大小选择FIFO的深度,以确保每个4 KB页面正确填充.
3.1 实验环境基于FPGA芯片的高速并行处理能力、Xilinx的Virtex-6 XC6VLX240T主控芯片和Xilinx ISE14.7 作为开发工具的实验开发平台[11],该实验平台支持PCIE 2.0 x8模式的PCIE链路,使用Verilog HDL语言完成FPGA硬件设计.FPGA卡板通过PCIE接口连接到主机,主机CPU为Intel i7-4770 3.4 GHz处理器和Intel X58芯片组,操作系统为Linux.
按照本文DMA引擎设计,通过ISE综合、映射与布局布线后,由表1可知本设计的DMA单核引擎占用资源为Slices 2110、LUTs 2600和BlockRAM/FIFO 12,DMA双核引擎占用资源为Slices 2530、LUTs 4102和Block RAM/FIFO 36.DMA双核引擎的硬件逻辑资源占用虽比文献[3]的Block RAM/FIFO占用资源多,但均比文献[3,5]的Slices、LUTs的逻辑资源消耗少.同样,DMA单核引擎的硬件逻辑资源均比文献[3,5]的消耗少.由此可知,本设计节约了FPGA硬件资源.
表1 FPGA逻辑资源占用表Tab.1 The logic resourceoccupation table of FPGA
3.2 性能测试本文对Xilinx PCIE Gen2进行DMA引擎性能测试,因Virtex-6 FPGA连接套件将配套提供专门针对Virtex-6精心优化的Northwest Logic DMA引擎评估版,则本文安装带有Gen l x8的Virtex-6 XC6VLX240T-1FFG1156I设备的Xilinx ML605板以及用Virtex-6 LX240T-2FFG1759C设备的HTG-V6HXT-X16 PCIE板进行单核DMA引擎测试;同时用Virtex-6 GTH(HX380T FF 1923)设备的HTG-V6HXT-X16 PCIE板测试双核DMA引擎的性能,并将PLX技术的PEX8632芯片作为外部系统和Linux驱动程序的桥梁,安装在主板上,最后将Virtex-6开发板插在PC机的PCIE插槽中.
实验针对高速数据传输系统下的DMA单核引擎和DMA双核引擎下的吞吐量进行了测试验证对比.为验证DMA引擎的吞吐量,在测试中,本文直接在环形缓冲区上执行数据一致性检查.在单核情况下,数据从环形缓冲区复制到用户应用程序空间;双核解决方案中,使用4通道内存控制器的硬件设备处理数据,因使用带有2通道内存控制器的硬件设备性能最大可达5 400 MB/s.在这两种情况下,数据吞吐量为DMA写数据的平均值,代表可实现的写入速度,本文使用512 KB的环形缓冲区连续读取DMA吞吐量与DMA传输数据量大小的关系如图8~9所示.
图8 DMA吞吐量的设计值与理论值Fig.8 The design value and theoretical value of DMA throughput
图9 256Byte-单双核DMA吞吐量变化曲线Fig.9 The throughput change curve of 256Byte-single and dual core DMA
图8表示在不同DMA传输数据量大小下,单、双核DMA引擎数据吞吐量的测试结果.DMA吞吐量随传输数据量的增加而增加,当传输数据从32 KB增加到512 KB时,吞吐量的值呈直线式增长,DMA传输的数据量达到某个特定值时,将缓慢呈现平行于横坐标趋势.当PCIE的有效载荷为128B时,DMA传输数据量大于1MB时,Gen2 x8 DMA引擎的最大吞吐量为3 721 MB/s,Gen2 x16 DMA引擎的最大吞吐量为6925 MB/s,均达到理论值吞吐量的90%.同时,对比Gen1 x8-128B,本设计的Gen2 x8-128B和Gen 2x16B-128B的DMA吞吐量有较大的提升.
如图9所示,与图8相比当PCIE的有效载荷为256B时,与预期一样,传输较小数据时,系统的吞吐量会减少,与Gen2 x8 DMA引擎情况下相比,双核引擎将更接近PCIE理论的可用吞吐量,即Gen2 x16 DMA引擎约增加了一倍,超过了6 925 MB/s,达到了理论值的91%以上.经实验结果可知本设计的DMA引擎吞吐量介于DMA理论吞吐量的90%到95%之间,能满足各种高速数据传输.
由文献[12]给出的公式可知,接口通路的数据吞吐量,在协议开销、有效载荷等基本一致的情况下,与物理通道的数量成正比[13].因此,在相同工作模式下,比较Gen2 x8通道的传输速度即能得到Gen2 x16物理通道传输性能的优劣.
本设计DMA引擎的Gen2 x8通道相比文献[14]和文献[15]中给出的测试结果,传输速度提高近17%.图10为3个设计方案的接口通路传输速度测试结果对比.文献[14]给出了8通道在4-lane PCIE高速接口时的传输速度,与该条件比较,本设计传输速度提高近20%;与文献[15]给出测试结果的最高传输速率数据相比,本设计有着15%左右的提升;与文献[14-15]相比DMA 引擎在Gen2 x8通道时,本设计有较好的传输速度,同样在Gen x16通道时,依然有着较好的传输速度.
图10 3个设计方案的接口通路传输速度对比Fig.10 The interface path transmission speed comparison of three design schemes
本文基于FPGA技术实现了一种兼容Xilinx Virtex-6和Virtex-7 PCIe Gen2内核的高吞吐量DMA引擎.本设计的DMA单核引擎达到了理论吞吐量的92%,DMA吞吐量最高可达3 721 MB/s,提高了PCIE有效利用率;为了满足应用程序的需求,设计并实现了DMA双核引擎架构,该双核构架DMA吞吐量增加为6925 MB/s,不仅节约了硬件资源,还提高了数据传输速度,经测试,达到设计要求.本设计为高速数据采集接口提供通用方案,具有一定的应用价值和实际意义,可被广泛应用于各种类型的高速数据传输的系统中.