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

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

方式3:借助Stream实现AXI4 Stream接口
Vitis HLS专门提供了stream库,若函数形参为stream类型,那么默认情形下Vitis HLS会将其映射为ap_fifo接口,但也可以通过pragma interface将其指定为axis接口。仍以上一篇文章所阐述的累加器为例,如下图所示。代码第13行定义了输入数据结构体,该结构体内包含两个元素,一个为实际传输的数据,另一个则是模拟AXI4 StreamTLAST信号。代码第19行定义了输出数据结构体。之所以有两个结构体是因为输入和输出数据位宽是不同的。
图片[1]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(2)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
在此基础上,我们可以用如下C++代码描述累加器,这里用TLAST来判断一帧数据是否传输完毕(Vitis HLS推荐的方式),而没有用empty信号判断。
图片[2]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(2)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
由于data8位)和last1位)共同构成了输入数据(9位),这样AXI4 Stream实际传输位宽为16位,如下图仿真波形所示。图中din_TDATA即为输入数据,可以看到其位宽为16,取其中的低8位构成真实数据,第8位(最低位为第0位)为TLAST
图片[3]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(2)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
方式4:借助数组实现AXI4 Stream接口
采用数组描述累加器,相比于前面三种方法都更为简单,只需确定数组大小(维度)、输入/输出数据位宽即可,具体描述如下图所示代码片段。
图片[4]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(2)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
这里不对代码做过多解释,将把重点放在如何使其映射为AXI4 Stream接口。首先可以确定的是访问数组的方式是顺序进行的,这可从代码第4行和第8行确定。满足这个前提条件,我们就可以将其设置为AXI4 Stream接口,如下图所示。
图片[5]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(2)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
不同于前面三种方法,该方法不会生成额外的TLAST信号,这在综合后的报告接口部分可以看到,在C/RTL协同仿真的波形中也可看到,如下图所示。
图片[6]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(2)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
图片[7]-Xilinx FPGA开发工具HLS四种方式推断出AXI4 Stream接口(2)-Xilinx-AMD社区-FPGA CPLD-ChipDebug
比较这四种方式不难看出:
1)采用axisap_axis模板,在定义接口类型时较为繁琐:先要定义数据类型,再确定axis,然后将其封装为Stream,算法描述时需要借助readwriteStream上读取数据或将数据写入Stream。同时,需要通过pragma Interface指定接口类型为AXI4 Stream,否则会报错。另外无需额外定义TLAST信号。此方法仅适用于顶层函数。
2)采用Stream库时,只需定义数据类型即可。同样要借助readwriteStream上读取数据或将数据写入Stream。最好自定义TLAST信号,尽管这不是必须的,但是Xilinx建议的代码风格。Stream默认使用ap_fifo接口。因此,需要通过pragma Interface将其指定为AXI4 Stream接口。
3)采用数组时,描述起来更为方便简洁。但数组默认采用ap_memory接口,故也要通过pragma Interface将接口类型设定为AXI4 Stream接口。

 

请登录后发表评论

    没有回复内容