当前位置: 首页 > article >正文

XDMA IP

        最近在项目里学习了与axi、xdma、pcie等有关的内容,现对xdma的使用注意事项进行一下总结和整理(仅供参考学习,有误的地方请指出)

1.XDMA        

        Xilinx 提供的DMA Subsystem for PCIE xpress IP是一个高性能,可配置的适用于PCIE 1.0, PCIE2.0 SG 模式DMA ,提供可选择的 AXI4 接口或者 AXI4-Stream 接口。一般情况下配置成 AXI4 接口可以加入到系统总线互联,适用于大数据量异步传输,通常会使用到DDR AXI4-Stream 接口适用于低延迟数据流传输。
        XDMA 是 SGDMA ,并非 Block DMA SG 模式下,主机会把要传输的数据组成链表的形式,然后将链表首地址通过BAR 传送给 XDMA XDMA 会根据链表结构首地址依次完成链表所指定的传输任务。

2.XDMA IP端口介绍

输入端口

端口名称类型说明
sys_clk输入来自 FPGA Bank 的差分时钟信号,经 BUFG 转换为单端后传入 XDMA 核心,用于同步 PCIe 数据传输。
sys_rst_n输入主机提供的系统复位信号,包括冷复位、温复位和热复位,用于重置 PCIe 核心模块及相关逻辑。
pcie_cfg_mgmt输入Pcie 配置管理接口,用于访问配置空间地址,执行读写操作,以及管理 GT 收发器等物理层功能。
usr_irq_req输入用户中断请求信号,用于通过 PCIe 发送中断给主机,提示处理特定事件。不会中断主机 CPU。

输出端口

端口名称类型说明
M_AXI输出AXI 主接口,支持高速数据传输,通常用于 XDMA 实现主机内存或外设的数据读写操作。
M_AXI_LITE输出AXI Lite 接口,适合低带宽的数据传输场景,如配置寄存器的访问和控制信号的传输。
pcie_mgt输出管理 PCIe 的物理层信号,如 MDIO 接口和 GT 收发器的状态管理。
usr_lnk_up输出PCIe 链路状态指示信号,高电平表示链路已建立且准备好传输数据。
axi_aclk输出AXI 时钟信号,用于同步 AXI 总线的读、写、控制通道上的数据传输和逻辑。
axi_aresetn输出AXI 复位信号,与 axi_aclk 同步,低电平有效,用于重置 AXI 总线的逻辑模块。
usr_irq_ack输出用户中断应答信号,表示中断请求已处理并发送给主机。
msi_enable输出MSI(Message Signaled Interrupts)使能信号,表示是否启用了 MSI 中断机制。
msi_vector_width输出MSI 向量宽度,表示支持的中断数量,用于支持多个并发中断事件的消息传递。

3.XDMA配置

3.1接口和速率配置

        Mode:配置模式,Basic 模式:适合简单、快速的 PCIe 配置,不需要对复杂参数进行调节。 Advanced 模式:适合高级用户,可配置更多选项以优化性能。

        Lane Width:MZ7100 支持X1到X8

        Max Link Speed:选择2.5GT/s 即PCIE1.0,选择5.0GT/s 即PCIE2.0。

        Reference Clock :100MHZ,参考时钟 100M。

        DMA Interface Option:接口选择 AXI4 接口。

        AXI Data Width:64bit,即 AXI4 数据总线宽度为64bit。

        AXI Clock :62.5M,即AXI4 接口时钟为 62.5MHZ。

3.2PCIE ID配置

        这里 IP会自动进行选择VID、DID 等,也可以手动进行修改,但是ID不匹配的话电脑会识别不到。芯片 ID 参数中链路速度(倒数第二位),要看电脑主板pcie的配置再与之设置。

        下面是芯片 ID 参数的对应表格,根据器件系列、模式、链路宽度和链路速度进行分类:

参数类型参数值含义
器件系列(第一位)9UltraScale+ 系列
8UltraScale 系列
77 系列器件
模式0EndPoint 模式(EP)
RootPort 模式(RP)
链路宽度(最后一位)1x1(1 Lane)
2x2(2 Lanes)
4x4(4 Lanes)
8x8(8 Lanes)
Fx16(16 Lanes)
链路速度(倒数第二位)1PCIe Gen1(2.5 Gb/s 每 Lane)
2PCIe Gen2(5 Gb/s 每 Lane)
3PCIe Gen3(8 Gb/s 每 Lane)
4PCIe Gen4(16 Gb/s 每 Lane)
芯片ID示例

        7021:表示 7 系列器件,EP模式,x1链路宽度,PCIe Gen2 速率。

        7011:表示 7 系列器件,EP模式,x1链路宽度,PCIe Gen1 速率。

如何区分EP和RP

1.硬件角色

  • EP 模式:设备通常连接到主机,PCIe IP 核被配置为终端节点(EndPoint)。

  • RP 模式:设备作为主机控制器,PCIe IP 核被配置为根端口(RootPort)。

