FPGA教程系列-Vivado AXI4-Stream接口解读
俗话说,纸上得来终觉浅,理论看了半天可能都觉不出来有什么难的,上次仿真了一下AXI,跟实际的不一样,但是总归是动手了,大概知道了一些,现在就返回来重新看一下AXI的理论知识。都是网络上的知识,如有雷同,纯属抄袭。
什么是AXI4?
AXI 表示 ++A++ dvanced e++X++ tensible ++I++nterface(高级可扩展接口),它是由 Arm 定义的接口协议,包含在"高级微控制器总线架构 AMBA"标准中。
AXI4 接口 (AMBA 4.0) 分 3 种类型:
- AXI4 (AXI4-Full):用于满足高性能存储器映射需求。
- AXI4-Lite:用于简单的低吞吐量存储器映射通信(例如,往来于状态寄存器的通信)。
- AXI4-Stream:用于高速流传输数据。
AXI-Stream
先从最简单的入手,接口如下:
| 类别 (Category) | 信号 (Signal) | 来源 (Source) | 描述 (Description) |
|---|---|---|---|
| 系统类 (System) | ACLK | Clock source | The global clock signal. All signals are sampled on the rising edge of ACLK. |
| ARESETn | Reset source | The global reset signal. ARESETn is active-LOW. | |
| 传输数据类 (Data Transfer) | TVALID | Master | TVALID indicates that the master is driving a valid transfer. A transfer takes place when both TVALID and TREADY are asserted. |
| TREADY | Slave | TREADY indicates that the slave can accept a transfer in the current cycle. | |
| TDATA[(8n-1):0] | Master | TDATA is the primary payload that is used to provide the data that is passing across the interface. The width of the data payload is an integer number of bytes. | |
| 数据修饰类 (Data Qualifier) | TSTRB[(n-1):0] | Master | TSTRB is the byte qualifier that indicates whether the content of the associated byte of TDATA is processed as a data byte or a position byte. |
| TKEEP[(n-1):0] | Master | TKEEP is the byte qualifier that indicates whether the content of the associated byte of TDATA is processed as part of the data stream. Associated bytes that have the TKEEP byte qualifier deasserted are null bytes and can be removed from the data stream. | |
| (边界信号) | TLAST | Master | TLAST indicates the boundary of a packet. |
| 传输修饰类 (Transfer Qualifier) | TID[(i-1):0] | Master | TID is the data stream identifier that indicates different streams of data. |
| TDEST[(d-1):0] | Master | TDEST provides routing information for the data stream. | |
| TUSER[(u-1):0] | Master | TUSER is user defined sideband information that can be transmitted alongside the data stream. |
AI生成了个分类,整上,有点错误,凑合看吧
系统类 (System Signals)
- ACLK (时钟源): 全局时钟信号。接口上所有的信号都在 ACLK 的上升沿进行采样。
- ARESETn (复位源): 全局复位信号。注意它后缀有个
n,表示低电平有效 (Active-LOW)。
传输数据类 (Data Transfer Signals)
这一类是核心的数据传输和握手信号。
-
TVALID (主机 Master 发出): 表示主机正在驱动有效的数据传输(即"我有数据要发")。
-
TREADY (从机 Slave 发出): 表示从机在当前周期可以接收数据(即"我准备好收了")。
- 核心机制: 只有当 TVALID 和 TREADY 同时为高时,数据传输才会真正发生(这是 AXI 协议著名的握手机制)。
-
TDATA (主机 Master 发出): 实际传输的数据载荷(Payload)。
-
TLAST (主机 Master 发出): 用于指示一个数据包(Packet)的边界,通常拉高表示这是当前包的最后一个数据传输。
数据修饰类 (Data Qualifiers)
这一类用于对 TDATA 中的字节进行更细致的说明(例如数据位宽未填满时)。
- TSTRB (主机 Master 发出): 字节选通信号。用于指示 TDATA 中的字节是作为数据字节处理,还是作为位置字节处理。
- TKEEP (主机 Master 发出): 字节保持信号。用于指示 TDATA 中的哪些字节是有效数据流的一部分。如果 TKEEP 对应的位为低,说明该字节是空字节(Null byte),可以被移除。
传输修饰类 (Sideband/Routing Signals)
这一类是辅助信号,用于复杂的流处理或路由。
- TID (主机 Master 发出): 数据流标识符。用来区分不同的数据流。
- TDEST (主机 Master 发出): 目的地标识。提供数据流的路由信息(发给谁)。
- TUSER (主机 Master 发出): 用户定义信号。这是一个"万能"的侧带信号,协议没有规定具体用途,用户可以利用它传输任何自定义的辅助信息。
握手
总结起来,就是一句话:只有当 TVALID 和 TREADY 同时为高时,数据传输才会真正发生。比较清楚了,再结合图看一下,自己理解一下。
、


