Xilinx FPGA AXI4-Stream 使用文档
1. 概述
AXI4-Stream(Advanced eXtensible Interface 4 Stream)是 ARM 公司 AMBA 协议中的一种面向流式数据传输的协议,广泛应用于 Xilinx FPGA 中,用于视频、音频、DMA 数据流等连续数据处理场景。本文档详细介绍 AXI4-Stream 协议的使用,涵盖协议概述、信号描述、设计流程、Vivado 相关 IP 核及示例代码,仅聚焦 AXI4-Stream。
2. AXI4-Stream 协议简介
AXI4-Stream 是一种无地址通道的协议,专为高效的点对点数据流传输设计。它不涉及存储器映射,直接传输数据包,适用于数据流处理。
2.1 AXI4-Stream 关键特性
- 单一数据通道:仅包含数据传输通道,无需地址通道,简化设计。
- 灵活数据宽度:支持任意字节宽度的 TDATA(如8位、32位、64位)。
- 握手机制:基于 TVALID/TREADY 握手协议,支持背压控制。
- 数据包控制:通过 TLAST 标记数据包结束,TUSER 和 TKEEP 提供额外控制。
- 高吞吐量:支持连续数据流传输,适合高带宽应用。
3. AXI4-Stream 接口信号描述
以下为 AXI4-Stream 协议的主要信号描述:
信号名 | 方向 | 描述 |
---|---|---|
ACLK | 输入 | 全局时钟信号,所有信号同步于此。 |
ARESETN | 输入 | 全局复位信号,低电平有效。 |
TDATA | 主->从 | 数据信号,承载传输的数据,宽度可配置(如8位、32位、64位等)。 |
TVALID | 主->从 | 数据有效信号,表示 TDATA 和其他信号有效。 |
TREADY | 从->主 | 数据就绪信号,表示从设备准备好接收数据。 |
TLAST | 主->从 | 数据包结束信号,置位表示当前数据是数据包的最后一个传输。 |
TSTRB | 主->从 | 字节选通信号,指示 TDATA 中哪些字节有效(每位对应一个字节)。 |
TKEEP | 主->从 | 字节保持信号,通常与 TLAST 配合使用,指示有效字节(常与 TSTRB 相同)。 |
TUSER | 主->从 | 用户自定义信号,用于传输额外控制信息(如帧同步、通道ID)。 |
注意:
- TSTRB 和 TKEEP 通常在高级应用中使用,简单设计可忽略。
- TUSER 的宽度和含义由用户定义,需与上下游设备协商。
4. Xilinx FPGA 中的 AXI4-Stream 设计流程
在 Xilinx FPGA 中使用 AXI4-Stream 协议通常包括以下步骤:
4.1 需求分析
- 确定数据宽度(TDATA,如32位、64位)。
- 确定数据包结构(是否需要 TLAST、TUSER)。
- 分析吞吐量需求,确保时钟频率和数据宽度匹配。
- 确定主从角色(数据源为 Master,数据接收端为 Slave)。
4.2 使用 Vivado IP 核
Vivado 提供多个 AXI4-Stream 相关 IP 核,简化设计流程。以下为常用 IP 核:
-
AXI4-Stream Interconnect (PG035):
- 功能:连接多个 AXI4-Stream 主从设备,支持数据路由、时钟域转换。
- 配置:支持1到16个主/从接口,数据宽度8/16/32/64/128位等。
- 用途:构建复杂的数据流处理链,如视频处理流水线。
-
AXI DMA (PG021):
- 功能:支持 AXI4-Stream 接口,用于高效数据搬运。
- 配置:支持 Scatter-Gather 模式,数据宽度32/64/128位。
- 用途:处理器与 PL 间的数据流传输,如网络数据包处理。
-
AXI4-Stream Data FIFO (PG080):
- 功能:提供 AXI4-Stream 数据缓冲,支持异步时钟域。
- 配置:支持深度配置、数据宽度8/16/32/64位等。
- 用途:数据流平滑处理,解决背压问题。
-
AXI4-Stream Video IP (如 Video Processing Subsystem, PG231):
- 功能:处理视频流数据,支持 AXI4-Stream 接口。
- 配置:支持分辨率、帧率、像素格式等。
- 用途:视频采集、处理和显示。
-
AXI Verification IP (PG267):
- 功能:提供 AXI4-Stream 协议仿真验证工具,支持主/从/监控模式。
- 配置:可模拟 AXI4-Stream 主从设备,检查协议合规性。
- 用途:验证自定义 AXI4-Stream IP 的正确性。
在 Vivado 中:
- 打开 IP Catalog,搜索“AXI Stream”。
- 选择所需 IP 核,配置参数(如数据宽度、TUSER 宽度、时钟域)。
- 生成 IP 核并集成到 Block Design 中。
4.3 自定义 AXI4-Stream IP 设计
若现有 IP 核无法满足需求,可通过以下方式开发自定义 AXI4-Stream IP:
-
Vivado IP Packager:
- 创建新 IP,定义 AXI4-Stream 主或从接口。
- 配置接口参数(如 TDATA 宽度、TUSER 宽度)。
- 打包为可复用 IP 核。
-
Verilog/VHDL 实现:
- 编写 AXI4-Stream 主或从设备逻辑,遵循 TVALID/TREADY 握手协议。
- 实现数据包控制逻辑,处理 TLAST 和 TUSER。
-
验证:
- 使用 AXI Verification IP(AXI VIP)进行仿真。
- 检查协议时序、TLAST 标记和数据完整性。
4.4 时序设计
- 所有信号需与 ACLK 同步。
- 使用 ARESETN 进行复位初始化,确保复位后信号处于已知状态。
- 遵循 TVALID/TREADY 握手规则:TVALID 信号置位后需保持,直到 TREADY 置位完成握手。
4.5 调试
- 使用 Vivado ILA(Integrated Logic Analyzer)捕获 AXI4-Stream 信号。
- 检查 TVALID/TREADY 握手信号、TLAST 标记和 TDATA 内容。
- 验证数据包完整性、背压处理和 TUSER 信号(若使用)。
5. 示例:AXI4-Stream 从设备设计
以下为一个简单的 AXI4-Stream 从设备 Verilog 代码,支持接收数据流并存储到寄存器。
module axi4_stream_slave #(
parameter C_S_AXIS_DATA_WIDTH = 32,
parameter C_S_AXIS_TUSER_WIDTH = 1
) (
// AXI4-Stream 接口信号
input wire s_axis_aclk,
input wire s_axis_aresetn,
input wire [C_S_AXIS_DATA_WIDTH-1:0] s_axis_tdata,
input wire s_axis_tvalid,
output wire s_axis_tready,
input wire s_axis_tlast,
input wire [C_S_AXIS_TUSER_WIDTH-1:0] s_axis_tuser
);
// 内部存储器(模拟数据接收)
reg [C_S_AXIS_DATA_WIDTH-1:0] data_buffer [0:15];
reg [3:0] buffer_index;
reg tready;
// TREADY 信号
assign s_axis_tready = tready;
always @(posedge s_axis_aclk or negedge s_axis_aresetn) begin
if (!s_axis_aresetn) begin
tready <= 1'b0;
buffer_index <= 4'b0;
end else begin
// 模拟背压,随机置位 TREADY
tready <= (buffer_index < 15); // 缓冲区未满时置位
if (s_axis_tvalid && tready) begin
data_buffer[buffer_index] <= s_axis_tdata;
if (s_axis_tlast) begin
buffer_index <= 4'b0; // 数据包结束,重置索引
end else if (buffer_index < 15) begin
buffer_index <= buffer_index + 1;
end
end
end
end
endmodule
5.1 示例说明
- 该模块实现了一个 AXI4-Stream 从设备,接收数据流并存储到16个32位寄存器。
- 数据宽度32位,TUSER 宽度1位(未使用)。
- 遵循 TVALID/TREADY 握手协议,支持 TLAST 标记数据包结束。
- 模拟背压,通过缓冲区满状态控制 TREADY。
- 可通过 Vivado IP Packager 打包为 IP 核。
6. 注意事项
-
时钟与复位:
- 确保所有信号与 ACLK 同步。
- 使用 ARESETN 初始化信号状态。
-
握手协议:
- TVALID 信号需在 TREADY 之前或同时置位,且保持直到握手完成。
- 确保 TREADY 及时响应,避免数据丢失或死锁。
-
数据包控制:
- 正确处理 TLAST,确保数据包边界清晰。
- 若使用 TUSER,需明确其定义并与上下游一致。
-
背压处理:
- 使用 FIFO(如 AXI4-Stream Data FIFO)处理下游背压。
- 避免因 TREADY 长时间为低导致数据流阻塞。
-
性能优化:
- 选择合适的 TDATA 宽度,匹配带宽需求。
- 使用 AXI4-Stream Interconnect 优化多路数据流。
-
调试与验证:
- 使用 AXI VIP 验证协议合规性。
- 通过 ILA 检查握手时序、TLAST 和 TDATA 内容。
7. 设计工具推荐
- SZ901:
SZ901 是一款基于XVC协议的FPGA网络下载器。- 最高支持53M
- 支持4路JTAG独立使用
- 支持端口合并
- 支持国产FLASH烧写
- 下载器无限扩展
- 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!