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