修饰类
在 AXI4-Stream 协议中,数据修饰类信号 (主要是 TKEEP 和 TSTRB)的核心作用是告诉接收端:"总线上这排数据里,哪些字节是真正有用的,哪些只是为了凑数的,哪些甚至连位置都不占。" 虽然在很多简单的 AXI Stream IP中,大家往往忽略这两个信号(默认全设为 1),但在处理非对齐传输 、数据包结尾 或稀疏数据时,它们至关重要。
通过两个信号来区分三种字节:
-
TKEEP (Keep) :决定这个字节是否存在于流中。 -
TSTRB (Strobe) :决定这个存在的字节是否是有效数据。
以下通过具体的例子来解释这三种字节和信号的用途。
逻辑关系表
| TKEEP | TSTRB | 字节类型 | 含义 |
|---|---|---|---|
| 0 | X | Null Byte (空字节) | 这个字节直接被丢弃,不属于数据包的一部分。 |
| 1 | 0 | Position Byte (占位字节) | 这个字节存在,占据一个位置,但内容无效(相当于 padding)。 |
| 1 | 1 | Data Byte (数据字节) | 这个字节是有效的 payload。 |
场景一:处理数据包的"尾巴" (最常用:TKEEP 的作用)
假设总线位宽是 32-bit (4字节) ,要发送一个总长度为 6字节 的数据包(例如 0x11, 0x22, 0x33, 0x44, 0x55, 0x66)。
由于总线一次传 4 字节,必须分两个周期传:
- 第一个周期 :传
11 22 33 44(填满了)。 - 第二个周期 :还剩
55 66,但是总线宽是 4 字节,剩下两个位置怎么办?
这时就要用到 Null Byte (TKEEP=0):
Cycle 1:
TDATA:0x44332211(假设小端序)TKEEP:4'b1111(四个字节都属于这个包)TSTRB:4'b1111(都是有效数据)
Cycle 2 (TLAST=1) :
TDATA:0xXX_XX_66_55(高两字节是垃圾数据)TKEEP: 4'b0011 (二进制) -> 关键点!TSTRB:4'b0011
TKEEP 的高两位是 0,告诉接收端: "虽然总线上传了4个字节,但请无视高位那两个字节,它们不属于这个包。" 这就是 Null Byte 的作用------处理非整数倍位宽的数据对齐。
场景二:稀疏数据/对其填充 (TSTRB 的作用)
假设做一个图像处理模块,像素格式是 RGB (24-bit/3字节) ,但为了硬件处理方便,依然使用 32-bit (4字节) 的总线位宽。需要保证每个像素都对齐到 32-bit 的边界上。这意味着:每传 4 个字节,只有前 3 个字节是颜色,第 4 个字节是为了凑整对齐的"废数据"。
这时就要用到 Position Byte (TKEEP=1, TSTRB=0):
传输像素 1 (R=0xAA, G=0xBB, B=0xCC) :
TDATA:0x00_CC_BB_AA(最高字节 00 是凑数的)TKEEP:4'b1111(这 4 个字节物理上都属于传输流的一部分,不能删掉,否则后面的像素就错位了)。TSTRB: 4'b0111 (二进制) -> 关键点!
低 3 位是 1 (Data Byte):表示 AA, BB, CC 是有效颜色值。最高位是 0 (Position Byte):表示这个位置必须保留 (占据一个字节的空间),但是内容无效(不要把它当做颜色数据处理)。
如果不传 Position Byte 会怎样?
如果最高位设为 Null Byte (TKEEP=0111),接收端可能会把这个字节"抽掉",导致下一个像素的 R 分量紧贴着上一个像素的 B 分量,破坏了 32-bit 对齐结构。
场景三:部分写入 (Masking)
这在 AXI4-Stream 中较少见,但在由 AXI Stream 转换到 AXI Memory Mapped (如写入 DDR) 时非常重要。想往接收端的缓冲区写数据,但只想修改其中的某几个字节,不想覆盖其他字节。
传输:
TDATA:0x12_34_56_78TKEEP:4'b1111(位置都占着)TSTRB: 4'b1001
接收端只提取最高字节 0x12 和最低字节 0x78。中间的 0x34, 0x56 被 TSTRB=0 标记为无用。如果这是一个写入内存的操作,内存控制器会执行"读-改-写",只更新最高和最低字节,中间两个字节保持内存里原有的值不变。
总之,
- Data Byte (TKEEP=1, TSTRB=1) : "这是干货。" (最常用,绝大多数情况全是这个)
- Position Byte (TKEEP=1, TSTRB=0) : "这里占个座,但没人。" (用于保持数据对齐,例如 RGB 占 4 字节的例子)
- Null Byte (TKEEP=0, TSTRB=X) : "这里是空气。" (用于标记数据包的结束位置,处理尾部残余字节)
在很多简单的流式处理(如音频流、简单的数据采集)中,因为数据都是连续且填满的,所以通常把 TKEEP 和 TSTRB 都拉高(全 1),不进行复杂的修饰。但在视频处理、网络包处理(包长不固定)中,这两个信号必不可少。