免责声明:
本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
前言
AXI-Stream (AXIS) 总线是 Xilinx 公司的高级可扩展接口 (AXI) 协议家族中的一种协议,专门用于数据流的传输。它是基于 AXI4 协议简化的版本,设计用于高效传输数据流,常见于高速数据流处理应用,例如视频处理、通信系统和信号处理等。
一、AXI-Stream 的特点
- 简化的信号线:AXIS 去掉了地址信号和控制信号,只保留了数据和有效信号,这样可以减少线路和复杂性。
- 无握手机制 :与传统的 AXI 总线不同,AXIS 没有明确的握手机制。数据流通过
TVALID
和TREADY
信号的配合来进行传输控制。 - 宽度可变:AXIS 支持不同位宽的数据传输,可以是 8 位、16 位、32 位或 64 位等,具体取决于系统的设计需求。
- 支持多通道:AXIS 可以支持多通道数据传输(TVLAST 和 TKEEP 信号),特别适用于视频和图像数据流,其中每个通道可能代表一个像素或一个颜色通道。
- 数据流传输:AXIS 设计用于传输连续的数据流,无需地址空间,可以更高效地处理连续数据的传输,如视频帧、音频流、网络数据包等。
二、AXI-Stream 的主要信号
- TVALID (Transmit Valid):发送端有效信号,当数据有效时,TVALID 被拉高。
- TREADY (Transmit Ready):接收端准备好信号,当接收端准备好接收数据时,TREADY 被拉高。
- TDATA (Transmit Data):传输的数据位线,包含实际的数据内容。
- TSTRB (Transmit Strobe):字节选通信号,指示哪些字节是有效的(通常用于部分字节有效的情况)。
- TLAST:指示数据流的结束,用于标识一个数据包或帧的结束。
- TID 和 TDEST:用于多路传输时标识数据流的 ID 和目标。
- TUSER:用户定义信号,可以携带用户自定义的控制信息。
三、编写建议
在设计 AXIS 音视频接口时,如果数据传输的宽度固定且全字节有效,可以忽略 TSTRB 和 TKEEP 信号。TLAST 信号用于标识每行数据的结束,而 TUSER 信号可以作为帧标志或携带其他附加信息,需确保其解码与使用的一致性。 为了简化读时序控制,建议使用 First-Word Fall-Through (FWFT) 模式的 FIFO 作为缓存空间。这不仅减少了读取延迟,还使得数据读取更加直观和高效。确保 FIFO 深度满足设计需求,以避免数据溢出或饥饿现象。
什么时候从FIFO中读数据?
javascript
assign rd_en = M_AXIS_TVALID && M_AXIS_TREADY;
什么时候产生TLAST?
使用计数器,当计数器到达行数据量 - 2 且M_AXIS_TVALID && M_AXIS_TREADY时,即可产生TLAST,当M_AXIS_TVALID && M_AXIS_TREADY握手完成时即可拉低TLAST
java
always@(posedge M_AXIS_ACLK)
if(!M_AXIS_ARESETN)
M_AXIS_TLAST <= 'd0;
else if(M_AXIS_TVALID && M_AXIS_TREADY)
if(cnt == h_num - 2)
M_AXIS_TLAST <= 'd1;
else
M_AXIS_TLAST <= 'd0;
else
M_AXIS_TLAST <= M_AXIS_TLAST;
什么时候拉低TUSER?
当一帧的第一次握手即可拉低TUSER,即:
javascript
M_AXIS_TVALID && M_AXIS_TREADY;