zl程序教程

您现在的位置是:首页 >  Java

当前栏目

如何在HLS中使用AXI4-Stream接口

2023-02-18 16:37:38 时间

AXI4-Stream接口在进行数据传输时是顺序传输的,类似于FIFO,先进先出,这意味着需要映射为AXI4-Stream接口的函数形参只能被读取或只能被写入(赋值)。同时,AXI4-Stream传输数据的位宽是按Byte(字节)对其的,这意味着如果数据位宽不是8的整数倍,那么就需要对数据进行扩展,类如,若数据是12-bit,就需要将其扩展为16-bit,具体是高4位补零还是符号位扩展取决于传输数据是无符号数还是有符号数。此外,传输数据的最大位宽是4096-bit。再来看一下AXI4-Stream是如何工作的。如下图所示。Producer和Consumer之间只有数据通道TDATA和其他握手信号如TREADY、TLAST、TVALID。其中TVALID为高表明Producer发送的数据有效,TLAST为高时表明此时发送的是最后一笔数据,TREADY为高时表明Consumer可以接收数据。

注:既然是将函数形参设置为AXI4-Stream接口,这就要求该函数必须的待综合的顶层函数。

如果需要使用AXI4-Stream接口,就不得不用Vitis HLS的库HLS::stream。Vitis HLS提供了两种方式用于将形参映射为AXI4-Stream接口。第一种是通过Pragma INTERFACE设置,此时需要在C++代码里使用HLS Stream库,如下所示。

在使用Pragma INTERFACE时,Vitis HLS提供了register_mode,如上图所示,共4个可选值。其中Forward是将TDATA和TVALID使用寄存器输出;Reverse只把TREADY使用寄存器输出;Both则是将TDATA/TVALID和TREADY都使用寄存器输出;而Off则是关闭寄存器输出功能。Xilinx建议至少保证一个方向是寄存器输出即可以选择Forward或Reverse,但不要选择Off。

第二种方式较为直接,需用用到axis或axiu数据类型,前者针对有符号数,后者针对无符号数。两者军需添加头文件ap_axi_sdata.h。我们通过一个案例进行说明,如下图所示。这里注意代码第20行和第21行。第20行定义了数据类型为ap_int<32>,第21行定义了axis类型,其中数据类型为ap_int<32>,其余三个参数依次对应TUSER、TID和TDEST的位宽。这里为0,表明设计不需要这三个辅助信号。使用这种方式就不需要再通过Pragma INTERFACE指定其接口类型了。

Copyright @ FPGA技术驿站

转载事宜请私信 | 获得授权后方可转载