如果设计需要串流接口,可首先定义和使用串流数据结构,例如,Vitis HLS 中的 hls::stream
。此简单对象可封装串流的要求,其串流接口则默认在 RTL 中作为 FIFO 来实现 (ap_fifo),但(可选)可作为握手接口 (ap_hs) 或 AXI4-Stream 接口 (axis) 来实现。请参阅 Github 上的 Vitis-HLS-Introductory-Examples/Interface/Streaming 以获取串流接口的不同示例。
如果通过接口编译指示模式选项指定 AXI4-Stream 接口 (axis),那么接口实现将通过定义 TDATA、TVALID 和 TREADY 信号来模仿 AXIS 接口的样式。
如需更正式的 AXIS 实现,那么 Vitis HLS 需使用特殊数据类型(ap_axi_sdata.h
中定义的 hls::axis
)来封装 AXI4-Stream 协议的要求,并实现此接口所需的特殊 RTL 信号。
AXI4-Stream 接口是作为 Vitis HLS 中的结构体类型来实现的,并且具有如下特征(在 ap_axi_sdata.h 中定义):
template <typename T, size_t WUser, size_t WId, size_t WDest> struct axis { .. };
其中:
-
T
- 要串流的数据类型。 提示: 可支持任意数据类型,包括
ap_fixed
。 -
WUser
- TUSER 信号的宽度
-
WId
- TID 信号的宽度
-
WDest
- TDest 信号的宽度
当串流数据类型 (T
) 为简单的整数类型时,有 2 种预定义的 AXI4-Stream 实现类型可用:
-
AXI4-Stream 类的有符号实现(或者使用
ap_axis<Wdata, WUser, WId, WDest>
则更简单)hls::axis<ap_int<WData>, WUser, WId, WDest>
-
AXI4-Stream 类的无符号实现(或者使用
ap_axiu<WData, WUser, WId, WDest>
则更简单)hls::axis<ap_uint<WData>, WUser, WId, WDest>
为 WUser
、WId
和 WDest
模板参数指定的值将控制 AXI4-Stream 接口中旁路信号的使用。
使用 hls::axis
类时,生成的 RTL 通常将包含实际数据信号 TDATA
,和以下额外信号:TVALID
、TREADY
、TKEEP
、TSTRB
、TLAST
、TUSER
、TID
和 TDEST
。
TVALID
、TREADY
和 TLAST
都是 AXI4-Stream 协议的必要控制信号。TKEEP
、TSTRB
、TUSER
、TID
和 TDEST
信号均为可选特殊信号,可用于围绕额外的簿记数据来传递。
WUser
、WId
和 WDest
设置为 0,那么在接口中生成的 RTL 将不包含可选 TUSER
、TID
和 TDEST
信号。