AXI VDMA IP 详细介绍
概述
AXI VDMA(Video Direct Memory Access,视频直接内存访问)专为在 FPGA 和 SoC 系统中实现高效的视频数据传输设计,支持通过 AXI4 和 AXI4-Stream 协议在内存(如 DDR)和视频处理模块之间进行高带宽数据搬运。它广泛应用于视频处理、图像处理和嵌入式视觉系统,如 Zynq SoC、Versal 架构和 UltraScale+ 设备的视频流水线设计。
AXI VDMA 的核心功能是提供双通道(Memory Map to Stream 和 Stream to Memory Map)DMA 引擎,支持视频帧的读写操作,配合 AXI4 内存映射接口(MM2S 和 S2MM)与 AXI4-Stream 接口传输数据。它通过灵活的帧缓冲区管理、动态分辨率支持和中断控制,满足实时视频处理的高吞吐量需求。
该 IP 核的主要功能包括:
- 双通道 DMA:支持内存到流(MM2S)和流到内存(S2MM)的数据传输。
- 协议支持:兼容 AXI4 内存映射和 AXI4-Stream 协议。
- 帧管理:支持多帧缓冲区和动态分辨率配置。
- 高性能:提供高带宽视频数据传输,适合 4K/8K 视频处理。
主要特性
AXI VDMA IP 具有以下关键特性:
-
协议支持:
- AXI4 内存映射接口:用于 MM2S(Memory Map to Stream)和 S2MM(Stream to Memory Map)通道,连接到内存控制器(如 DDR)。
- AXI4-Stream 接口:用于视频数据流传输,连接到视频处理模块。
- 支持 AMBA AXI4 协议规范(IHI0022),兼容 AXI4 和 AXI4-Stream。
-
双通道 DMA 引擎:
- MM2S 通道:
- 从内存读取视频帧数据,转换为 AXI4-Stream 格式输出。
- 适合将存储的视频数据传输到视频处理模块。
- S2MM 通道:
- 从 AXI4-Stream 输入接收视频数据,写入内存。
- 适合将视频处理模块的输出存储到内存。
- 支持独立或同步的双通道操作。
- MM2S 通道:
-
帧缓冲区管理:
- 支持多帧缓冲区(1-32 个帧),通过帧存储寄存器(Frame Store Registers)管理。
- 提供动态帧切换,允许连续视频流处理。
- 支持帧同步机制(如帧同步信号
fsync
或自由运行模式)。
-
动态分辨率支持:
- 支持可编程的水平分辨率(Horizontal Size,最大 8192 像素)和垂直分辨率(Vertical Size,最大 8192 像素)。
- 支持可配置的行跨距(Stride),适配不同帧格式和内存对齐。
-
控制与中断:
- 通过 AXI4-Lite 控制接口配置 DMA 参数(如帧地址、分辨率、传输模式)。
- 提供中断信号(
mm2s_introut
、s2mm_introut
),支持帧完成、错误和延迟中断。 - 支持软件驱动(裸机或 Linux),简化配置和状态监控。
-
性能优化:
- 高带宽传输:
- 支持最大 1024 位数据宽度(AXI4 接口)。
- 最大突发长度 256(AXI4),优化内存访问效率。
- 流水线设计:
- 内部流水线处理,减少传输延迟。
- 支持帧预取(Frame Prefetch),提高吞吐量。
- 动态时钟支持:
- MM2S 和 S2MM 通道可使用不同时钟(
m_axi_mm2s_aclk
、m_axi_s2mm_aclk
)。
- MM2S 和 S2MM 通道可使用不同时钟(
- 最大频率:250 MHz(7 系列,-1 速度等级),更高频率支持 UltraScale+。
- 高带宽传输:
-
工具与设备支持:
- 设计工具:Vivado Design Suite。
- 支持设备:Artix-7、Kintex-7、Virtex-7、Zynq-7000、Kintex UltraScale、Virtex UltraScale、Zynq UltraScale+ MPSoC、Versal AI Core、Versal Premium、Versal Prime。
功能模块
AXI VDMA IP 的功能模块围绕视频数据传输和帧管理设计,核心包括 DMA 引擎、帧存储器、控制逻辑和接口适配。以下是主要模块及其功能:
1. MM2S DMA 引擎
- 功能:从内存读取视频帧,转换为 AXI4-Stream 输出。
- 机制:
- 通过 AXI4 接口(
m_axi_mm2s
)从内存读取数据。 - 根据帧存储寄存器中的地址(
MM2S_START_ADDRESS
)和分辨率(HSIZE
、VSIZE
)组织数据。 - 将数据打包为 AXI4-Stream 格式,输出到
m_axis_mm2s
接口。 - 支持帧同步(
mm2s_fsync
)或自由运行模式。
- 通过 AXI4 接口(
- 应用:将存储的视频帧传输到视频处理模块(如图像缩放、颜色转换)。
2. S2MM DMA 引擎
- 功能:从 AXI4-Stream 输入接收视频数据,写入内存。
- 机制:
- 通过 AXI4-Stream 接口(
s_axis_s2mm
)接收视频数据。 - 根据帧存储寄存器中的地址(
S2MM_START_ADDRESS
)和分辨率写入内存(m_axi_s2mm
)。 - 支持帧同步(
s2mm_fsync
)或自由运行模式。
- 通过 AXI4-Stream 接口(
- 应用:将视频处理模块的输出存储到内存(如 DDR)。
3. 帧存储器管理模块
- 功能:管理多帧缓冲区的地址和状态。
- 机制:
- 存储 1-32 个帧的起始地址(
MM2S_START_ADDRESS
、S2MM_START_ADDRESS
)。 - 跟踪当前帧和下一帧状态,支持动态帧切换。
- 提供帧计数器(Frame Counter),触发帧完成中断。
- 存储 1-32 个帧的起始地址(
- 应用:支持连续视频流处理,防止帧丢失。
4. 控制逻辑模块
- 功能:通过 AXI4-Lite 接口配置和监控 VDMA 状态。
- 机制:
- 配置寄存器:
- 设置帧地址、分辨率(
HSIZE
、VSIZE
)、行跨距(STRIDE
)。 - 启用/禁用 MM2S 和 S2MM 通道。
- 配置中断阈值和延迟。
- 设置帧地址、分辨率(
- 状态寄存器:
- 记录传输状态(运行、停止、错误)。
- 提供错误标志(如帧同步错误、DMA 错误)。
- 中断控制:
- 生成
mm2s_introut
和s2mm_introut
,通知帧完成或错误。
- 生成
- 配置寄存器:
- 应用:支持软件动态配置和故障诊断。
5. 接口适配模块
- 功能:适配 AXI4 和 AXI4-Stream 接口的信号和时序。
- 机制:
- AXI4 接口:
- 支持读(MM2S)/写(S2MM)事务,优化突发长度和地址对齐。
- 实现 AXI4 握手(
ARVALID
/ARREADY
、WVALID
/WREADY
)。
- AXI4-Stream 接口:
- 支持
TVALID
/TREADY
握手,传递TDATA
、TLAST
、TUSER
。 - 提供帧同步信号(
mm2s_fsync
、s2mm_fsync
)或内部触发。
- 支持
- AXI4 接口:
- 应用:确保与内存和视频模块的兼容性。
6. 时钟与复位模块
- 功能:管理时钟和复位信号。
- 机制:
- 时钟:
s_axi_lite_aclk
:AXI4-Lite 控制接口时钟。m_axi_mm2s_aclk
:MM2S AXI4 接口时钟。m_axis_mm2s_aclk
:MM2S AXI4-Stream 接口时钟。m_axi_s2mm_aclk
:S2MM AXI4 接口时钟。s_axis_s2mm_aclk
:S2MM AXI4-Stream 接口时钟。
- 复位:
axi_resetn
:低电平有效复位,同步到对应时钟。
- 支持多时钟域设计,需正确配置时钟同步。
- 时钟:
- 应用:支持灵活的时钟分配和高性能传输。
接口信号
以下是 AXI VDMA IP 的主要接口信号及其功能:
-
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_RVALID
、RREADY
:读数据握手。S_AXI_LITE_AWADDR
、AWVALID
、AWREADY
:写地址通道。S_AXI_LITE_WDATA
、WVALID
、WREADY
:写数据通道。S_AXI_LITE_BRESP
、BVALID
、BREADY
:写响应通道。
- 功能:配置帧地址、分辨率、传输模式,读取状态和错误。
- 时钟:
s_axi_lite_aclk
。
-
AXI4 内存映射接口(MM2S 和 S2MM):
- MM2S 接口(M_AXI_MM2S):
- 类型:AXI4 主接口,读取内存数据。
- 信号:
M_AXI_MM2S_ARADDR[C_ADDR_WIDTH-1:0]
:读地址(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_mm2s_aclk
。
- S2MM 接口(M_AXI_S2MM):
- 类型:AXI4 主接口,写入内存数据。
- 信号:
M_AXI_S2MM_AWADDR
、AWVALID
、AWREADY
、AWLEN
:写地址通道。M_AXI_S2MM_WDATA
、WVALID
、WREADY
:写数据通道。M_AXI_S2MM_WSTRB[C_DATA_WIDTH/8-1:0]
:写选通。M_AXI_S2MM_BRESP
、BVALID
、BREADY
:写响应通道。
- 功能:将视频数据写入内存。
- 时钟:
m_axi_s2mm_aclk
。
- MM2S 接口(M_AXI_MM2S):
-
AXI4-Stream 接口(MM2S 和 S2MM):
- MM2S 接口(M_AXIS_MM2S):
- 类型:AXI4-Stream 主接口,输出视频流。
- 信号:
M_AXIS_MM2S_TDATA[C_STREAM_WIDTH-1:0]
:流数据(32-1024 位)。M_AXIS_MM2S_TVALID
、TREADY
:流握手。M_AXIS_MM2S_TLAST
:帧结束标志。M_AXIS_MM2S_TUSER[0:0]
:帧起始标志(SOF,Start of Frame)。M_AXIS_MM2S_TKEEP[C_STREAM_WIDTH/8-1:0]
:字节有效信号。
- 功能:输出视频流到处理模块。
- 时钟:
m_axis_mm2s_aclk
。
- S2MM 接口(S_AXIS_S2MM):
- 类型:AXI4-Stream 从接口,接收视频流。
- 信号:同 M_AXIS_MM2S,但方向相反。
- 功能:接收视频流并写入内存。
- 时钟:
s_axis_s2mm_aclk
。
- MM2S 接口(M_AXIS_MM2S):
-
帧同步信号:
mm2s_fsync
:MM2S 通道帧同步输入。s2mm_fsync
:S2MM 通道帧同步输入。- 功能:触发新帧传输(可选,自由运行模式无需此信号)。
-
中断接口:
mm2s_introut
:MM2S 通道中断(帧完成、错误)。s2mm_introut
:S2MM 通道中断。- 功能:通知处理器传输状态。
-
时钟与复位接口:
s_axi_lite_aclk
、m_axi_mm2s_aclk
、m_axis_mm2s_aclk
、m_axi_s2mm_aclk
、s_axis_s2mm_aclk
:多时钟输入。axi_resetn
:低电平有效复位。- 功能:提供时钟和复位控制。
配置方法
1. 在 Vivado 中添加 IP
- 添加 AXI VDMA:
- 在 Vivado IP Catalog 中搜索 AXI VDMA,添加到设计。
- 双击 IP 核,打开定制化对话框。
- 配置参数:
- 通道配置:
C_MM2S_ENABLE
:启用 MM2S 通道(默认启用)。C_S2MM_ENABLE
:启用 S2MM 通道(默认启用)。
- 接口参数:
C_M_AXI_MM2S_DATA_WIDTH
:MM2S AXI4 数据宽度(32-1024 位)。C_M_AXI_S2MM_DATA_WIDTH
:S2MM AXI4 数据宽度。C_M_AXIS_MM2S_TDATA_WIDTH
:MM2S AXI4-Stream 数据宽度。C_S_AXIS_S2MM_TDATA_WIDTH
:S2MM AXI4-Stream 数据宽度。C_ADDR_WIDTH
:地址宽度(32 或 64 位)。
- 帧管理:
C_NUM_FSTORES
:帧缓冲区数量(1-32)。C_MM2S_MAX_BURST
、C_S2MM_MAX_BURST
:最大突发长度(8-256)。
- 同步模式:
C_MM2S_GENLOCK_MODE
、C_S2MM_GENLOCK_MODE
:帧同步模式(0=自由运行,1=外部帧同步)。
- 控制接口:
C_S_AXI_LITE_ADDR_WIDTH
:AXI4-Lite 地址宽度(默认 32 位)。
- 通道配置:
- RTL 生成:
- Vivado 生成 Verilog 代码,实例化 DMA 引擎和控制逻辑。
- 输出文件位于项目目录(如
project_name.srcs/sources_1/ip/axi_vdma
)。
2. 连接与驱动
- 硬件连接:
- S_AXI_LITE:
- 连接到处理器(如 Zynq PS、MicroBlaze)通过 AXI Interconnect。
- M_AXI_MM2S、M_AXI_S2MM:
- 连接到内存控制器(如 AXI SmartConnect 到 DDR)。
- M_AXIS_MM2S、S_AXIS_S2MM:
- 连接到视频处理模块(如 AXI4-Stream 图像处理 IP)。
- 帧同步信号:
- 连接
mm2s_fsync
、s2mm_fsync
到外部触发源(若启用帧同步)。
- 连接
- 中断:
- 连接
mm2s_introut
、s2mm_introut
到中断控制器(如 Zynq GIC)。
- 连接
- 分配时钟和复位:
- 分配独立的时钟到
s_axi_lite_aclk
、m_axi_mm2s_aclk
等。 axi_resetn
连接到系统复位。
- 分配独立的时钟到
- 使用 Vivado 地址编辑器为
S_AXI_LITE
和M_AXI
接口分配地址空间。
- S_AXI_LITE:
- 驱动程序:
- 裸机驱动:
- Xilinx 提供 VDMA 驱动(
XilinxProcessorIPLib/drivers/vdma
),支持帧配置和中断处理。 - 示例代码:配置帧地址(
XAxiVdma_SetFrameStore
)、启动传输(XAxiVdma_DmaStart
)。
- Xilinx 提供 VDMA 驱动(
- Linux 驱动:
- 使用 Xilinx Linux VDMA 驱动(
drivers/dma/xilinx/xilinx_vdma.c
)。 - 配置 Device Tree,指定帧缓冲区和中断。
- 使用 Xilinx Linux VDMA 驱动(
- 调试支持:
- 使用 Vivado ILA 捕获 AXI4 和 AXI4-Stream 信号,分析传输行为。
- 读取状态寄存器,定位错误(如帧同步丢失)。
- 裸机驱动:
3. 仿真与验证
- 仿真环境:
- 使用 Vivado Simulator 或 ModelSim 进行 RTL 仿真。
- 编写 SystemVerilog 测试平台,驱动
S_AXI_LITE
配置和S_AXIS_S2MM
数据。 - 使用 AXI Verification IP(PG267)模拟 AXI 主设备和从设备,验证接口行为。
- 验证内容:
- 检查 MM2S 通道:验证内存数据正确转换为 AXI4-Stream 输出,
TLAST
和TUSER
信号正确。 - 验证 S2MM 通道:确认 AXI4-Stream 输入正确写入内存,地址和跨距符合预期。
- 测试帧同步:触发
mm2s_fsync
/s2mm_fsync
,验证帧切换。 - 验证中断:检查
mm2s_introut
/s2mm_introut
的触发时序。 - 测试错误场景:模拟内存错误(
RRESP=SLVERR
)或帧同步丢失。
- 检查 MM2S 通道:验证内存数据正确转换为 AXI4-Stream 输出,
- 波形分析:
- 使用 Vivado 波形查看器分析 AXI4 和 AXI4-Stream 信号。
- 确认突发长度、数据对齐和帧同步时序。
- 检查中断信号的触发条件。
资源利用情况
AXI VDMA 的资源占用取决于通道配置、数据宽度和帧缓冲区数量。以下是典型资源利用情况(基于 7 系列、UltraScale 和 Zynq 设备,Vivado 综合):
- 资源类型:
- LUT(查找表):1000-5000,取决于通道数量和数据宽度。
- FF(触发器):2000-8000,与 LUT 占用相关。
- BRAM:0-2,用于帧地址存储(视
C_NUM_FSTORES
)。 - DSP 切片:0(不使用)。
- 配置示例:
- MM2S+S2MM,64 位数据宽度,8 帧缓冲区:约 2000 LUT、4000 FF、1 BRAM。
- MM2S 单通道,128 位数据宽度,4 帧缓冲区:约 1500 LUT、3000 FF。
- S2MM 单通道,32 位数据宽度,16 帧缓冲区:约 1800 LUT、3500 FF、1 BRAM。
- 最大频率:
- 7 系列(-1 速度等级):250 MHz。
- UltraScale+:400 MHz 或更高。
具体资源利用需参考 Vivado 综合报告,建议根据目标设备和配置验证资源占用。
应用场景
AXI VDMA IP 适用于以下场景:
-
视频处理流水线:
- 在 Zynq SoC 或 Versal 设计中,构建视频处理流水线(如 4K/8K 视频缩放、格式转换)。
- 配合 AXI4-Stream 处理模块(如 Xilinx Video Scaler、Color Space Converter)。
-
嵌入式视觉系统:
- 在自动驾驶或工业视觉系统中,传输相机捕获的图像数据到内存或处理模块。
- 支持实时图像处理和存储。
-
显示系统:
- 在视频显示应用中,将内存中的帧数据传输到 HDMI 或 DisplayPort 接口。
- 支持高分辨率视频输出(如 1080p、4K)。
-
数据采集与存储:
- 在高带宽数据采集系统中,将传感器数据通过 AXI4-Stream 存储到 DDR。
- 配合 AXI SmartConnect(PG247)实现多通道数据管理。
-
调试与验证:
- 在视频系统开发中,使用 AXI VDMA 验证 AXI4 和 AXI4-Stream 接口的行为。
- 配合 Vivado ILA 分析帧传输性能。
注意事项
-
协议配置:
- 确保 AXI4 和 AXI4-Stream 接口的参数(数据宽度、突发长度)与上下游模块匹配。
- AXI4-Lite 地址空间需正确映射,避免配置错误。
-
帧同步设置:
- 外部帧同步模式需提供稳定的
mm2s_fsync
/s2mm_fsync
信号,频率匹配视频帧率。 - 自由运行模式适合无外部触发场景,但需软件管理帧切换。
- 外部帧同步模式需提供稳定的
-
时钟管理:
- 确保多时钟域(
s_axi_lite_aclk
、m_axi_mm2s_aclk
等)同步或正确配置 CDC(跨时钟域)。 axi_resetn
需保持至少 16 个时钟周期,同步释放以防亚稳态。
- 确保多时钟域(
-
中断处理:
- 配置中断控制器正确响应
mm2s_introut
和s2mm_introut
,避免漏报帧完成或错误。 - 定期读取状态寄存器,处理错误(如 DMA 错误、帧同步丢失)。
- 配置中断控制器正确响应
-
性能优化:
- 设置合适的突发长度(
C_MM2S_MAX_BURST
、C_S2MM_MAX_BURST
),最大化内存带宽。 - 调整行跨距(
STRIDE
)以优化内存对齐,减少无效传输。
- 设置合适的突发长度(
总结
AXI VDMA IP(PG020)是一款高性能的视频 DMA 软核,支持 AXI4 和 AXI4-Stream 协议,通过双通道 DMA 引擎和灵活的帧管理,实现内存与视频处理模块间的高效数据传输。其动态分辨率支持、高带宽传输和中断控制使其成为视频处理、嵌入式视觉和显示系统的核心组件,广泛应用于 Zynq SoC、Versal 和 UltraScale+ 设计。
用户在配置时需注意接口参数、帧同步模式和时钟管理,合理优化突发长度和中断处理,并通过仿真验证传输性能。结合 Vivado 工具、Xilinx 驱动和 ILA 调试,AXI VDMA 可显著提升视频系统性能和开发效率。
FPGA设计工具推荐
-
SZ901:
SZ901 是一款基于XVC协议的FPGA网络下载器。- 最高支持53M
- 支持4路JTAG独立使用
- 支持端口合并
- 支持国产FLASH烧写
- 下载器无限扩展
- 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!
-
SZ501(PRO_A7):
- SZ501 是一款适合初学者FPGA开发板,包含低速高速接口!
- 双网口(RGMII)
- 双SFP+
- DDR
- UART
- IIC