AXI Virtual FIFO Controller IP 详细介绍
概述
AXI Virtual FIFO Controller(虚拟 FIFO 控制器)专为在 FPGA 和 SoC 系统中利用外部 DRAM 内存实现大容量 FIFO 存储设计,支持通过 AXI4-Stream 接口将外部内存段组织为多个虚拟 FIFO 块。它广泛应用于需要大容量数据缓冲的场景,如信号处理、图像处理、视频流传输和网络数据包处理,特别是在 Zynq SoC、UltraScale+ 和 Versal 架构的设计中。
AXI Virtual FIFO Controller 的核心功能是将外部 DRAM(如 DDR3、DDR4)划分为多个虚拟 FIFO 通道(最多 8 个),通过 AXI4 内存映射接口访问内存,并提供 AXI4-Stream 接口进行数据读写操作。它通过多通道仲裁、地址管理和 FIFO 状态信号,简化了外部内存作为 FIFO 的使用,相比传统 DMA 方案降低了设计复杂性。
该 IP 核的主要功能包括:
- 多通道支持:支持最多 8 个独立的虚拟 FIFO 通道。
- 协议支持:兼容 AXI4 内存映射和 AXI4-Stream 协议。
- 大容量缓冲:利用外部 DRAM 实现高达 64 MB 每通道的 FIFO 容量。
- 高性能:支持宽数据路径和优化仲裁,适合高带宽应用。
主要特性
AXI Virtual FIFO Controller IP 具有以下关键特性:
-
协议支持:
- AXI4 内存映射接口:用于访问外部 DRAM(如 DDR3、DDR4),支持内存读写操作。
- AXI4-Stream 接口:提供写(主接口)和读(从接口),用于数据流传输。
- 符合 AMBA AXI4 协议规范(IHI0022),支持 AXI4 和 AXI4-Stream。
-
多通道支持:
- 支持最多 8 个虚拟 FIFO 通道,每个通道独立管理内存分区。
- 使用 AXI4-Stream 的
TDEST
信号作为通道标识符,支持包切换操作。 - 每通道最大容量为 64 MB(受限于 4 KB 页面管理)。
-
数据宽度支持:
- 支持 AXI4-Stream 和 AXI4 内存映射接口的多种数据宽度:32、64、128、256、512、1024 位。
- AXI4 内存映射接口数据宽度与 AXI4-Stream 一致,确保高效传输。
-
突发长度支持:
- 支持 AXI4 内存映射接口的突发长度:512、1024、2048、4096 字节。
- 优化内存访问效率,减少总线开销。
-
FIFO 状态信号:
- 提供每通道的 FIFO Full 和 FIFO Empty 信号,指示缓冲区状态。
- 支持用户监控 FIFO 填充状态,防止溢出或欠载。
-
仲裁机制:
- MM2S 加权轮询(Weighted Round Robin, WRR)仲裁:优化多通道读操作的吞吐量。
- 每时钟周期进行通道仲裁,支持高性能数据传输。
-
地址管理:
- 支持可配置的 DRAM 基地址(Base Address),每个通道分配独立的内存分区。
- 自动管理读写指针,跟踪每个 FIFO 分区的起始和结束地址。
-
时钟与复位:
- 支持单一时钟操作(
aclk
),不支持异步时钟模式。 - 支持低电平有效复位(
aresetn
),同步到aclk
。 - 最大频率:200 MHz(Kintex-7,-2 速度等级),更高频率支持 UltraScale+。
- 支持单一时钟操作(
-
工具与设备支持:
- 设计工具:Vivado Design Suite、ISE 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 Virtual FIFO Controller IP 的功能模块围绕多通道 FIFO 管理和数据传输设计,核心包括 AXI4-Stream 接口控制器、内存映射接口控制器、地址管理模块和仲裁模块。以下是主要模块及其功能:
1. AXI4-Stream 接口控制器
- 功能:管理 AXI4-Stream 读写接口,处理数据流传输。
- 机制:
- 写接口(主接口):
- 接收外部模块的 AXI4-Stream 数据(
s_axis_tdata
、s_axis_tvalid
)。 - 使用
TDEST
信号标识目标 FIFO 通道。 - 将数据传递到内存映射接口控制器,写入 DRAM。
- 接收外部模块的 AXI4-Stream 数据(
- 读接口(从接口):
- 从 DRAM 读取数据,输出到 AXI4-Stream(
m_axis_tdata
、m_axis_tvalid
)。 - 使用
TDEST
标识数据来源通道。
- 从 DRAM 读取数据,输出到 AXI4-Stream(
- 实现
TVALID
/TREADY
握手,确保流控正确性。
- 写接口(主接口):
- 应用:连接信号处理模块(如 XADC、视频处理 IP)到虚拟 FIFO。
2. 内存映射接口控制器
- 功能:通过 AXI4 接口访问外部 DRAM,执行读写操作。
- 机制:
- 写操作:
- 将 AXI4-Stream 输入数据转换为 AXI4 写事务(
m_axi_awaddr
、m_axi_wdata
)。 - 根据通道的内存分区地址写入 DRAM。
- 将 AXI4-Stream 输入数据转换为 AXI4 写事务(
- 读操作:
- 从 DRAM 读取数据(
m_axi_araddr
、m_axi_rdata
),转换为 AXI4-Stream 输出。
- 从 DRAM 读取数据(
- 支持大突发长度(512-4096 字节),优化内存带宽。
- 写操作:
- 应用:桥接虚拟 FIFO 和外部内存(如通过 MIG 访问 DDR)。
3. 每通道地址管理模块
- 功能:管理每个虚拟 FIFO 通道的 DRAM 地址分区。
- 机制:
- 为每个通道分配独立的内存分区(4 KB 页面对齐)。
- 跟踪读写指针(Start/End Address),维护 FIFO 数据顺序。
- 支持可配置的基地址(
C_BASEADDR
)和通道大小(最大 64 MB)。
- 应用:确保多通道数据不冲突,支持大容量缓冲。
4. MM2S 加权轮询仲裁模块
- 功能:管理多通道读操作的优先级和吞吐量。
- 机制:
- 使用加权轮询(WRR)算法,分配 MM2S 通道的 DRAM 访问权限。
- 每时钟周期执行通道仲裁,优化多通道读性能。
- 确保公平性和高吞吐量,防止某一通道长时间占用总线。
- 应用:支持高带宽、多通道数据流传输。
5. 时钟与复位模块
- 功能:管理时钟和复位信号。
- 机制:
- 时钟:单一
aclk
,驱动所有接口(不支持异步时钟)。 - 复位:
aresetn
,低电平有效,同步到aclk
。 - 提供错误中断(
axi_mm_err_intr
),通知 DRAM 访问错误(如RRESP=SLVERR
)。
- 时钟:单一
- 应用:确保与 AXI 系统时钟和复位一致。
接口信号
以下是 AXI Virtual FIFO Controller IP 的主要接口信号及其功能:
-
AXI4-Stream 写接口(S_AXIS,写主接口):
- 类型:AXI4-Stream 从接口,接收外部数据流。
- 信号:
S_AXIS_TDATA[C_AXIS_WIDTH-1:0]
:输入数据(32-1024 位)。S_AXIS_TVALID
、TREADY
:流握手。S_AXIS_TDEST[C_DEST_WIDTH-1:0]
:通道标识符(0-7)。S_AXIS_TLAST
:包结束标志。S_AXIS_TKEEP[C_AXIS_WIDTH/8-1:0]
:字节有效信号。
- 功能:接收数据并写入指定通道的 DRAM 分区。
- 参数:
C_AXIS_WIDTH
:数据宽度。C_DEST_WIDTH
:TDEST
宽度(取决于通道数量)。
-
AXI4-Stream 读接口(M_AXIS,读从接口):
- 类型:AXI4-Stream 主接口,输出数据流。
- 信号:
M_AXIS_TDATA[C_AXIS_WIDTH-1:0]
:输出数据。M_AXIS_TVALID
、TREADY
:流握手。M_AXIS_TDEST
、TLAST
、TKEEP
:同 S_AXIS。
- 功能:从 DRAM 读取数据,输出到外部模块。
- 参数:同 S_AXIS。
-
AXI4 内存映射接口(M_AXI):
- 类型:AXI4 主接口,访问外部 DRAM。
- 信号:
- 读地址通道:
M_AXI_ARADDR[C_ADDR_WIDTH-1:0]
:读地址(32 或 64 位)。M_AXI_ARVALID
、ARREADY
:读地址握手。M_AXI_ARLEN[7:0]
:突发长度(0-255)。
- 读数据通道:
M_AXI_RDATA[C_DATA_WIDTH-1:0]
:读数据(32-1024 位)。M_AXI_RVALID
、RREADY
:读数据握手。M_AXI_RRESP[1:0]
:读响应(OKAY、SLVERR、DECERR)。
- 写地址通道:
M_AXI_AWADDR
、AWVALID
、AWREADY
、AWLEN
:写地址参数。
- 写数据通道:
M_AXI_WDATA
、WVALID
、WREADY
:写数据。M_AXI_WSTRB[C_DATA_WIDTH/8-1:0]
:写选通。
- 写响应通道:
M_AXI_BRESP
、BVALID
、BREADY
:写响应。
- 读地址通道:
- 功能:读写 DRAM,实现虚拟 FIFO 存储。
- 参数:
C_ADDR_WIDTH
:地址宽度。C_DATA_WIDTH
:数据宽度(与 AXI4-Stream 一致)。
-
FIFO 状态信号:
fifo_full[7:0]
:每通道 FIFO 满信号(高电平有效)。fifo_empty[7:0]
:每通道 FIFO 空信号(高电平有效)。- 功能:指示每个通道的缓冲区状态。
-
中断接口:
axi_mm_err_intr
:AXI4 内存映射错误中断(触发于RRESP
/BRESP
非 OKAY)。- 功能:通知 DRAM 访问错误。
-
时钟与复位接口:
aclk
:全局时钟。aresetn
:低电平有效复位。- 功能:提供时钟和复位控制。
配置方法
1. 在 Vivado 中添加 IP
- 添加 AXI Virtual FIFO Controller:
- 在 Vivado IP Catalog 中搜索 AXI Virtual FIFO Controller,添加到设计。
- 双击 IP 核,打开定制化对话框。
- 配置参数:
- 通道配置:
C_NUM_CHANNELS
:通道数量(1-8)。
- 接口参数:
C_AXIS_WIDTH
:AXI4-Stream 数据宽度(32、64、128、256、512、1024 位)。C_AXI_MM_DATA_WIDTH
:AXI4 内存映射数据宽度(与C_AXIS_WIDTH
一致)。C_ADDR_WIDTH
:地址宽度(32 或 64 位)。
- 内存配置:
C_BASEADDR
:DRAM 基地址。C_CHANNEL_SIZE
:每通道内存大小(4 KB 页面,最大 64 MB)。
- 突发长度:
C_MM_BURST_SIZE
:AXI4 突发字节数(512、1024、2048、4096)。
- 通道配置:
- RTL 生成:
- Vivado 生成 Verilog 代码,实例化控制器和地址管理逻辑。
- 输出文件位于项目目录(如
project_name.srcs/sources_1/ip/axi_vfifo
)。
2. 连接与驱动
- 硬件连接:
- S_AXIS:
- 连接到 AXI4-Stream 主设备(如 XADC、视频处理模块)。
- M_AXIS:
- 连接到 AXI4-Stream 从设备(如 AXI Stream FIFO、信号处理模块)。
- M_AXI:
- 连接到内存控制器(如 MIG 或 AXI SmartConnect 到 DDR)。
- FIFO 状态信号:
- 连接
fifo_full
和fifo_empty
到控制逻辑,监控缓冲区状态。
- 连接
- 中断:
- 连接
axi_mm_err_intr
到中断控制器(如 Zynq GIC)。
- 连接
- 分配时钟和复位:
aclk
:连接到系统时钟(与 MIG 或 DRAM 时钟同步)。aresetn
:连接到系统复位。
- 使用 Vivado 地址编辑器为
M_AXI
接口分配 DRAM 地址空间。
- S_AXIS:
- 驱动程序:
- AXI Virtual FIFO Controller 为透明 IP,无需专用驱动。
- 依赖上下游模块的驱动(如 MIG 控制器、AXI Stream FIFO)。
- 可通过处理器(如 MicroBlaze)读取
fifo_full
/fifo_empty
信号或处理axi_mm_err_intr
中断。 - 示例应用:使用 MicroBlaze 监控 DDR 内存中的 FIFO 数据。
3. 仿真与验证
- 仿真环境:
- 使用 Vivado Simulator 或 ModelSim 进行 RTL 仿真。
- 编写 SystemVerilog 测试平台,驱动
S_AXIS
数据和TDEST
信号。 - 使用 AXI Verification IP(PG267)模拟 AXI4 主设备和从设备,验证接口行为。
- 验证内容:
- 检查多通道传输:验证不同
TDEST
的数据正确写入/读取对应 FIFO 通道。 - 验证 FIFO 状态:确认
fifo_full
和fifo_empty
信号的触发条件。 - 测试突发操作:验证 AXI4 突发长度和数据完整性。
- 验证错误处理:模拟 DRAM 错误(
RRESP=SLVERR
),检查axi_mm_err_intr
。 - 检查仲裁:验证多通道读操作的 WRR 公平性。
- 检查多通道传输:验证不同
- 波形分析:
- 使用 Vivado 波形查看器分析 AXI4 和 AXI4-Stream 信号。
- 确认
TDEST
、数据顺序和突发时序。 - 检查中断信号的触发条件。
资源利用情况
AXI Virtual FIFO Controller 的资源占用取决于通道数量、数据宽度和突发配置。以下是典型资源利用情况(基于 7 系列、UltraScale 和 Zynq 设备,Vivado 综合):
- 资源类型:
- LUT(查找表):1000-6000,取决于通道数量和数据宽度。
- FF(触发器):2000-10000,与 LUT 占用相关。
- BRAM:0-2,用于地址管理和缓冲(视通道数量)。
- DSP 切片:0(不使用)。
- 配置示例:
- 4 通道,64 位数据宽度,1024 字节突发:约 2000 LUT、4000 FF、1 BRAM。
- 8 通道,128 位数据宽度,2048 字节突发:约 4000 LUT、8000 FF、2 BRAM。
- 1 通道,32 位数据宽度,512 字节突发:约 1000 LUT、2000 FF。
- 最大频率:
- 7 系列(-2 速度等级):200 MHz。
- UltraScale+:300 MHz 或更高。
应用场景
AXI Virtual FIFO Controller IP 适用于以下场景:
-
信号与图像处理:
- 在 Zynq SoC 或 Versal 设计中,使用 DDR 存储大容量信号数据(如 XADC 输出)。
- 支持高带宽信号缓冲,简化 DMA 配置。
-
视频流传输:
- 在视频处理流水线中,利用 DRAM 作为视频帧缓冲区。
- 配合 AXI VDMA(PG020)实现高效视频数据流传输。
-
网络数据包处理:
- 在网络应用中,使用虚拟 FIFO 存储数据包,支持包切换(通过
TDEST
)。 - 简化 AXI Ethernet 接口的缓冲管理。
- 在网络应用中,使用虚拟 FIFO 存储数据包,支持包切换(通过
-
小容量 FPGA 优化:
- 在 BRAM 资源有限的小型 FPGA(如 Artix-7)中,利用外部 DDR 扩展 FIFO 容量。
- 减少 FPGA 内部资源占用。
-
调试与验证:
- 在系统开发中,配合 Vivado ILA 验证 AXI4-Stream 数据流和 DRAM 访问。
- 使用 MicroBlaze 读取 DDR 内容,检查 FIFO 数据。
注意事项
-
通道配置:
- 确保
C_NUM_CHANNELS
和TDEST
宽度匹配,防止通道标识错误。 - 每通道最大 64 MB,需根据 DRAM 容量合理分配。
- 确保
-
内存分配:
- 配置
C_BASEADDR
和C_CHANNEL_SIZE
时,避免与系统其他内存使用冲突(如 MicroBlaze 应用)。 - 使用 Vivado 地址编辑器验证 DRAM 地址空间。
- 配置
-
TKEEP 与 TLAST:
- AXI Virtual FIFO 不存储
TKEEP
和TLAST
信号,用户需自行管理字节对齐和包边界。 - 对于需要包边界的应用,需额外逻辑记录包长度。
- AXI Virtual FIFO 不存储
-
时钟与复位:
- 确保
aclk
与 DRAM 控制器(如 MIG)时钟同步。 aresetn
需保持至少 16 个时钟周期,同步释放以防亚稳态。
- 确保
-
性能优化:
- 选择较大的突发长度(
C_MM_BURST_SIZE
)以提高内存带宽。 - 监控
fifo_full
和fifo_empty
信号,动态调整数据流速率。
- 选择较大的突发长度(
总结
AXI Virtual FIFO Controller IP(PG038)是一款高效的互连基础架构软核,支持通过 AXI4 和 AXI4-Stream 协议利用外部 DRAM 实现多通道虚拟 FIFO 存储。其多通道支持、大容量缓冲和高性能仲裁使其成为信号处理、视频流传输和网络数据包处理的理想选择,特别适合 BRAM 资源有限的小型 FPGA 和复杂 SoC 系统。
用户在配置时需注意通道数量、内存分配和 TKEEP
/TLAST
管理,合理优化突发长度和时钟设置,并通过仿真验证数据流和仲裁性能。结合 Vivado 工具、MIG 控制器和 ILA 调试,AXI Virtual FIFO Controller 可显著简化大容量 FIFO 设计,提高系统性能。
FPGA设计工具推荐
-
SZ901:
SZ901 是一款基于XVC协议的FPGA网络下载器。- 最高支持53M
- 支持4路JTAG独立使用
- 支持端口合并
- 支持国产FLASH烧写
- 下载器无限扩展
- 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!
-
SZ501(PRO_A7):
- SZ501 是一款适合初学者FPGA开发板,包含低速高速接口!
- 双网口(RGMII)
- 双SFP+
- DDR
- UART
- IIC