将AXI-STREAM协议分为两个部分进行讲解,以下是第一部分
AXI-STREAM
一、INTRO
1、信号线,后面会有,此处不再赘述
2、数据流
2.1 字节流
字节流是大量数据和空字节的传输。在每次 TVALID、TREADY 握手中,可以传输任意数量的数据字节。空字节没有任何意义,可以在流中插入或删除
2.2 连续对齐流
连续对齐流是传输多个数据字节,其中每个数据包没有位置或空字节。
3、连续非对齐流
连续未对齐流是传输多个数据字节,其中每个数据包的第一个数据字节和最后一个数据字节之间没有位置字节。
但是该形式的数据流可以在数据包的开头、结尾或同时在开头和结尾处具有任意数量的连续位置字节。
4、稀疏流(SPARSE)
稀疏流是传输多个数据字节和位置字节。所有数据和位置字节必须被维护并从源传输到目的地。稀疏流仍然是数据字节多。
二、接口信号
note:下面是一些信号位宽的index
n: 数据为位宽(byte)
i: 数据流标识符(TID)宽度,建议最大8位
d:数据流路由信息(TDEST)宽度,建议最大4bit
u:用户定义的边带信息(TUSER)宽度,建议接口宽度的整数倍
仅仅对特殊的信号做解释:
TSREB[(n-1):0]
/*master,字节限定符,指示 TDATA 相关字节的内容是否
被处理为数据字节或位置字节。*/
TKEEP[(n-1):0]
/*指代相关位置的数据是data还是null,tkeep拉高:data;tkeep拉低:null*/
TID 是数据流标识符,指示不同的数据流。
TDEST 提供数据流的路由信息。
TUSER 是用户定义的边带信息,可以与数据流一起传输。
2.2 信号传输
2.2.1 握手
TVALID与TREADY信号在传输发生时需要被置位,可以某一个信号先被置为在等待另一个信号,也可以同时置为。就像之前说的TVALID不能被动等待TREADY信号,且TVALID信号在置位后必须直到握手结束之前才能拉低。
从机可以等待TVALID信号后再置位对应的TREADY;
从机置位TREADY,可以在TVALID信号置位前拉低TREADY
-
握手例子1;TVALID before TREADY handshake
TVALID信号优先拉高
这里需要注意:一旦MASTER的TVALID拉高,来自MASTER的数据和控制信息必须保持不变,直到SLAVE的TREADY拉高。下图可见VALID信号和DATA是同时准备好的,从机READY信号由valid信号激活,此时从机要同步用缓冲区接收数据。
-
握手例子2;TREADY before TVALID handshake
仅表示从机主动拉高TREADY,但是主机的VALID不会依存
-
握手例子3;TVALID with TREADY handshake
2.3 数据信令 Data Signaling
本节介绍 AXI4-Stream 接口的数据信令要求。 TDATA 是 AXI4-Stream 接口的主要有效负载,用于将数据从源传输到目的地。
2.3.1 字节位置
数据流中总线的低位字节优先发出来,对于fully packed stream,可以使用以下方法确定给定字的位置:
序列字节数n,从0开始向上计数;
传输次数t,从0开始向上计数;
总线宽度w;
INT(X),向下取整;
传输次数t : t = INT(n/w);
byte position 的位置:b = n - (t*w);
byte position 的字节定位:TDATA[(8b+7):8b]
2.3.2 字节类型
AXI4-Stream协议中定义了三种字节类型
1、DATA BYTE:有效数据字节
2、Position BYTE : 位置字节必须从source到destination,必须在源和目标之间维护位置字节的数量以及流中位置字节的相对位置(相对于其他数据字节和位置字节)与位置字节关联的 TDATA 数据值不需要在源和目的地之间传输。
3、Null BYTE
互连不得修改流内数据字节或位置字节的数量或相对位置。允许互连从流中插入或删除空字节。
某些操作可能需要插入空字节,例如扩大到更宽的数据总线,其中没有足够的数据和位置字节来进行完整的数据宽度传输。
主组件和从组件不需要支持空字节,因此任何能够在流中插入空字节的互连也应该能够在流到达无法处理空字节的目的地之前删除它们。