AXI DMA IP 详细介绍
概述
AXI DMA(Direct Memory Access)专为高效的数据传输设计,基于 AXI4 和 AXI4-Stream 协议,支持在内存映射域(Memory-Mapped Domain)和流域(Stream Domain)之间实现高吞吐量数据搬运。它广泛应用于 FPGA 和 SoC 系统设计,特别是在需要高性能数据传输的场景,如视频处理、信号处理、网络通信和硬件加速器集成。
AXI DMA IP 核通过内存映射到流(MM2S,Memory Map to Stream)和流到内存映射(S2MM,Stream to Memory Map)通道,提供灵活的直接内存访问功能。它支持分散/聚集(Scatter/Gather,SG)模式、简单的寄存器直接模式,以及可选的多通道模式,满足不同应用需求。
该 IP 核的主要功能包括:
- 高吞吐量传输:支持 AXI4 内存映射域和 AXI4-Stream 域之间的高效数据搬运。
- 双向通道:提供独立的 MM2S 和 S2MM 通道,支持全双工操作。
- 灵活的传输模式:支持分散/聚集模式和寄存器直接模式。
- 多通道支持:支持多达 16 个 MM2S 和 S2MM 通道,适用于多流传输。
主要特性
AXI DMA IP 具有以下关键特性:
-
AXI 协议兼容性:
- 符合 ARM AMBA AXI4 和 AXI4-Stream 协议规范。
- AXI4 内存映射接口:支持 32、64、128、256、512 或 1024 位数据宽度,适用于高带宽内存访问。
- AXI4-Stream 接口:支持 8、16、32、64、128、256、512 或 1024 位数据宽度,适用于流式数据传输。
- AXI4-Lite 接口:32 位数据宽度,用于控制和状态寄存器访问。
-
双向通道:
- MM2S 通道:从 AXI4 内存映射域(如 DDR 内存)读取数据,输出到 AXI4-Stream 域。
- S2MM 通道:从 AXI4-Stream 域接收数据,写入 AXI4 内存映射域。
- 两个通道独立运行,支持全双工模式。
-
传输模式:
- 分散/聚集(SG)模式:
- 通过描述符链表管理多个非连续内存块的传输。
- 支持动态更新描述符,适合复杂数据传输(如视频帧、网络数据包)。
- 寄存器直接模式:
- 通过寄存器直接配置传输地址和长度,适合简单、连续的内存传输。
- 多通道模式(可选):
- 支持最多 16 个 MM2S 和 16 个 S2MM 通道,通过
TDEST
信号区分流。 - 适合多流处理,如多路视频或网络数据。
- 支持最多 16 个 MM2S 和 16 个 S2MM 通道,通过
- 分散/聚集(SG)模式:
-
数据传输功能:
- 突发传输:支持 AXI4 突发传输,最大突发长度为 256 数据节拍。
- 数据重新对齐:通过内部数据重新排列引擎(DRE),支持任意字节偏移的内存读写(最大 64 位数据宽度)。
- 4 KB 边界保护:确保数据传输不跨越 4 KB 地址边界,符合 AXI4 协议。
- 不定长传输:S2MM 通道支持不定长字节传输(通过
TLAST
信号)。
-
中断支持:
- 支持传输完成中断、错误中断和延迟中断。
- 提供中断合并功能,减少处理器负载。
-
时钟支持:
- 同步模式:所有接口(AXI4、AXI4-Stream、AXI4-Lite)共享同一时钟(
s_axi_lite_aclk
)。 - 异步模式:支持独立的 AXI4 内存映射时钟(
m_axi_mm2s_aclk
和m_axi_s2mm_aclk
)和 AXI4-Stream 时钟。 - 最大频率:最高 200 MHz(7 系列,-1 速度等级),更高频率适用于 UltraScale 设备。
- 同步模式:所有接口(AXI4、AXI4-Stream、AXI4-Lite)共享同一时钟(
-
工具与设备支持:
- 设计工具:Vivado Design Suite、ISE Design Suite。
- 支持设备:Artix-7、Kintex-7、Virtex-7、Zynq-7000、Kintex UltraScale、Virtex UltraScale、Zynq UltraScale+ MPSoC、Versal Prime、Versal AI Core。
功能模块
AXI DMA IP 的核心功能是在 AXI4 内存映射域和 AXI4-Stream 域之间实现高效的数据搬运,其主要功能模块包括以下几个方面:
1. MM2S 通道(Memory Map to Stream)
- 功能:从 AXI4 内存映射域读取数据,转换为 AXI4-Stream 数据流。
- 机制:
- 通过 AXI4 读地址(
ARADDR
)和读数据(RDATA
)通道访问内存。 - 支持突发传输(最大 256 数据节拍),自动分区以符合 4 KB 边界。
- 数据重新排列引擎(DRE)支持字节级对齐,允许任意字节偏移的内存读取(参考 web:20)。
- 输出到 AXI4-Stream 接口(
M_AXIS_MM2S
),支持TVALID
、TREADY
和TLAST
信号。
- 通过 AXI4 读地址(
- 应用:将内存数据(如 DDR)传输到流式处理模块(如视频编码器)。
2. S2MM 通道(Stream to Memory Map)
- 功能:从 AXI4-Stream 域接收数据,写入 AXI4 内存映射域。
- 机制:
- 从 AXI4-Stream 接口(
S_AXIS_S2MM
)接收数据,支持不定长传输(通过TLAST
信号)。 - 通过 AXI4 写地址(
AWADDR
)和写数据(WDATA
)通道写入内存。 - 支持字节级数据重新对齐,允许任意字节偏移的内存写入。
- 自动突发分区,确保符合 AXI4 协议的 4 KB 边界要求。
- 从 AXI4-Stream 接口(
- 应用:将流式数据(如传感器数据)存储到内存(如 DDR)。
3. AXI4-Lite 控制接口
- 功能:通过 AXI4-Lite 接口配置 DMA 操作和监控状态。
- 机制:
- 提供控制寄存器(如传输模式、通道启用、中断控制)。
- 提供状态寄存器(如传输完成、错误标志)。
- 在寄存器直接模式下,配置传输地址和长度。
- 在分散/聚集模式下,配置描述符地址。
- 应用:处理器(如 Zynq PS 或 MicroBlaze)通过 AXI4-Lite 控制 DMA 操作。
4. 分散/聚集引擎
- 功能:管理分散/聚集模式的描述符链表,处理非连续内存传输。
- 机制:
- 通过 AXI4 接口(
M_AXI_SG
)读取描述符链表,描述符包含传输地址、长度和控制信息。 - 支持循环和非循环描述符链表,允许动态更新。
- 提供描述符预取(Prefetch)和多描述符排队,减少传输延迟。
- 通过 AXI4 接口(
- 应用:处理复杂数据结构,如视频帧或网络数据包。
5. 多通道管理
- 功能:支持多达 16 个 MM2S 和 S2MM 通道,处理多路数据流。
- 机制:
- 使用 AXI4-Stream 的
TDEST
信号区分不同通道。 - 每个通道有独立的描述符链表和控制寄存器。
- 支持多通道的优先级仲裁和带宽分配。
- 使用 AXI4-Stream 的
- 应用:多路视频流或多路网络数据处理。
6. 中断控制器
- 功能:生成中断信号,通知处理器传输状态。
- 机制:
- 支持传输完成中断(IOC,Interrupt On Complete)。
- 支持错误中断(如地址越界、协议错误)。
- 支持延迟中断(Delay Interrupt),减少频繁中断。
- 提供中断合并功能,优化处理器性能。
- 应用:处理器通过中断处理传输完成或错误事件。
7. 时钟与复位模块
- 功能:管理时钟和复位信号,支持同步和异步模式。
- 机制:
- 时钟:
s_axi_lite_aclk
:AXI4-Lite 控制接口时钟。m_axi_mm2s_aclk
:MM2S AXI4 内存映射接口时钟。m_axi_s2mm_aclk
:S2MM AXI4 内存映射接口时钟。m_axi_sg_aclk
:分散/聚集接口时钟(SG 模式)。
- 复位:
axi_resetn
:全局低电平有效复位信号。
- 支持异步时钟域配置,确保跨时钟域传输的稳定性。
- 时钟:
- 应用:支持灵活的时钟域配置,适应复杂系统。
接口说明
以下是 AXI DMA IP 的主要接口及其功能:
-
AXI4-Lite 控制接口(S_AXI_LITE):
- 类型:AXI4-Lite 从接口。
- 信号:
S_AXI_LITE_ARADDR
、ARVALID
、ARREADY
:读地址通道。S_AXI_LITE_RDATA
、RRESP
、RVALID
、RREADY
:读数据通道。S_AXI_LITE_AWADDR
、AWVALID
、AWREADY
:写地址通道。S_AXI_LITE_WDATA
、WVALID
、WREADY
:写数据通道。S_AXI_LITE_BRESP
、BVALID
、BREADY
:写响应通道。
- 功能:配置 DMA 控制寄存器和读取状态。
- 数据宽度:固定 32 位。
- 时钟:
s_axi_lite_aclk
。
-
AXI4 内存映射接口:
- MM2S 接口(M_AXI_MM2S):
- 类型:AXI4 主接口(读通道)。
- 信号:
M_AXI_MM2S_ARADDR
、ARVALID
、ARREADY
:读地址通道。M_AXI_MM2S_RDATA
、RRESP
、RVALID
、RREADY
:读数据通道。
- 功能:从内存读取数据,传输到 MM2S 通道。
- S2MM 接口(M_AXI_S2MM):
- 类型:AXI4 主接口(写通道)。
- 信号:
M_AXI_S2MM_AWADDR
、AWVALID
、AWREADY
:写地址通道。M_AXI_S2MM_WDATA
、WVALID
、WREADY
:写数据通道。M_AXI_S2MM_BRESP
、BVALID
、BREADY
:写响应通道。
- 功能:将 S2MM 通道数据写入内存。
- 数据宽度:32 至 1024 位。
- 时钟:
m_axi_mm2s_aclk
(MM2S),m_axi_s2mm_aclk
(S2MM)。
- MM2S 接口(M_AXI_MM2S):
-
AXI4 内存映射分散/聚集接口(M_AXI_SG):
- 类型:AXI4 主接口(读/写通道)。
- 信号:与 MM2S 和 S2MM 接口类似,支持读写操作。
- 功能:在分散/聚集模式下,读取和更新描述符链表。
- 数据宽度:32 或 64 位。
- 时钟:
m_axi_sg_aclk
。
-
AXI4-Stream 数据接口:
- MM2S 接口(M_AXIS_MM2S):
- 类型:AXI4-Stream 主接口。
- 信号:
M_AXIS_MM2S_TVALID
、TREADY
、TDATA
、TLAST
:标准流信号。M_AXIS_MM2S_TKEEP
:字节有效信号(可选)。M_AXIS_MM2S_TDEST
:目标标识信号(多通道模式)。
- 功能:输出内存读取的流式数据。
- S2MM 接口(S_AXIS_S2MM):
- 类型:AXI4-Stream 从接口。
- 信号:与
M_AXIS_MM2S
类似。 - 功能:接收流式数据,传输到内存。
- 数据宽度:8 至 1024 位。
- 时钟:
m_axi_mm2s_aclk
(MM2S),m_axi_s2mm_aclk
(S2MM)。
- MM2S 接口(M_AXIS_MM2S):
-
中断接口:
mm2s_introut
:MM2S 通道中断输出。s2mm_introut
:S2MM 通道中断输出。- 功能:通知处理器传输完成或错误事件。
- 时钟:
s_axi_lite_aclk
。
-
时钟与复位接口:
- 时钟:
s_axi_lite_aclk
:AXI4-Lite 控制接口时钟。m_axi_mm2s_aclk
:MM2S 数据接口时钟。m_axi_s2mm_aclk
:S2MM 数据接口时钟。m_axi_sg_aclk
:分散/聚集接口时钟(SG 模式)。
- 复位:
axi_resetn
:全局低电平有效复位信号。
- 功能:提供时钟和复位控制,支持同步或异步设计。
- 时钟:
配置方法
1. 在 Vivado 中添加 IP
- 打开 Vivado 的 IP Catalog,搜索 AXI DMA,将其添加到设计。
- 双击 IP 核,打开定制化对话框(参考 PG021,第 35-40 页,图 4-1),配置以下参数:
- 通道选择:
- Enable MM2S Channel:启用 MM2S 通道。
- Enable S2MM Channel:启用 S2MM 通道。
- 数据宽度:
- MM2S Memory Map Data Width:选择 32、64、128、256、512 或 1024 位。
- MM2S Stream Data Width:选择 8、16、32、64、128、256、512 或 1024 位。
- S2MM Memory Map Data Width:同 MM2S。
- S2MM Stream Data Width:同 MM2S。
- 传输模式:
- Enable Scatter Gather Engine:启用分散/聚集模式。
- Enable Multi-Channel Mode:启用多通道模式(指定通道数,1-16)。
- 功能选项:
- Enable Data Realignment Engine (DRE):启用字节级数据重新对齐(最大 64 位数据宽度)。
- Enable Asynchronous Clocks:启用异步时钟模式。
- Enable Read/Write Micro Mode:启用微模式,简化控制(参考 web:20)。
- 突发长度:
- Maximum Burst Length:选择 2、4、8、16、32、64、128 或 256 数据节拍,影响吞吐量和 AXI 总线负载。
- 缓冲区描述符:
- Buffer Descriptor Depth:设置描述符队列深度(8、16、32、64,SG 模式)。
- 时钟配置:
- AXI Lite Clock Frequency:设置
s_axi_lite_aclk
频率(默认 100 MHz)。 - MM2S/S2MM Clock Frequency:设置
m_axi_mm2s_aclk
和m_axi_s2mm_aclk
频率。
- AXI Lite Clock Frequency:设置
- 通道选择:
2. 连接与驱动
- 硬件连接:
- AXI4-Lite 接口(
S_AXI_LITE
):连接到处理器(如 Zynq PS 或 MicroBlaze)通过 AXI Interconnect。 - MM2S 通道:
- 将
M_AXI_MM2S
连接到 AXI4 从设备(如 DDR 控制器)。 - 将
M_AXIS_MM2S
连接到 AXI4-Stream 从设备(如视频处理模块)。
- 将
- S2MM 通道:
- 将
M_AXI_S2MM
连接到 AXI4 从设备(如 DDR 控制器)。 - 将
S_AXIS_S2MM
连接到 AXI4-Stream 主设备(如传感器接口)。
- 将
- 分散/聚集接口(
M_AXI_SG
):连接到描述符存储器(如 DDR 或 BRAM,SG 模式)。 - 中断:将
mm2s_introut
和s2mm_introut
连接到中断控制器(如 Zynq GIC)。 - 分配时钟信号:
- 同步模式:所有接口连接到单一时钟。
- 异步模式:为
m_axi_mm2s_aclk
、m_axi_s2mm_aclk
和m_axi_sg_aclk
分配独立时钟。
- 分配复位信号:
- 确保
axi_resetn
与时钟同步。
- 确保
- 使用 Vivado 地址编辑器为
S_AXI_LITE
、M_AXI_MM2S
、M_AXI_S2MM
和M_AXI_SG
分配地址空间(参考 web:14)。
- AXI4-Lite 接口(
- 驱动程序:
- Xilinx 提供官方 Linux 和裸机驱动程序(参考 Xilinx GitHub)。
- Linux 驱动:基于 DMAEngine 框架,支持分散/聚集和寄存器直接模式。
- 裸机驱动:提供 API(如
XAxiDma
库)用于配置传输、描述符管理和中断处理。
- 用户需通过 AXI4-Lite 接口配置控制寄存器,设置传输参数(如地址、长度)。
- 在分散/聚集模式下,需初始化描述符链表,包含传输地址、长度和控制标志。
- 参考 Xilinx 示例设计(如 Zynq DMA 参考设计)实现驱动开发。
- Xilinx 提供官方 Linux 和裸机驱动程序(参考 Xilinx GitHub)。
3. 仿真与验证
- 使用 Vivado 仿真工具验证 DMA 功能:
- 检查 AXI4 内存映射接口的突发传输和 4 KB 边界保护。
- 验证 AXI4-Stream 接口的
TVALID
/TREADY
握手和TLAST
信号。 - 测试 DRE 的字节级数据对齐,确保非对齐传输正确。
- 验证分散/聚集模式的描述符处理和多通道模式的
TDEST
路由。 - 检查中断触发(完成、错误、延迟),确保处理器正确响应。
- 使用 AXI Verification IP(PG267)或 AXI4-Stream Verification IP(PG277)生成激励,验证协议合规性。
- 分析波形,确认无数据丢失、协议错误或地址越界。
资源利用情况
AXI DMA IP 的资源占用取决于数据宽度、通道配置、分散/聚集模式和多通道支持。以下是典型资源利用情况(基于 7 系列、UltraScale 和 Zynq 设备,Vivado 生成):
- 资源类型:
- LUT(查找表):1000-5000,取决于数据宽度和功能选项。
- FF(触发器):1500-6000,与 LUT 占用相关。
- BRAM:0-4,分散/聚集模式可能使用 BRAM 存储描述符。
- DSP 切片:不使用。
- 配置示例:
- MM2S+S2MM,32 位数据宽度,寄存器直接模式,同步模式:约 1000 LUT、1500 FF、0 BRAM。
- MM2S+S2MM,128 位数据宽度,分散/聚集模式,异步模式:约 2500 LUT、3000 FF、2 BRAM。
- MM2S+S2MM,256 位数据宽度,4 通道多通道模式:约 4000 LUT、5000 FF、3 BRAM。
- 最大频率:
- 7 系列(-1 速度等级):200 MHz。
- UltraScale:250 MHz 或更高。
具体资源利用数据需参考 Vivado 生成的报告,建议用户根据目标设备和配置验证资源占用。
应用场景
AXI DMA IP 适用于以下场景:
-
视频处理:
- 将视频帧从 DDR 内存传输到 AXI4-Stream 处理模块(如编码器、显示接口)。
- 支持分散/聚集模式,处理非连续视频帧。
- 配合 AXI Video DMA 和 AXI Interconnect。
-
信号处理:
- 将传感器数据(如 ADC 输出)通过 S2MM 通道存储到 DDR 内存。
- 支持不定长传输,处理连续数据流。
- 多通道模式支持多路信号处理。
-
网络数据包处理:
- 通过 MM2S 通道将网络数据包从内存传输到流式处理单元。
- 通过 S2MM 通道将处理后的数据包存储回内存。
- 分散/聚集模式适合处理分片数据包。
-
Zynq SoC 集成:
- 在 Zynq SoC 中,桥接 PS(ARM 处理器)和 PL 之间的数据传输。
- 例如,PS 通过 AXI4-Lite 配置 DMA,PL 处理流式数据。
-
硬件加速器:
- 将数据从内存搬运到硬件加速器(如 CNN 加速器),并将结果存储回内存。
- 多通道模式支持多路输入/输出流。
注意事项
-
传输模式选择:
- 寄存器直接模式适合简单、连续的内存传输,配置简单但功能有限。
- 分散/聚集模式适合复杂、非连续传输,但需要管理描述符链表。
- 多通道模式需确保
TDEST
信号正确配置,避免数据流混淆)。
-
数据宽度配置:
- MM2S 和 S2MM 的内存映射和流接口数据宽度需合理匹配,避免带宽瓶颈。
- DRE 仅支持最大 64 位数据宽度的重新对齐,高于 64 位需确保数据对齐。
-
时钟域配置:
- 异步模式下,
m_axi_mm2s_aclk
和m_axi_s2mm_aclk
频率应与s_axi_lite_aclk
协调,建议接近或高于控制接口时钟。 - 确保时钟源稳定,使用 MMCM/PLL 生成时钟。
- 异步模式下,
-
复位同步:
axi_resetn
需在所有时钟域内同步,保持至少 16 个时钟周期。- 推荐使用异步复位同步释放机制,避免亚稳态问题。
-
分散/聚集模式:
- 描述符链表需存储在可通过
M_AXI_SG
访问的内存中(如 DDR 或 BRAM)。 - 确保描述符地址对齐(通常 64 字节),避免访问错误。
- 通过仿真验证描述符预取和排队行为。
- 描述符链表需存储在可通过
-
中断管理:
- 延迟中断和中断合并可减少处理器负载,但需根据应用需求配置阈值。
- 确保中断控制器正确连接,处理器能及时响应中断。
总结
AXI DMA IP(PG021)是一款功能强大的直接内存访问软核,专为 AXI4 和 AXI4-Stream 协议设计,支持内存映射域和流域之间的高吞吐量数据搬运。其通过 MM2S 和 S2MM 通道、分散/聚集模式、多通道支持和数据重新对齐功能,满足视频处理、信号处理、网络通信和硬件加速等复杂应用需求。
用户在使用时应根据应用需求选择传输模式、数据宽度和时钟配置,合理管理描述符和中断,并通过仿真验证传输性能和协议合规性。该 IP 核可与 AXI Interconnect、AXI4-Stream Interconnect 等 IP 组合使用,构建高效的 SoC 系统。
FPGA设计工具推荐
-
SZ901:
SZ901 是一款基于XVC协议的FPGA网络下载器。- 最高支持53M
- 支持4路JTAG独立使用
- 支持端口合并
- 支持国产FLASH烧写
- 下载器无限扩展
- 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!
-
SZ501(PRO_A7):
- SZ501 是一款适合初学者FPGA开发板,包含低速高速接口!
- 双网口(RGMII)
- 双SFP+
- DDR
- UART
- IIC