1.接口描述
AXI-Stream Data FIFO接口与普通的FIFO方案基本差不多,只是写数据端为AXI-stream从接口,读书节端为AXI-stream主接口。
2.与普通FIFO的差异
相同点:二者都是先入先出,写入多少,读出多少。
不同点:AXI-Stream Data FIFO可以通过TLAST
信号指示数据节点,同时还可以通过TKEEP和TSTRB
信号指示读写数据各个字节的性质和有效性。
AXI-Stream Data FIFO的读写端口最少需要TDATA ,TVALID,TREADY
这三个信号,可选择的添加TKEEP,TLAST,TSTRB
信号,本文选择了TKEEP,TLAST
信号。单次传输字节数为4byte。
3.写接口信号分析
- 接口初始化状态
port | Value |
---|---|
TVALID | 1’b0 |
TKEEP | 4’b0000 |
TLAST | 1’b0 |
TDATA | 无关 |
TREADY | 1’b0 |
- 开始写入数据
如上图,外部的TVALID
信号拉高,FIFO接收到该信号之后将TREADY
信号拉高,同时TKEEP
信号各bit全部为1,表示各字节有效,完成握手,开始将数据写入FIFO中。其中还有TLAST
信号,该信号是用来区分数据段的,每段数据流的最后一个数据需要拉高,不限制数据流的长度,可以是一个数据,也可以是多个数据。 - 停止写入数据
外部的TVALID
信号拉低即可实现。 - 写满判定
TREADY
信号拉低。
4.读端口信号分析
- FIFO为空时
读端口信号如下
port | Value |
---|---|
TVALID | 1’b0 |
TKEEP | 4’b0000 |
TLAST | 1’b0 |
TDATA | 无关 |
TREADY | 1’b0 |
其中TKEEP
的所有位为0表示通过AXI-stream接口读出的所有字节数据无效。
FIFO不为空时
port | Value |
---|---|
TVALID | 1’b1 -> 1’b1 |
TKEEP | 4’b0000 -> 4’b1111 |
TLAST | 1’b0 |
TDATA | 读指针指向的FIFO数据 |
TREADY | 1’b0 |
其中TKEEP
的所有位由0变为1表示通过AXI-stream接口读出的所有字节数据有效。
TVALID
信号拉高,表示外部电路可以通过AXI-stream接口从FIFO中读出数据了。
读FIFO数据
port | Value |
---|---|
TVALID | 1’b1 -> 1’b0 |
TKEEP | 4’b1111 |
TLAST | 1’b0 |
TDATA | 读指针指向的FIFO数据 |
TREADY | 1’b0 -> 1’b1 |
5.一次完整的读写操作
- 写操作描述:
首先将TVALID
信号拉高,然后握手成功,写入5个数据,写入两次。第一次写入时,TKEEP=1
,也就是只有第一个字节数据有效,第二次是所有字节有效。 - 读操作描述:
可以发现,在写入第个数据之后,读端口的TKEEP
信号就变成了第一个数据对应的TKEEP
信号,同时TVALID
信号拉高。
在要读数据时,首先将TREADY
信号拉高,然后握手成功,连续读出数据,在读出第5个数据的时候,TLAST
信号拉高,也就是将第一次写入的数据全部读出来了,然后继续读出数据,到第10个数据时,TLAST
信号再次拉高,同时读端口的TVALID
信号变低了,也就是FIFO为空了。
总结:如果仅仅只有TDATA ,TVALID,TREADY
这三个信号,那么AXI-Stream Data FIFO与普通的FIFO完全一样。如果增加了TKEEP,TLAST,TSTRB
这三个信号,这些信号可以理解成单独写入了一个并行的FIFO中,写入的是什么样,读出的也是什么样。