2.PCIe IP 核配置

  • 在 FPGA 中使用 PCIe IP 核时,可以在工具(如 Vivado)中选择模式:

            EP 模式:主要关注 AXI Slave 接口(被动响应主机访问)。

               RP 模式:需要配置 PCIe 总线,初始化设备,通常包含 AXI Master 接口。

3.应用场景识别

  • 如果设计是为主机系统(如 PC)开发外设卡,通常选择 EP 模式

  • 如果 FPGA 需要作为自定义主机或与其他设备交互,通常选择 RP 模式

3.3BAR配置

        PCIE BAR这里面的配置比较重要,首先使能 PCIE to AXI Lite Master Interface,这样可以在主机一侧通过PCIE 来访问用户逻辑侧寄存器或者其他 AXI4-Lite 总线设备。

        Size: 映射空间大小,可以选择几K到几G的大小,根据自己实际需要来自定义这个大小选择。这个大小就是BAR的空间大小。

        PCIE to AXI Translation:这个设置比较重要,通常情况下,主机侧PCIE BAR地址与用户逻辑侧地址是不一样的,这个设置就是进行BAR地址到AXI 地址的转换,比如主机一侧BAR地址为0IP 里面转换设置为 0x40000000,主机访问 BAR 地址0转换到AXI Lite总线地址就是0x40000000。

        PCIE to DMA Interface:我没有选择64bit 使能,

        Prefetchable预读取功能:根据需要可选择预读取功能(读取更快),得看你的内存数据是否支持预读取,如果内存数据是不可预取的,一旦数据被加载到桥接器的缓冲区,数据将从内存中丢失,如果主机不能从网桥收集数据,那么数据就永远丢失了,如果内存是可预取的,就没有数据丢失的风险。

       DMA Bypass:AXI4 Bypass 接口,可选,用来实现PCIE 直通用户逻辑访问,可用于低延迟数据传输。暂时没有用到,等后面再去研究研究。

3.4中断配置

        User Interrupts:用户中断,XDMA提供16 条中断线使用,这里面可以配置使用几条中断线。

        Legacy Interrupt:XDMA 支持 Legacy 中断

        Msi Capabilities:选择 MSI 中断

        中断优先级为:MSI-X>MSI>Legacy

注意:MSI 中断和 MSI-X 中断只能选择一个,否则会报错,如果选择了MSI中断,则可以选择 Legacy中断;如果选择了MSI-X中断,那么MSI必须取消选择,同时Legacy也必须选择None。这个IP对于7 系列设置有这么个问题,如果使用Ultrascale 系列,则可以全部选择。

3.5选项卡配置

         DMA读写通道:Number of DMA Read Channel(H2C)和Number of DMA Write ChannelC2H)通道数,对于PCIE2.0 来说最大只能选择 2,也就是 XDMA 可以提供最多两个独立的写通道和两个独立的读通道,独立的通道对于实际应用中有很大的作用,在带宽允许的前提前,一个PCIE 可以实现多种不同的传输功能,并且互不影响。这里我们选择1。

        Number of Request IDs for Read (Write)channel:这个是每个通道设置允许最大outstanding数量,按照默认即可。

4.直接内存访问读取命令

        下面两个命令与使用 xdma_rw.exe工具相关,用于通过 Xilinx 的DMA驱动与PCIe设备进行交互,xdma_rw.exe工具允许在主机和 FPGA 之间进行直接内存访问(DMA)。

xdma_rw.exe c2h_0 read 0x200000 -l 4
xdma_rw.exe user read 0x200000 -l 4

         AXI使用第1条读取指令:读取0x0020_0000地址的值

        AXI_Lite使用第2条读取指令:读取0x0020_0000地址的值


http://www.kler.cn/a/459537.html

相关文章:

  • 共阳极LED的控制与短路问题解析
  • 碰一碰拓客系统:创新引领智能拓客新纪元
  • 利用多GPU,推理transformer模型,避免显存溢出
  • 【C语言 采集数据 精简排序】
  • 人脑处理信息的速度与效率:超越计算机的直观判断能力
  • C语言链表通关文牒0.5
  • React 性能优化十大总结
  • springboot511基于SpringBoot视频点播系统的设计与实现(论文+源码)_kaic
  • php 静态变量
  • linux 配置端口转发
  • 前端Python应用指南(四)Django实战:创建一个简单的博客系统
  • Java的SpringMVC
  • 嵌入式硬件杂谈(八)电源的“纹波”到底是什么?
  • Linux 信号集与信号掩码
  • uniapp小程序使用rich-text富文本图片溢出问题
  • ZYNQ7000双核AMP文档解读
  • 爬虫的工作原理
  • 百度热力图数据处理流程Arcgis PRO篇,Arcgis,QGIS见链接其他文章
  • 互联网全景消息(8)之RabbitMQ进阶介绍
  • 【机器学习】概述
  • 【C++11】类型分类、引用折叠、完美转发
  • 【数据库初阶】Linux中表的基础操作
  • 【Redis】集群配置(主从复制 哨兵搭建)
  • JPA查询部分字段的最佳实践
  • Python 中的 with open:文件操作的最佳实践
  • 发布远程组件vue2+Webpack和vue3+vite