【学术论文】基于FPGA的PCIe总线接口的DMA控制器的设计
随着通信技术的不断发展,对数据传输系统的速度与数据传送质量的要求也在不断提高。由Intel在2001年提出的第三代I/O总线技术——PCI Express总线技术,采用高速差分串行的方式进行数据传输,具有高带宽、高可靠性、高拓展性等优点,很好地弥补了PCI、PCI-X总线的不足。
本文基于PCIe 2.0协议,利用Altera Transceiver PHY IP、Synopsys PCIe Core IP和AXI总线,提出了一种DMA控制器,并搭建了一个在FPGA端和PC之间的高速数据传输系统。实现了寄存器读写操作(单字读写)和DMA读写操作,并利用Synopsys VIP环境下进行的系统仿真和上位机软件进行观察并验证了数据读写的正确性。
1.1 基础模块
1.1.1 Altera Stratix V GX系列FPGA与PCIe PHY IP
本设计使用Stratix V GX系列下的5SGXEA7K2F40C2N FPGA芯片,该芯片内部集成了PCIe PHY IP硬核模块。PCIe PHY IP硬核包括三个部分,如图1,PHY IP Core for PCI Express(PIPE)集成了PCIe总线的物理层。Transceiver Reconfiguration Controller IP Core可以动态重新配置模拟参数。Transceiver PHY Reset Controller IP Core作为收发器的复位模块,确保了PCIe链路的初始化。
1.1.2 Synopsys IP与VIP
VIP顾名思义就是验证IP(Verification IP),它为一些标准的接口提供标准的总线行为模型。Synopsys公司提供了PCIe总线的Controller IP,实现了PCIe总线数据链路层和事务层的功能,并内置了DMA,同时也提供了针对PCIe总线的VIP,为PCIe总线提供了标准的总线行为模型,模拟了上位机的功能[8]。
1.1.3 AXI总线
AXI(Advanced eXtensible Interface)总线是一种高性能、高带宽、低延迟的总线协议,有一个显著的特点,地址/控制和数据通道是分开的,共有5个单向通道,分别为read address channel,write address channel,read data channel,write data channel,write response channel[9],减少了延时,提高了DMA的效率。
1.2 总体方案设计
本设计采用的整体架构如图2所示,为Altera PHY IP+Synopsys PCIe Core IP+AXI总线+Application。
为了利用Synopsys 的PCIe VIP环境,采用了Synopsys PCIe Core IP。在PCIe事务层和应用侧之间采用了AXI总线接口,可以在以后的设计中进行方便的拓展和替换。应用侧设计实现了PCIe DMA控制器的功能,并集成了两块RAM,一块大小为128 DW,用来存储寄存器读写的数据;另一块大小为512 DW,用来存储DMA读写的数据。
2.1 应用端DMA操作流程
应用端发起的DMA操作流程如图3所示,最终DMA读操作实现的结果为将主机侧的数据以DMA的方式写入到应用端的内存中。DMA写操作实现的结果为将应用端的数据以DMA的方式写入到主机侧的内存中。图3为应用端发起的DMA操作具体的流程。
(1)主机侧通过寄存器写的方式,将DMA读写标志、DMA长度、DMA源和目的内存地址写入到应用端的寄存器中;
(2)应用端中的Slave模块将这些命令发送给Master模块;
(3)Master模块按照Synopsys PCIe Core IP自定义的Dbi总线的方式,再将这些命令传送给PCIe Core IP内部的寄存器;
(4)PCIe Core IP接收DMA读写指令,并持续操作Master接口以实现后续操作;
(5)当为DMA读时,PCIe Core IP的内置DMA从主机侧的“源内存地址”中读取到目标数据;当为DMA写时,PCIe Core IP的Master接口通过AXI总线以读的方式从“源内存地址”读取到目标数据;
(6)当为DMA读时,PCIe Core IP的Master获得DMA读取到的目标数据,并通过AXI总线,以写的方式写入到应用端的“目的内存地址”中;当为DMA写时,Master获得目标数据后,内置DMA将数据发送到主机侧的“目的内存地址”中;
(7)当DMA操作完成,PCIe Core IP会通知应用端的中断模块;
(8)应用端的中断模块会向主机侧提交中断。
2.2 应用端DMA控制状态机
应用端只需将主机侧写入的DMA读写标志、DMA长度、DMA源和目的内存地址以及DMA启动信号写入到PCIe Core IP中的内部寄存器,并等待DMA操作的完成,给出中断信号。
下面为应用端详细的DMA控制状态机,如图4所示,状态机把DMA读操作和DMA写操作整合到了一起,减少了代码量。
(1)IDLEPHASE:空闲状态。当启动信号start_flag有效时,跳转ENGINE_ENABLE状态;
(2)ENGINE_ENABLE:判断DMA读写类型信号wr_rdn_flg,当wr_rdn_flg为0,即为DMA读(PC到FPGA)时,使能DMA读引擎;当wr_rdn_flg为1,即为DMA写(FPGA到PC)时,使能DMA写引擎;
(3)DMA_TRANS_SIZE:设置DMA数据传输长度,最多一次传输512 DW,最少一次传输1 DW;
(4)DMA_SAR:设置DMA操作源地址(当为DMA读时,源地址为主机端地址;当为DMA写时,源地址为应用端地址);
(5)DMA_DAR:设置DMA操作目的地址(当为DMA读时,目的地址为应用端地址;当为DMA写时,目的地址为主机端地址);
(6)DMA_DOORBELL:使能DMA操作门铃信号dma_strt,启动DMA操作;
(7)DMA_WAIT_INT:等待DMA操作完成;
(8)DMA_INT_STATUS:读取DMA操作中断寄存器状态,当DMA操作完成信号dma_done有效时,产生完成中断,并跳转DMA_CLEAR_INT状态;
(9)DMA_CLEAR_INT:清除中断,回到IDLEPHASE状态,准备下一次DMA传输。
3.1 仿真验证
在完成代码编写之后,在VIP环境下搭建仿真平台,使用Synopsys公司的仿真验证工具VCS进行功能测试,主要测试验证模块能否正确对寄存器读写和DMA读写产生正确的反应。
从图5、图6中可以看到,写地址偏移为0x40,写数据为32’h87654321;读地址偏移为0x40,读数据为32’h87654321,由此可判断寄存器读写正确。
如图7所示,由dma_strt和dma_done信号可以看出为2次DMA传输,由dma_wr_rdn可看出第一次为DMA读操作(RC端到APP侧),第二次为DMA写操作(APP侧到RC端)由dma_bc_len可看出当前DMA操作长度为2 000 Byte,即500 DW,slv_rdata和slv_wdata信号较为密集的部分分别为2次DMA操作的数据,对比这两次数据,得知DMA操作正确。
为了更加方便地比较结果,采取自动对比文件的方法,即把寄存器或DMA写的数据存放到一个文件中,再把寄存器或DMA读回的数据存放到另一个文件中,通过对比两个文件,判断寄存器和DMA传输是正确的。
3.2 FPGA测试验证
在仿真验证完成之后,进行FPGA测试验证,将硬件部分烧录到板卡的FPGA芯片后,通过板卡的PCIe金手指插入到PC机的主板上,PC机重启后检测到PCIe硬件的插入,即可安装对应的PCIe驱动软件,利用上位机进行测试。
上位机软件界面如图8所示,包括寄存器读写(Target操作)和DMA读写(Master操作)测试模块。
选择“Target”操作的“dual”模式,寄存器长度设置为118,因为前10个寄存器与DMA操作相关,可能会触发DMA操作,所以在软件中选择跳过。点击“启动测试”,数据将会被先从主机侧写到FPGA,再从FPGA读回到主机侧,比较两次寄存器操作的数据,即可判断寄存器操作的正确性。
如图9所示,选择“Master”操作的“dual”模式,点击“memory”,即在PC侧开辟一块内存存放数据,然后点击“启动测试”,数据先从PC写到FPGA的RAM中,接着再从FPGA回到PC,比较存放到PC内存的数据和从FPGA写回到PC的数据,即可判断DMA读写操作的正确性。
根据DMA传输固定大小的数据的时间,可以计算出DMA读写速率,经过多次测试,DMA读写速率分别为1 547 MB/s和1 607 MB/s。本设计采用的是PCIe Gen2、×4通道,理论最大传输速率为2 000 MB/s。分析代码得出可能由于应用端向PCIe Core IP写入和读取数据过程占用了一定的时间,另外驱动程序向DMA寄存器写入或读取参数也占用了一些时间,都会影响速率。
本文实现的基于FPGA的PCIe总线接口的DMA控制器是在Altera PHY IP和Synopsys Core IP的基础上实现的,利用Synopsys VIP验证环境进行了功能仿真验证,并通过FPGA进行了系统实测,达到了较高的传输速率,在Gen2、×4模式下,DMA读写操作的带宽分别为 1 547 MB/s和1 607 MB/s,达到了预期的设计目标。