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

PCIe XDMA数据传输:三种工作模式详解(ARM发起 → FPGA自主)

1 引言

在使用Xilinx XDMA IP核进行PCIe高速数据传输时,很多工程师会问一个问题:FPGA能否主动发起数据传输? 答案是:当然可以! 但这里面的“主动”有不同的层次和实现方式。

本文将结合我们实际调试的经验和Xilinx官方手册PG195,详细讲解XDMA C2H(Card to Host,即FPGA到主机)传输的三种工作模式

2 ARM发起:标准AXI4-MM模式

这是我们之前调试时最常用的方式,也是XDMA最经典的用法。

2.1 工作原理

  • ARM(主机驱动)提交C2H描述符,明确指定:从FPGA的哪个地址读多少字节,放到主机的哪个缓冲区

  • XDMA作为Master,主动去读取FPGA侧RAM中的数据。

  • FPGA端的XDMA接口必须配置为AXI4-MM(内存映射)模式,XDMA作为Master,后面的RAM作为Slave。

配置见下图:

2.2 数据传输流程

  • ARM驱动创建描述符链表,写入寄存器启动DMA。

  • H2C方向,XDMA通过AXI4写通道将数据写入FPGA RAM

  • 当FPGA有数据要传给驱动端,数据会被先放在FPGA的RAM中,然后以中断的方式通知驱动。

  • 驱动收到中断后,通过AXI4读通道从RAM读取数据(C2H方向)。

整个传输由ARM主动发起,FPGA始终处于被动响应状态,数据必须先存放在RAM中,ARM发起读请求才能取走。

2.3 仿真验证

从仿真波形可以看到,AXI4写通道和读通道是分开的,数据需要先存入RAM,等待读请求到来才能输出。

3 FPGA主动触发:AXI4-Stream模式

严格意义上,这种模式不能叫“FPGA发起”,因为DMA的配置(描述符、目的地址等)仍然由ARM提前完成。但FPGA确实可以主动把数据放到总线上,而不需要等待ARM逐个发读请求。

3.1 工作原理

  • ARM驱动提前配置好C2H通道的描述符和主机缓冲区,然后启动DMA引擎,使其处于“待命”状态。

  • FPGA内部的用户逻辑将数据直接推送到AXI4-Stream接口上。

  • XDMA检测到Stream接口上有有效数据后,自动将数据搬运到主机预先指定的缓冲区。

  • 当数据量达到描述符设定的长度后,XDMA发送中断通知主机。

此时XDMA必须作为Slave端使用,因此其用户侧接口必须配置为AXI4-Stream模式。

3.2 仿真验证

从仿真图可以清晰看到:M_AXIS_H2C收到数据后,S_AXIS_C2H立即将数据转发出去,几乎没有延迟。这是因为驱动已经提前配置好了目的地址,XDMA硬件可以自主完成后续搬运。

4 绝对的FPGA发起:Descriptor Bypass模式

前两种模式本质上是ARM决定传输参数(源地址、目的地址、数据长度),FPGA只是被动执行或“半自动”触发。那么,有没有办法让FPGA完全自主决定一次DMA传输的所有细节呢?

有!这就是Descriptor Bypass模式。

4.1 工作原理

  • 在Vivado中配置XDMA IP时,勾选“Descriptor Bypass for Write (C2H)”“Descriptor Bypass for Read (H2C)”

  • 使能后,XDMA会多出两组接口:c2h_dsc_byp_*h2c_dsc_byp_*

  • FPGA内部的用户逻辑通过这组接口,动态构建并提交一个完整的描述符,包括:

    • 主机目的地址(64位)

    • FPGA源地址(64位,对于Stream接口可能无效)

    • 传输长度(32位)

    • 控制标志(停止、相邻描述符数量等)

  • FPGA给一个load脉冲,XDMA接收这个描述符后,立即按照描述符的要求发起一次DMA传输。

配置如下图所示:

4.2 仿真验证

从仿真波形可以看到,FPGA先向描述符Bypass接口写入地址、长度等信息,然后拉高load信号,随后XDMA即开始执行对应的数据传输。

官方手册参考

详细的时序和寄存器定义请参考 PG195

5 官方驱动与测试脚本对应关系

