AXI MCDMA IP 详细介绍
概述
AXI Multi-Channel Direct Memory Access (MCDMA) 专为高效数据传输设计,旨在实现内存映射域(Memory-Mapped Domain)与 AXI4-Stream 流域(Stream Domain)之间的高带宽直接内存访问(DMA)。AXI MCDMA 支持多达 16 个独立通道,具备全双工和分散-聚集(Scatter-Gather,SG)功能,广泛应用于 FPGA 和 SoC 系统设计,特别是在视频处理、信号处理、网络通信和多通道数据采集等复杂场景。
AXI MCDMA 的主要功能包括:
- 多通道支持:支持最多 16 个独立通道,每个通道可独立配置,用于内存到流(MM2S)和流到内存(S2MM)的数据传输。
- 高带宽传输:通过 AXI4 内存映射接口和 AXI4-Stream 接口实现高效数据迁移,减轻处理器负担。
- 分散-聚集功能:支持非连续内存块的 DMA 传输,通过描述符链(Descriptor Chain)管理复杂数据模式。
- 灵活仲裁:提供加权轮询(Weighted Round-Robin)或严格优先级(Strict Priority)仲裁机制,优化多通道性能。
主要特性
AXI MCDMA IP 具有以下关键特性:
-
多通道 DMA:
- 支持最多 16 个独立通道,每个通道可配置为 MM2S(Memory-Mapped to Stream)或 S2MM(Stream to Memory-Mapped)。
- 每个通道支持独立的地址、数据宽度和传输参数,适合多路数据流处理(如多路视频或传感器数据)。
- 通道间通过内部调度器协调,支持并发数据传输。
-
AXI 协议兼容性:
- AXI4 内存映射接口:支持 32、64、128、256、512 或 1024 位数据宽度,用于高带宽内存访问。
- AXI4-Stream 接口:支持 8、16、32、64、128、256、512 或 1024 位数据宽度,适配流式外设。
- 支持 AXI4 突发传输(最大 256 数据节拍,INCR 类型)和 AXI4-Stream 的
TVALID
/TREADY
握手机制。
-
分散-聚集(Scatter-Gather)支持:
- 支持非连续内存块的 DMA 传输,通过描述符链管理数据地址和长度。
- 描述符存储在内存中,包含地址、长度、控制位和应用字(App Words)。
- 支持环形缓冲区(Ring Buffer)模式,实现无限传输。
-
仲裁机制:
- 加权轮询(Weighted Round-Robin):根据通道权重分配带宽,适合带宽需求不均的场景。
- 严格优先级(Strict Priority):高优先级通道优先传输,适合实时性要求高的应用。
- 仲裁策略通过 Vivado 配置或寄存器动态调整。
-
时钟与复位:
- 同步模式:所有接口共享单一时钟(
axi_aclk
)。 - 异步模式:支持独立的 MM2S 和 S2MM 时钟(
m_axis_mm2s_aclk
、m_axis_s2mm_aclk
)。 - 最大频率:200 MHz(7 系列,-1 速度等级),更高频率支持 UltraScale+ 设备。
- 同步模式:所有接口共享单一时钟(
-
控制与状态:
- 通过 AXI4-Lite 从接口配置通道参数、描述符地址和仲裁策略。
- 提供中断信号(
irq
)通知传输完成、错误或通道状态变化。 - 支持轮询(Polling)和中断(Interrupt)驱动模式。
-
工具与设备支持:
- 设计工具:Vivado Design Suite、Vitis Unified Software Platform。
- 支持设备:Kintex-7、Virtex-7、Zynq-7000、Kintex UltraScale、Virtex UltraScale、Zynq UltraScale+ MPSoC、Versal。
功能模块
AXI MCDMA IP 的功能模块围绕多通道 DMA 传输设计,核心包括控制逻辑、数据通路和描述符管理。以下是主要模块及其功能:
1. AXI4 内存映射接口模块
- 功能:处理内存映射域的读写操作。
- MM2S(内存到流):
- 通过 AXI4 读通道(
M_AXI_MM2S_ARADDR
、RDATA
)从内存读取数据。 - 支持突发传输(最大 256 数据节拍),自动分区以符合 4 KB 地址边界。
- 根据描述符中的地址和长度发起读请求。
- 通过 AXI4 读通道(
- S2MM(流到内存):
- 通过 AXI4 写通道(
M_AXI_S2MM_AWADDR
、WDATA
)将数据写入内存。 - 支持突发写操作,优化内存带宽利用。
- 通过 AXI4 写通道(
- 应用:从 DDR 或 BRAM 读取数据,或将流数据写入内存。
2. AXI4-Stream 接口模块
- 功能:处理流域的数据输入和输出。
- MM2S:
- 将内存读取的数据通过 AXI4-Stream 接口(
M_AXIS_MM2S
)输出,支持TDATA
、TVALID
、TLAST
和TKEEP
信号。 - 使用
TUSER
信号(可选)携带用户定义信息。
- 将内存读取的数据通过 AXI4-Stream 接口(
- S2MM:
- 接收 AXI4-Stream 输入(
S_AXIS_S2MM
),转换为内存写操作。 - 支持流式数据的连续或突发传输。
- 接收 AXI4-Stream 输入(
- 应用:连接流式外设,如视频编码器、ADC 或 DAC。
3. 通道调度器(Scheduler)
- 功能:协调多通道的 DMA 传输,管理带宽分配。
- 机制:
- 根据仲裁策略(加权轮询或严格优先级)分配内存和流接口资源。
- 使用权重寄存器(Weighted Round-Robin 模式)或优先级寄存器(Strict Priority 模式)动态调整通道优先级。
- 支持通道独立使能/禁用,确保灵活配置。
- 应用:优化多通道并发传输,满足不同带宽和实时性需求。
4. 分散-聚集引擎
- 功能:管理非连续内存块的 DMA 传输。
- 机制:
- 解析描述符链,获取数据地址、长度和控制信息。
- 描述符格式包括:
- Next Descriptor:指向下一个描述符的地址(支持 64 位地址)。
- Buffer Address:数据缓冲区的起始地址。
- Control:传输长度、SOP/EOP 标志。
- App Words:用户定义字段(如时间戳)。
- 支持环形缓冲区模式,描述符循环使用,适合连续传输。
- 应用:处理复杂数据模式,如视频帧或多路传感器数据。
5. 控制与状态模块
- 功能:通过 AXI4-Lite 接口配置和监控 DMA 操作。
- 机制:
- 配置寄存器:通道使能、描述符地址、仲裁权重、突发长度。
- 状态寄存器:传输完成、错误标志、通道空闲状态。
- 中断控制:支持通道级中断(
IOC_Irq
、Error_Irq)和全局中断(irq
)。
- 应用:支持处理器(如 MicroBlaze、Zynq PS)动态控制 DMA。
6. 时钟与复位模块
- 功能:管理时钟域和复位信号。
- 机制:
- 时钟:
axi_aclk
:全局时钟(同步模式)。m_axis_mm2s_aclk
:MM2S 流接口时钟(异步模式)。m_axis_s2mm_aclk
:S2MM 流接口时钟(异步模式)。s_axi_lite_aclk
:AXI4-Lite 接口时钟。
- 复位:
axi_aresetn
:全局低电平有效复位。- 各接口支持独立复位(异步模式)。
- 支持跨时钟域传输,确保数据一致性。
- 时钟:
- 应用:适配多时钟域系统设计。
接口信号
以下是 AXI MCDMA IP 的主要接口信号及其功能:
-
AXI4 内存映射接口(M_AXI_MM2S、M_AXI_S2MM):
- 类型:AXI4 主接口(读通道用于 MM2S,写通道用于 S2MM)。
- 信号:
M_AXI_MM2S_ARADDR[C_ADDR_WIDTH-1:0]
:MM2S 读地址(32 或 64 位)。M_AXI_MM2S_ARVALID
、ARREADY
:读地址握手。M_AXI_MM2S_ARLEN[7:0]
:突发长度(0-255)。M_AXI_MM2S_RDATA[C_DATA_WIDTH-1:0]
:读数据(32-1024 位)。M_AXI_MM2S_RVALID
、RREADY
:读数据握手。M_AXI_S2MM_AWADDR
、AWVALID
、AWREADY
:S2MM 写地址通道。M_AXI_S2MM_WDATA
、WVALID
、WREADY
:写数据通道。M_AXI_S2MM_BRESP
、BVALID
、BREADY
:写响应通道。
- 功能:实现内存映射域的读写操作。
- 时钟:
axi_aclk
。
-
AXI4-Stream 接口(M_AXIS_MM2S、S_AXIS_S2MM):
- 类型:AXI4-Stream 主接口(MM2S 输出)或从接口(S2MM 输入)。
- 信号(每通道独立,x=0-15):
M_AXIS_MM2S_TDATA_x[C_STREAM_WIDTH-1:0]
:MM2S 流数据(8-1024 位)。M_AXIS_MM2S_TVALID_x
、TREADY_x
:流握手。M_AXIS_MM2S_TLAST_x
:包或帧结束标志。M_AXIS_MM2S_TKEEP_x[C_STREAM_WIDTH/8-1:0]
:字节有效信号。S_AXIS_S2MM_TDATA_x
、TVALID_x
、TREADY_x
、TLAST_x
、TKEEP_x
:S2MM 流输入。
- 功能:传输流式数据到/从外设。
- 时钟:
m_axis_mm2s_aclk
(MM2S)、m_axis_s2mm_aclk
(S2MM)。
-
AXI4-Lite 控制接口(S_AXI_LITE):
- 类型:AXI4-Lite 从接口。
- 信号:
S_AXI_LITE_ARADDR[31:0]
:读地址。S_AXI_LITE_ARVALID
、ARREADY
:读地址握手。S_AXI_LITE_RDATA[31:0]
:读数据(固定 32 位)。S_AXI_LITE_WDATA
、WVALID
、WREADY
:写数据通道。S_AXI_LITE_BRESP
、BVALID
、BREADY
:写响应通道。
- 功能:配置 DMA 参数和监控状态。
- 时钟:
s_axi_lite_aclk
。
-
中断接口:
irq
:全局中断信号,汇总各通道的中断事件(如传输完成、错误)。- 功能:通知处理器处理 DMA 事件。
-
时钟与复位接口:
axi_aclk
:全局时钟。m_axis_mm2s_aclk
:MM2S 流时钟(异步模式)。m_axis_s2mm_aclk
:S2MM 流时钟(异步模式)。s_axi_lite_aclk
:AXI4-Lite 时钟。axi_aresetn
:全局低电平有效复位。- 功能:支持多时钟域和复位管理。
配置方法
1. 在 Vivado 中添加 IP
- 添加 AXI MCDMA:
- 在 Vivado IP Catalog 中搜索 AXI MCDMA,添加到设计。
- 双击 IP 核,打开定制化对话框。
- 配置参数:
- 通道数量:
Number of MM2S Channels
:MM2S 通道数(0-16)。Number of S2MM Channels
:S2MM 通道数(0-16)。
- 数据宽度:
MM2S Data Width
:MM2S 内存映射数据宽度(32-1024 位)。S2MM Data Width
:S2MM 内存映射数据宽度(32-1024 位)。Stream Data Width
:每通道流数据宽度(8-1024 位)。
- 分散-聚集:
Enable Scatter Gather
:启用 SG 模式(默认启用)。
- 仲裁策略:
Arbitration Type
:选择 Weighted Round-Robin 或 Strict Priority。Channel Weights
:为轮询模式设置通道权重(0-255)。Channel Priorities
:为优先级模式设置通道优先级(0-15)。
- 突发长度:
MM2S Burst Size
:MM2S 突发长度(2、4、8、16、32、64、128、256)。S2MM Burst Size
:S2MM 突发长度。
- 时钟模式:
Enable Asynchronous Clocks
:启用异步模式(独立流时钟)。AXI Clock Frequency
:设置axi_aclk
频率(默认 100 MHz)。
- 描述符管理:
Descriptor Address Width
:支持 32 或 64 位地址。
- 通道数量:
- RTL 生成:
- Vivado 根据配置生成 Verilog 代码,实例化所需模块。
- 输出文件位于项目目录的 IP 实例化路径(如
project_name.srcs/sources_1/ip/axi_mcdma
)。
2. 连接与驱动
- 硬件连接:
- M_AXI_MM2S:连接到 AXI4 从设备(如 DDR 控制器、AXI Interconnect)。
- M_AXI_S2MM:连接到 AXI4 从设备。
- M_AXIS_MM2S_x:连接到 AXI4-Stream 从设备(如视频处理模块)。
- S_AXIS_S2MM_x:连接到 AXI4-Stream 主设备(如 ADC)。
- S_AXI_LITE:连接到处理器(如 Zynq PS、MicroBlaze)通过 AXI Interconnect。
- 中断:将
irq
连接到中断控制器(如 Zynq GIC)。 - 分配时钟信号:
- 同步模式:所有接口使用
axi_aclk
。 - 异步模式:为 MM2S 和 S2MM 分配独立时钟(
m_axis_mm2s_aclk
、m_axis_s2mm_aclk
)。
- 同步模式:所有接口使用
- 分配复位信号:
- 确保
axi_aresetn
与时钟同步。
- 确保
- 使用 Vivado 地址编辑器为
M_AXI_MM2S
和M_AXI_S2MM
分配地址空间。
- 驱动程序:
- Xilinx 提供裸机和 Linux 驱动:
- 裸机驱动:
- 源代码位于 Vitis 或 Xilinx GitHub(
embeddedsw/XilinxProcessorIPLib/drivers/mcdma
)。 - 使用
XMcDma_CfgInitialize()
初始化 MCDMA,配置通道和描述符 - 支持中断模式(
XMcdma_TxIntrHandler
、XMcdma_IntrHandler
)和轮询模式。
- 源代码位于 Vitis 或 Xilinx GitHub(
- Linux 驱动:
- 集成在 Linux 内核(
drivers/dma/xilinx/xilinx_dma.c
),支持 DMAEngine 框架。 - 通过 Device Tree 配置通道数和 StreamID。
- 集成在 Linux 内核(
- 裸机驱动:
- 示例代码:
- 裸机示例:
xaxidma_example_sg_intr.c
。 - Linux 示例:Petalinux 项目配置。
- 裸机示例:
- 参考 Xilinx 示例设计(如 Zynq MCDMA )。
- Xilinx 提供裸机和 Linux 驱动:
3. 仿真与验证
- 仿真环境:
- 使用 Vivado Simulator 或 ModelSim 进行 RTL 仿真。
- 编写 Verilog 测试平台,驱动 AXI4 和 AXI4-Stream 接口。
- 使用 AXI Verification IP(PG267)验证协议合规性。
- 验证内容:
- 检查多通道传输的正确性(数据顺序、通道隔离)。
- 验证 SG 模式的描述符解析和环形缓冲区功能。
- 测试仲裁机制(加权轮询或优先级)在多通道竞争下的性能。
- 确保跨时钟域传输的稳定性(异步模式)。
- 验证中断触发(传输完成、错误)和状态寄存器。
- 波形分析:
- 检查 AXI4 Valid-Ready 握手、
TLAST
和TKEEP
信号。 - 确认无数据丢失、通道冲突或死锁。
- 检查 AXI4 Valid-Ready 握手、
资源利用情况
AXI MCDMA 的资源占用取决于通道数、数据宽度、SG 模式和时钟配置。以下是典型资源利用情况(基于 7 系列、UltraScale 和 Zynq 设备,Vivado 综合):
- 资源类型:
- LUT(查找表):1000-15000,取决于通道数和数据宽度。
- FF(触发器):1500-20000,与 LUT 占用相关。
- BRAM:0-8,SG 模式下描述符存储可能使用 BRAM(512 字约 1 BRAM)。
- DSP 切片:不使用。
- 配置示例:
- 4 通道(2 MM2S + 2 S2MM),64 位数据宽度,SG 模式,同步模式:约 2000 LUT、3000 FF、2 BRAM。
- 16 通道,128 位数据宽度,SG 模式,异步模式:约 10000 LUT、15000 FF、6 BRAM。
- 最大频率:
- 7 系列(-1 速度等级):200 MHz。
- UltraScale+:300 MHz 或更高。
具体资源利用需参考 Vivado 综合报告,建议根据目标设备验证资源占用。
应用场景
AXI MCDMA IP 适用于以下场景:
-
多通道视频处理:
- 处理多路视频流(如 4K 视频或多摄像头输入),通过 MM2S 通道输出到流式处理模块。
- 使用 S2MM 通道将编码后的视频流写入内存。
- 配合 AXI VDMA 和 AXI4-Stream Interconnect。
-
信号处理:
- 处理多路传感器数据(如雷达、声纳),通过 S2MM 通道采集数据到内存。
- 使用 SG 模式管理非连续数据块,提高灵活性。
-
Zynq SoC 集成:
- 在 Zynq-7000 或 UltraScale+ MPSoC 中,桥接 PS 和 PL 之间的多通道数据传输。
- PS 配置 MCDMA 寄存器,PL 处理流式数据。
-
网络通信:
- 处理多路网络数据包,通过 MM2S 和 S2MM 通道实现数据收发。
- 支持高吞吐量传输,适合 10G 以太网或 PCIe 应用。
-
实时数据采集:
- 采集多路 ADC 数据,通过 S2MM 通道存储到 DDR。
- 使用环形缓冲区模式实现连续采集。
注意事项
-
通道配置:
- 确保通道数(
Number of MM2S/S2MM Channels
)与实际需求匹配,避免资源浪费。 - 每个通道的流数据宽度需与外设接口一致。
- 确保通道数(
-
描述符管理:
- 描述符需存储在连续内存中,地址对齐(通常 64 字节)。
- SG 模式下,描述符链需正确初始化,防止传输中断。
-
仲裁优化:
- 加权轮询适合带宽分配均匀的场景,需根据通道流量调整权重。
- 严格优先级适合实时性要求高的通道,但可能导致低优先级通道饥饿(参考 PG288,第 10 页)。
-
时钟域管理:
-
复位同步:
axi_aresetn
需在各时钟域内同步,保持至少 16 个时钟周期。- 推荐使用异步复位同步释放电路。
总结
AXI MCDMA IP(PG288)是一款高性能多通道 DMA 软核,支持最多 16 个独立通道,结合 AXI4 和 AXI4-Stream 协议,实现内存映射域与流域之间的高效数据传输。其通过分散-聚集、灵活仲裁和多时钟域支持,满足视频处理、信号处理、网络通信和数据采集等复杂应用需求。
用户在配置时需注意通道数、数据宽度、仲裁策略和描述符管理,合理选择时钟模式,并通过仿真验证多通道传输和 SG 功能的正确性。结合 Vivado 工具、Vitis 驱动和 Linux 框架,AXI MCDMA 可显著提升系统性能。
FPGA设计工具推荐
-
SZ901:
SZ901 是一款基于XVC协议的FPGA网络下载器。- 最高支持53M
- 支持4路JTAG独立使用
- 支持端口合并
- 支持国产FLASH烧写
- 下载器无限扩展
- 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!
-
SZ501(PRO_A7):
- SZ501 是一款适合初学者FPGA开发板,包含低速高速接口!
- 双网口(RGMII)
- 双SFP+
- DDR
- UART
- IIC