文献标识码:A
DOI:10.16157/j.issn.0258-7998.2015.09.039
中文引用格式:李超,邱柯妮,张伟功,等. 基于PCIE总线主模式DMA高速数据传输系统设计[J].电子技术应用,2015,41(9):142-145.
英文引用格式:Li Chao,Qiu Keni,Zhang Weigong,et al. Design of a high speed data transmission system based on PCIE bus master DMA mode[J].Application of Electronic Technique,2015,41(9):142-145.
0 引言
PCIE总线是新一代的I/O互连标准,它可提供点到点的串行差分信号链路的互连设备,且具有高性能、高带宽、双单工等特点。因此,取代了早期并行PCI总线,从而满足了发展迅速的微处理器及存储器对速率和带宽的要求。PCIE总线主要特点如下[1]:
(1)PCIE设备在电气上使用差分驱动器和差分接收器来发送和接收信号,一条PCIE通道(简称x1)由两对LVDS差分信号线来实现接收和发送。
(2)可以根据需求配置为x1,x2,x4,x8,x16,x32模式,且x1通道峰值总带宽可达0.5 Gb/s,其余的是乘相应通道数[2]。
(3)数据使用数据包的格式,在链路上串行传输,用以保障数据的可靠性及完整性。
通过上述PCIE总线的特点,总结出PCIE总线具有高速的传输特性,特别是在高速DMA控制器传输方式下[3],具有更广阔的应用前景。
本文利用PCIE总线的高速串行传输等特点,采用Xilinx公司V5系列的FPGA芯片[4],基于PCIE2.0协议,设计出一个在FPGA板卡与PC之间以总线主模式DMA传输的高速数据传输系统。实现了数据的单字读写及总线主模式DMA读写通信方式,并利用上位机软件和ChipScope(嵌入式逻辑分析工具)观察并验证了读写数据的正确性。该系统为FPGA板卡作为数据采集板奠定了基础,可满足数据采集卡对速率及正确性的需求。
1 PCIE简介
与网络的分层协议类似,PCIE协议规范对设备的设计也采用分层的结构,如图1所示,从上到下有事务层、数据链路层、物理层,各层又都分为发送和接收部分。在发送部分根据设备核及应用程序的信息,在事务层形成事务层包(TLP),然后数据链路层在TLP包上附加一些信息用于检测等然后发送至下层,在物理层对其进行8B/10B编码然后发送至链路层。在接收部分是相反的操作。
信息以包的形式在PCIE设备间传送,由于本设计中利用了V5芯片内部的PCIE硬核,只有传输的包头和数据需要在代码中实现,其余的都是PCIE硬核自动生成并加到包头或包尾。如图2所示为给出的一个包头的通用字段[5],包头长为3DW或者4DW,分别可支持32 bit和64 bit存储器寻址。PCIE协议规定Fmt指示包的格式,Type指示包的类型,根据Fmt及Type的不同组合来定义不同类型的事务包。本系统主要实现单字读写及DMA读写,因此主要使用了事务层包中的存储器请求包及完成包两种。如果是一个存储器写事务,请求者会填写正确的TLP内容及地址并将数据放在TLP包头后发送给完成者,完成者会解析收到的包并将数据放到自己的存储空间中。如果是一个存储器读事务,请求者会填写满足存储器读事务的Fmt及Type字段等,完成者接收到该包后会根据要求生成完成包发送给请求者,请求者解析完成包并将数据存储。
每个PCIE设备的功能与其配置空间是相关联的,配置空间由配置寄存器构成,是软件与设备硬件进行交互与联系的区域,是实现即插即用的基础。软件可通过配置空间检测到一个PCIE设备的存在并通过它访问该设备,为设备申请其需要的资源(包括存储器、IO、中断等)。
2 软件、驱动程序及硬件设计
2.1 系统介绍
基于PCIE总线主模式DMA高速数据传输系统的设计框架图如图3所示,其中包括上位机软件、COM组件、设备驱动程序及硬件部分。其中上位机软件的主要功能是显示测试速度、DMA命令的设置与启动以及显示数据结果。COM组件封装了与驱动程序交互的函数,使得开发层次更加分明。设备驱动程序用于与PC内根联合体(RC)交互,最终通过根联合体的PCIE控制器与硬件FPGA进行通信。本文实现了单字读写及总线主模式DMA读写两种模式。总线主模式指的是以硬件PCIE总线端为主,向PC写入数据或者从PC读出数据。
2.2 软件及驱动
本系统的上位机软件界面采用Visual Studio2010编写,调用COM组件使其与驱动程序进行交互,COM组件封装了与驱动程序交互的函数,包括打开设备、单字读写、DMA读写的函数等,可以供上层软件使用,使用COM组件的好处是可以使得程序变得更加通用,上层的界面实现可以更加多样(例如可以是MFC、VB、网页或者是WIN32控制台)。如果需要增加一些功能,那么只需修改COM组件即可,使上层程序与驱动分离,各层的功能更加专一。
PCIE驱动程序的设计是参考Xilinx官网的驱动标准,该驱动是基于WDM模式的,参考该驱动作了相应的修改,利用WDK生成Win7系统使用的驱动文件并在系统检测到实验板后加载该驱动,使得COM组件可以实现单字读写及DMA的读写方式,并将DMA写的数据在软件界面中显示或者保存下来。
2.3 硬件设计
硬件设计部分主要包括PCIE的硬核及应用逻辑模块两部分,PCIE的硬核(IP)是利用ISE工具生成的,包括PCIE物理层及链路层模块,而应用逻辑模块(APP)包括接收引擎模块、发送引擎模块及存储访问模块。
2.3.1 模块简介
RX_ENGINE模块是接收引擎处理模块,负责解析IP核的数据包以及单字读、DMA读接收数据包的状态机。TX_ENGINE模块是发送引擎处理模块,负责单字写、DMA写状态及和中断控制。MEM模块是存储访问模块,里面包含DMA状态及控制寄存器用以控制DMA读写,这里的寄存器是利用PIO的方式写入的(即单字读写)。上层软件在界面中设置的长度、数量的值等将会写入到这些寄存器中。本设计中使用V5芯片中自带的PCIE IP硬核完成PCIE协议中物理层及数据链路层的功能。
2.3.2 DMA写流程
由于采用的是总线主模式的DMA方式,即一次DMA写的过程是由FPGA的RAM写入PC的存储器中,并在上位机软件中显示出来的过程。在TX引擎向硬核发送数据前,首先需要填充正确的TLP包头,包头的信息需要由上位机软件控制。DMA写的过程如下:
(1)在软件界面中设置本次DMA写的大小、数量、地址等及DMA写启动命令。
(2)驱动程序将第一步中设置的内容通过PIO(程控输入/输出)的方式,最终以TLP包的形式发送给硬件并写入到MEM中的DMA状态控制寄存器中。
(3)根据DMA状态与控制寄存器的内容,在收到DMA写启动命令后,TX引擎开始从RAM中读取数据并按第一步设置的DMA大小数量来组装TLP包然后发送到EP模块。在EP模块加入链路层及物理层的包头等信息后发送到主机存储器中。
(4)COM组件将DMA写地址的数据映射到上位机一个缓冲区中,上位机软件通过读取对应地址的缓冲区数据来验证数据并显示在其界面中。
其中TX引擎的状态转移过程如图4所示。在BMD_TX_RST_STATE状态中收到写启动命令后,填写存储器写TLP包头的前64 bit内容,包括图中的FMT、TYPT、LENGTH、ID等。然后跳转进入BMD_TX_MWR_QW1状态,该状态完成存储器写TLP包头的第二个64 bit内容,包括有地址及需要传输数据的高32位数据。最后跳转进入BMD_TX_MWR_QWN状态来发送剩余的数据,当发送数据的数量达到软件设置的DMA写大小后,跳转回BMD_TX_RST_STATE状态。其他的状态分别对应发送单字读完成包及存储器读包的状态。
2.3.3 DMA读流程
DMA读的过程是将上位机一个存储空间的数据读入到FPGA的RAM中,从硬件的角度上看是FPGA向PC发送存储器读命令,然后PC向FPGA返回带数据的完成包。但实现时是软件设置本次DMA读的地址、数量等然后启动本次传输,由FPGA接收数据并存入到RAM里,通过ChipScope可观察到数据。DMA读的过程如下:
(1)在软件界面中设置本次DMA读的地址、大小、数量等及DMA读启动命令。
(2)这些命令通过COM组件与驱动程序交互,并生成相应的TLP包发送给硬件,写入图MEM的DMA状态控制寄存机中。
(3)根据DMA状态与控制寄存器的内容,收到DMA读启动命令后,在TX引擎中根据刚刚软件设置的命令组装存储器读TLP包后发送给EP模块,在EP模块中加入数据链路层及物理层所需的包头等最后串行传出到上位机中。
(4)上位机根据收到的存储器读包,在指定的地址读取数据后形成带数据完成包(CPLD)返回给FPGA,并存储在FPGA内的一个RAM里。
其中RX引擎的状态转移过程如图5所示。在BMD_RX_RST_STATE状态中根据收到的包头类型来判断转入的下一个状态,如果收到的是一个完成包头类型则转入BMD_MEM_CPLD_FMT_TYPE状态,从收到的包中截取完成包的大小等进入BMD_RX_CPLD_QW1,从包中截取地址等信息后跳转进入BMD_RX_CPLD_QWN状态,在这里根据软件界面设置的DMA读的大小将读出的数据写入到完成包RAM中。完成后回到BMD_RX_RST_STATE状态。
3 仿真与实现结果
本文设计的总线主模式高速数据传输系统在将硬件部分烧录到板卡的FPGA芯片后,通过板卡的PCIE金手指插入到PC的主板上,PC重启检测到新的硬件插入后便可安装对应的PCIE驱动文件,成功安装去驱动后,便可使用上位机软件进行测试。
上位机软件界面如图6所示,包括有单字读写设置模块、DMA读写设置模块、传输速率显示模块、DMA写数据显示模块。
以一次DMA写为例来介绍上述模块,在软件上设置本次DMA写的TLP大小及TLP数量,将写模式复选框勾选并点击开始按钮,可在界面上看到传输数据的结果及本次测试DMA写的速度。
经多次实验测试,在上位机软件界面上设置DMA读、写TLP事务层包(即数据包)大小为128 B,传输数据包的数量为16,其中某次测得的写速度结果为3 390 Mb/s=423 MB/s,速度的大小与一次DMA传输的TLP数量及TLP包的大小有关。界面中显示的周期数(Cycles)为完成本次DMA所用的Cycle数量,实验板上采用V5LX85t芯片,且链路上采用差分信号传输,一个cycle用时为16/1 000 000 ns,由此可计算出传输128 B×16×8=16 384 B的数据用时为16×302/1 000 000 ns,速度约为3 390 Mb/s即423 MB/s,分析代码得出可能是由于存储及读取数据的过程会占用一定的时间影响速率,才使得速度没有达到pcie中x1通道的0.5 Gb/s的峰值带宽。将来也可根据需求将PCIE硬核配置x2、x4通道,会加快通信速率。
在DMA读测试中,FPGA向上位机读数据,并将数据存入另一个RAM中,上位机初始化时向一片地址的缓冲区内写入固定的数0x12345678,利用DMA方式读取该地址的数据,在ChipScope中可以看到写入的数据都是12345678,如图7所示。这里由于设定RAM是64 bit的,所以是两个重复的数字,且由于计算机内采用的是小端存储,所以显示的数为78563412。
本系统通过软件、驱动、硬件的协调设置,实现了基于PCIE总线的高速数据传输系统,首先通过软件界面设置读写的方式来配置硬件中的DMA状态与控制寄存器,然后在硬件代码中根据寄存器的内容完成单字读写或DMA读写的过程,最后将测得的数据及速率显示在软件界面上。
4 结束语
本文实现的基于PCIE的总线主模式DMA高速数据传输系统可以完成上位机与实验板卡通过PCIE进行单字读写或DMA读写大量数据,并达到较高的传输速率,x1通道速率可稳定在400 MB/s左右,为该实验板将来作为数据采集模块采集有用数据并提供给上位机分析奠定了基础。通过测试发现,在FPGA中利用core_gen生成的RAM还存在一定的缺陷,如容量不够大、占用芯片资源等问题,将来应替换成板卡上的SDRAM,以此来提高传输数据的数量,将该系统用于实际应用中。
参考文献
[1] 马鸣锦,朱剑冰,何红旗,等.PCI、PCI-X和PCI Express的原理及体系结构[M].北京:清华大学大学出版社,2006.
[2] BUDRUK R.PCI Express系统体系结构标准教材[M].田玉敏,王崧,张波,译.北京:电子工业出版社,2005.
[3] 张伟达.基于PCI Express的高速数据传输系统研究与开发[J].计算机测量与控制,2009,12(17):2555-2557.
[4] 王嘉良,赵曙光.用FPGA实现PCI-E接口和DMA控制器设计[J].计算机技术与发展,2011,21(6):181-184.
[5] 任连芳.基于PCI Express总线的数据传输与存储[D].南京:南京理工大学,2010.