Xilinx官方提供的Linux驱动仓库位于:

https://github.com/Xilinx/dma_ip_drivers/tree/master/XDMA/linux-kernel/tests

其中包含的测试脚本与上述三种模式的对应关系如下:

工作模式对应测试脚本说明
模式一:ARM发起(AXI4-MM)dma_memory_mapped_test.sh这也是我们之前测试用的脚本
模式二:FPGA主动触发(AXI4-Stream)dma_streaming_test.sh用于验证Stream模式下的自动数据泵
模式三:Descriptor Bypass无独立脚本,需手动修改可通过修改dma_streaming_test.sh,使能Bypass功能(需要设置对应寄存器)

6 总结

回到最初的问题:FPGA能否主动发起PCIe传输?

  • 在标准AXI4-MM模式下:FPGA是被动的,传输由ARM发起。

  • 在AXI4-Stream模式下:FPGA可以“主动”把数据推上总线,但传输参数仍由ARM预设,可视为半主动

  • 在Descriptor Bypass模式下:FPGA可以完全自主决定源地址、目的地址和数据长度,是真正的主动发起

选择哪种模式取决于你的应用需求:

  • 如果你需要按需读取FPGA RAM中的块数据,用模式一。

  • 如果你需要连续、高速的数据流上传,用模式二。

  • 如果你需要动态、灵活的DMA控制,用模式三。

希望这篇文章能帮助你理清XDMA C2H传输的几种方式,并在实际项目中灵活选用。

http://www.gsyq.cn/news/1388072.html

相关文章:

  • Unity离线语音识别实战:TinyWhisper跨平台集成与儿童语音优化
  • YTDLnis:安卓端开源音视频下载工具
  • AI智能体记忆漂移难题:向量检索+知识图谱协同架构实战
  • AI工作空间:从代码补全到软件开发范式变革
  • ClaudeOps:人机协同运维新范式,从扫描到执行的自动化实践
  • 从工具到员工:用管理思维重塑AI协作,提升LLM应用效能
  • Unity性能优化小技巧:获取物体Size时,小心Renderer.bounds的隐藏开销
  • 测试负责人如何推动 Skills 落地
  • 2026 最强个人 AI 保姆 OpenHuman 全解析:摆脱重复交底,让AI真正记住你的所有工作
  • 2025-2026年生态美家室内空气治理电话查询:选择治理服务前的关键考量 - 品牌推荐
  • AI编程工具-全局配置脚本(windows+mac)
  • 技术人如何系统性提升职场英语能力,突破全球化职业发展瓶颈
  • WGCLOUD如何批量修改agent的配置参数serverUrl
  • Excel #NAME?错误原理与实战修复指南
  • MCP协议深度解析:AI Agent工具调用的统一标准与工程实践
  • 两类线性方程组的随机迭代算法及化学主方程的反位移Arnoldi算法【附程序】
  • 别再让ECU‘掉线’了!手把手教你用UDS 3E服务维持诊断会话(附CANoe实操)
  • AI代理工程化框架:六组件机制驱动,解决回归与失忆难题
  • Excel移动列的底层原理与安全操作指南
  • HTTPS抓包原理:不是破解加密,而是成为受信任的中间人
  • 别再死记硬背了!用Arduino和面包板5分钟搞懂三极管开关与放大(附代码)
  • 集团首都公报:武汉市放飞炬人产业引导基金有限责任公司执行董事、财政董事方达炬批准《武汉市放飞炬人产业引导基金有限责任公司全国及驻外国股票采购和发行制度》
  • pandas数据导入实战:JSON与HTML解析原理与避坑指南
  • 深度强化学习在自主系统中的控制优化实践
  • 从向量检索到图RAG:微秒级知识检索如何重塑智能体架构
  • ARM调试寄存器EDRCR与EDSCR深度解析
  • Excel摊销表实战:用PMT、IPMT、PPMT精准生成360期贷款还款计划
  • 2025-2026年北京家庭定制游旅行社推荐:五大口碑产品评测暑期亲子防拥挤性价比高注意事项 - 品牌推荐
  • 软考考后必看:成绩查询、证书领取全流程
  • Python原生WordCloud词云实战:从数据清洗到专业输出