Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug

Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)

为便于说明,我们用一个较为简单的算法——累加运算为例。假设每帧数据长度为4,累加运算就是求取这4个数据的和,如下图所示。不同颜色代表不同帧的数据。可以发现数据是顺序流动的,同样累加器访问(读取)数据的方向也是顺序进行的。这符合AXI4 Stream接口的要求。
图片[1]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug

方式1:直接采用axis模板

Vitis HLS提供了axis模板,如下图代码片段第13行和第14行所示。axis要求第一个参数为数据类型,如这里的din_t,注意这里din_t是通过#define定义的,而不能用typedef定义,读者可思考一下其中的原因。axis2至第4个参数分别对应TUSER/TID/TDEST的位宽。在此基础上,定义stream,如代码第16和第17行所示。

图片[2]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
接下来我们给出算法的具体描述,如下图所示。这里分别定义了两个axis对象,如代码第4行和第5行所示。整体思路是将累加器的初始值设置为每帧数据的第一个数据而不是0,之后循环累加。循环条件由信号TLAST控制。这里TLAST是通过axis对像.last实现的,如代码第20行所示。这需要读者对AXI4 Stream接口有所了解。一旦检测到TLAST,说明该帧数据的最后一个数据到来,此时执行加法后即可将结果写入输出数据流。

图片[3]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug

尽管这里已经明确指了定数据访问方式为AXI4 Stream,但仍然要通过Interface将其指定为axis接口,如下图所示,如果不指定Interface类型,Vitis HLSC综合时会报错。

图片[4]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
C综合后的报告中可以看到接口类型,如下图所示。
图片[5]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
C/RTL的协同仿真波形我们可以进一步理解AXI4 Stream的接口时序。
图片[6]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
说明:axis要求数据为有符号数,对于无符号数,要用axiu。同时需要添加头文件
#include <ap_axi_sdata.h>
#include <hls_stream.h>
方式2:采用ap_axisap_axiu,其中前者对应有符号数,后者对应无符号数。
不同于axisap_axisap_axiu的第一个参数为数据位宽,如下图所示代码片段。与方式1类似,也要定义stream类型,如代码第16行和第17行所示。具体的累加运算描述与方式1一致,这里不再给出。同样,需要通过pragma Interface指定接口为axis,否则工具会报错。
图片[7]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
对于ap_axisap_axiu,由于模板的第一个参数是数据位宽,这意味着我们可以把相关数据按位拼接成为一个更大位宽的数据进行传输,读取后再通过位宽选取获得相应的数据,如下图所示代码片段第35行所示。
图片[8]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(1)-Xilinx-AMD社区-FPGA CPLD-ChipDebug

 

请登录后发表评论

    没有回复内容