vivado pcie DMA传输实战

  1. 写在前面

    在我的另一篇博文中我已经详细介绍了如何对Xilinx pcie IP进行PIO数据传输vivado vc707 pcie传输实验。但是,PIO模式仅能用来传输少量的数据,因为它全程需要CPU监督运行,这样的运行方式非常不利于大量数据的传输。幸运的是,在这方面已经有了很多的参考,使我们这些新人学起来不是那么费劲。xapp1052出来的时间很早,它是Xilinx官方出的用来测试pcie IP核性能的程序。关于它的缺点,网上已经有很多人写过,比如这篇DMA技术之PCIE应用(XAPP1052注意点),这篇文章对xapp1052的问题说的很清楚,包括DMA读写过程,建议读一读;还有这篇别人转载的Xilinx FPGA 的PCIE 设计,这篇文章的前半部分介绍了pcie的理论,后半部分介绍并实现了如何仿真xapp1052 的DMA。虽然xapp1052有很多的缺点,但是优点也同样突出,对于初学者来说非常适合作为DMA的入门,这主要源于它的代码结构非常清晰,而且接触了DMA底层传输的实现;有时候你可能发现pcie理论看了一大堆觉得自己已经懂了很多,但是细想却发现自己什么也不懂,那就是因为缺乏实际的工程训练,而xapp1052就是这样一个非常好的工程。本篇博文暂时决定分为三小节的内容,分别为:xapp1052源码解析、xapp1052部分问题、解决办法。

  2. xapp1052源码解析

    xapp1052经历了多次的版本更迭,目前最新的版本是3.3,可以Xilinx官网下载;在最新的版本中添加了对Kintex7系列FPGA的支持,也可以移植到Artix7以及Zynq7000系列Soc上;官方的原话如下:
    在这里插入图片描述
    我这里使用的是Virtex7系列的,其实也是兼容的。 XILINX 公司 7 系列的 FPGA 全部采用了 AXI4 总线协议,所以 BMD 代码并不能直接使用。因此在最新的版本中官方提供了“TRN协议”(不准确的叫法)和AXI-Stream协议的转换代码,所以这部分不需要我们操心。完整的BMD工程如下所示:
    BMD完整工程
    图中的阴影部分是我自己加的。图中axi_trn_top.v以及下面的两个子模块就是完成协议转换的。 在这里插入图片描述
    BMD_EP_MEM.v、BMD_64_RX_ENGINE、BMD_64_TX_ENGINE这三个文件是我们需要特别关心的。BMD_EP_MEM.v里面包含了各种寄存器,上位机对EP端进行DMA读写、上电配置初始化等过程都要先对这里面的寄存器进行操作。
    我们可以看一下这个文件中的第一个寄存器都包含哪些内容
    在这里插入图片描述
    这个寄存器是reg0,里面有上位机对EP的复位、置位操作,也有EP发给上位机的rd_d_o[31:0]数据。在上位机程序中有*VIRTEX5_WriteReg32();*函数,通过该函数可以向EP端寄存器中写入各种数据,从而达到配置DMA传输的目的。详细的寄存器功能描述可以参考Xilinx xapp1052.pdf这本英文的官方文档。
    BMD_64_RX_ENGINE.v该文件是用来接收从上位机发过来的各种TLP包,并对包进行解析。解析包的类型如下图:
    在这里插入图片描述
    BMD_64_TX_ENGINE.v用来向上位机发送各种TLP包,并且产生Legacy 中断信号以及MSI中断消息,发送包类型如下:
    在这里插入图片描述我们只考虑存储器读写操作,我们来看一下BMD工程是如何完成这些操作的。
    官方对此的描述为:
    在这里插入图片描述
    1、存储器读:首先对EP端进行复位,通过PCIE的PIO模式向EP端寄存器0写0x00000001,用来复位EP,然后再通过写0x00000000取消复位(在xapp1052中有两个复位,一个是FPGA本身的硬件复位rst_n,还有一个是上位机发来的复位信息init_rst),随后发送读取数据的地址、要读取TLP的长度、个数等;第六步启动DMA传输,第七步等待EP端发送的中断信号。另外需要说明的是,存储器读是上位机发送数据给EP;存储器写是EP发送数据给上位机内存。
    数据是这样传输的:首先EP通过发送TLP给上位机,告诉上位机我需要多少的数据,然后上位机将数据以完成报文的形式发送给EP,随后的RX_ENGINE将完成报文的数据接收,做进一步的处理(xapp1052直接将数据丢弃了)。
    2、存储器写:存储器写比

《Xilinx PCI Express Windows DMA驱动程序和软件指南》为用户提供了关于如何在Windows操作系统上使用Xilinx PCI Express DMA驱动程序和软件的详细指导。 该指南首先介绍了Xilinx PCI Express DMA的基本概念和架构,以便用户对其工作原理有一个基本的了解。然后,指南提供了有关如何安装和配置Xilinx PCI Express DMA驱动程序的详细说明。用户可以按照指南中的步骤一步一步地进行安装和配置,以确保驱动程序能够正确地与Windows操作系统进行交互。 接下来,指南介绍了如何在Windows操作系统上进行DMA传输。它详细讲解了如何使用Xilinx提供的API和库来实现DMA传输,并提供了示例代码和实用技巧。用户可以根据自己的需求和应用场景来选择合适的API和库,并根据指南中的说明进行配置和使用。 此外,指南还提供了一些常见问题和解决方案,帮助用户解决在使用Xilinx PCI Express DMA驱动程序和软件过程中可能遇到的一些常见问题。用户可以通过查阅这些解决方案来快速解决问题,提高工作效率。 总体而言,《Xilinx PCI Express Windows DMA驱动程序和软件指南》为用户提供了一份详细和实用的指南,帮助用户在Windows操作系统上正确地安装、配置和使用Xilinx PCI Express DMA驱动程序和软件。无论是初学者还是有经验的开发者,都可以从这份指南中获得帮助和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值