2. Xilinx DMA IP 概览:四大金刚怎么选?

好,我们直接进入正题。Xilinx 的 DMA IP 有好几种,说白了就是帮你把数据从 A 点搬到 B 点。但具体怎么搬、搬多少、搬什么类型的数据,这就有讲究了。

我个人习惯把这几类 IP 称为“四大金刚”:AXI DMA、AXI CDMA、AXI MCDMA 和 AXI VDMA。名字看着挺像,但脾气秉性完全不同。选错了,后面调试起来真要命。

我的建议:新手先掌握 AXI DMA 和 AXI VDMA,这两个在实际项目里出现频率最高。CDMA 和 MCDMA 属于特定场景下的“特种兵”,遇到再学也来得及。

2.1 AXI DMA —— 最通用的“数据搬运工”

AXI DMA 是 Xilinx 最经典的 DMA IP。它最大的特点就是灵活,既能做内存到外设的传输(比如把数据从 DDR 发给 SPI 或 UART),也能做内存到内存的拷贝。

我记得刚接触 FPGA 时,第一个调通的 DMA 就是它。那时候想采集 ADC 数据存到 DDR 里,用 AXI DMA 配合 Stream 接口,半小时就把环路调通了。嗯,省了不少事。

核心特征:
  • 支持 AXI4 内存映射接口(读/写)
  • 支持 AXI4-Stream 接口(数据流)
  • 内部有 Scatter Gather 引擎,可以自动处理不连续的内存块
  • 支持 2D 传输(其实是用 SG 列表模拟的)

选型场景:

  • 需要把 FPGA 内部产生的连续数据流搬到 DDR 里
  • 需要把 DDR 里的数据按一定的地址间隔发送出去
  • 项目中已经有现成的 AXI-Stream 外设 IP
我曾经踩过的坑:用 AXI DMA 做内存到内存的搬移时,如果数据量小但频率高,启动 DMA 的开销反而比 CPU 直接拷贝还大。所以小数据量(几十个字节以下),我建议直接用 CPU 搬运,别上 DMA。

2.2 AXI CDMA —— 单纯的内存到内存搬运工

AXI CDMA,全称 Central DMA。你看它名字里没有“Stream”,就知道它主要干的是内存到内存的活。而且它只有一个 AXI4 主接口,没有 Stream 接口。

说白了,CDMA 就是一颗专门用来在 DDR 不同区域之间搬数据的“加速器”。它的核心优势是延迟低,适合需要快速响应的内存拷贝场景。

对比项 AXI DMA AXI CDMA
Stream 接口 有 无
Scatter Gather 支持 支持
内存到内存 可以(但效率一般) 专长
延迟 中等 低

选型场景:

  • 需要频繁在 DDR 的两个缓冲区间搬数据
  • 系统中有大量 memcpy 操作,CPU 忙不过来
  • 对延迟敏感,但不是极致的实时场景
一个小技巧:用 CDMA 做简单的 Ping-Pong 缓冲是非常顺手的。你只需要在每次传输完成后轮询一个状态寄存器,剩下的交给 CDMA 自己折腾。

2.3 AXI MCDMA —— 多通道的“矩阵搬运”

MCDMA,Multi-Channel DMA。你看名字就知道,它主打的是多通道。它能同时管理多个独立的 DMA 通道,每个通道都有自己的描述符链表和传输配置。

我在做多路雷达数据采集时用过它。当时有 8 路 ADC 数据流需要同时写入 DDR,如果用 8 个 AXI DMA,逻辑资源会爆掉。换成 MCDMA,一个 IP 就把 8 个通道全搞定了。

核心特征:
  • 支持 4/8/16 个独立通道
  • 每个通道独立配置传输方向、数据宽度、地址
  • 内部有仲裁逻辑,管理多个通道同时请求时的带宽分配
  • 所有通道共享一个 AXI4 主接口

选型场景:

  • 多个数据源需要并行写入 DDR(比如多路 ADC、多路 Camera)
  • 需要在一个 IP 内部完成多个数据流的调度管理
  • 资源敏感,但不能让多个独立 DMA 浪费逻辑单元
我建议你别做的:不要把所有通道都配上最大带宽跑满。MCDMA 的仲裁逻辑是固定的优先级+轮询,如果你 16 个通道都要求全速,最终每个通道的带宽都会打折扣。要提前做带宽预算。

2.4 AXI VDMA —— 视频专用的“帧搬运专家”

AXI VDMA,Video DMA。专门为视频流设计。它内置了帧缓冲管理、场同步、帧同步等视频相关的逻辑。说白了,你用它做视频采集和显示,它会帮你省掉至少一半的代码量。

我记得第一次调 HDMI 显示时,用了 VDMA 配合 TPG(Test Pattern Generator),不到半天屏幕上就出来了彩条。那感觉真好。

特性 AXI VDMA AXI DMA
帧缓冲管理 硬件自动管理 需要软件维护
同步信号 内置 vsync/hsync 无
2D 传输 原生支持(行宽、帧高、步长) 需要 SG 列表模拟
典型带宽 4K@60fps 无压力 看配置,但无帧缓冲区管理

选型场景:

  • 视频采集(Camera 进 DDR)
  • 视频显示(DDR 出到 DisplayPort/HDMI)
  • 图像处理流水线(中间帧缓冲管理器)
我的心得:VDMA 内部的帧指针寄存器非常有用。你可以在每一帧开始时更新指针,实现比如“快进暂停”这种效果。这在做视频推流时很有用。

2.5 选型对比总表

为了方便对比,我把四个 IP 的核心参数列成了一张表。你看着选就行。

IP 类型 主要接口 通道数 适用场景 资源占用
AXI DMA MM+Stream 1 (可拆分为读写两条) 通用数据搬移 中等
AXI CDMA MM only 1 内存到内存拷贝 较低
AXI MCDMA MM+Stream 4/8/16 多通道数据采集 较高 (跟通道数正相关)
AXI VDMA MM+Stream 1 (但支持多帧缓冲) 视频/图像处理 中等

2.6 知识结构图

下面这张图,你看一下就能把这四大金刚的关系搞清楚。横轴是接口类型,纵轴是通道数。

Xilinx DMA IP 选型矩阵 多通道 单通道 Stream+Memory Memory Only AXI VDMA 视频帧搬运 AXI DMA 通用数据搬移 AXI MCDMA 多通道数据流 AXI CDMA 内存拷贝专家 越靠右上角,IP 越专 按实际需求选型

2.7 小结与选型建议

好了,到这里你应该对这四个 IP 有了个大概印象。总结一下我的选型顺序:

  1. 先看场景:是视频、多通道、还是普通搬移?
  2. 再看接口:有没有 Stream 需求?还是只做内存到内存?
  3. 最后看资源:逻辑单元够不够?带宽预算紧不紧?

一句口诀帮你记:

视频用 VDMA,内存拷贝找 CDMA,多路数据上 MCDMA,其他情况 AXI DMA。

嗯,这一章的内容就这些。我自己当年刚开始接触时也晕了好一阵,但一旦你亲手搭过一个 DMA 工程,这些区别就刻在脑子里了。

最后给你个建议:别贪多,先挑一个 IP 玩透。我推荐从 AXI DMA 开始,因为它最通用,网上教程也多。玩明白了,其它 IP 就是它的变种,上手很快。