AXI4 流接口:如何在 HLS 中管理浮点数组以生成硬件加速器并在 RTL 项目中安全地连接它们?
AXI4 Streaming interface: how to manage Floating Point array in HLS for generating HW accelerators and connect them, safely, in an RTL project?
最后我想做的是在Vivado Design Suite中使用单精度浮点数组的流接口来构建硬件加速器。 HLS 用户指南 UG902 表明可以使用不同的接口创建硬件加速器(从 C、C++、SystemC、OpenCL 代码开始)。
如果您想使用 AXI4 流媒体接口,HLS 会合成信号 TREADY 和 TVALID,但不会合成将生成的 RTL 接口连接到 Zynq 处理系统(在我的例子中是 ARM9 内核)所需的信号 TLAST。
为了解决这个问题,Xilinx 给了你使用这个库的可能性
#include "ap_axi_sdata.h"
里面有结构-模板:
#include "ap_int.h"
template<int D,int U,int TI,int TD>
struct ap_axis{
ap_int<D> data;
ap_uint<D/8> keep;
ap_uint<D/8> strb;
ap_uint<U> user;
ap_uint<1> last;
ap_uint<TI> id;
ap_uint<TD> dest;
};
我有两个问题:
- 如果我只想使用 TLAST 而不想使用其他,我尝试将 U、TI 和 TD 设置为零,但出现错误。
- 如果我想使用 'float' 而不是 'ap_int' 并且我尝试在模板中更改它,我会收到另一个错误。
如何处理和管理带有浮点数据的 HLS 中的流接口而不会遇到这两个问题?
对我来说,解决该问题的最简单方法是声明您自己的结构数据类型,而不使用您上面提到的库。默认情况下,VivadoHLS 使用信号 TDATA、TVALID 和 TREADY 实现 AXIS 接口。如果你还需要 TLAST 和单精度单点数据,你应该声明你自己的数据类型,它应该是这样的:
struct my_data{
float data;
bool last;
};
我可以举个例子告诉你应该如何使用它:
void my_function(my_data input[25], my_data output[25])
{
#pragma HLS INTERFACE axis port=output
#pragma HLS INTERFACE axis port=input
#pragma HLS INTERFACE s_axilite port=return
float tmp_data;
float tmp_last;
int k=0;
for(k=0;k<25;k++)
{
tmp_data[k] = input[k].data;
tmp_last[k] = input[k].last;
}
for(k=0;k<25;k++)
{
output[k].data = tmp_data[k];
output[k].last = tmp_last[k];
}
}
如果你这样做,综合后你会得到这个结果:
为了避免错误您必须注意:
无论何时使用流接口的数据,都应该小心管理接口的其余信号。
最后我想做的是在Vivado Design Suite中使用单精度浮点数组的流接口来构建硬件加速器。 HLS 用户指南 UG902 表明可以使用不同的接口创建硬件加速器(从 C、C++、SystemC、OpenCL 代码开始)。
如果您想使用 AXI4 流媒体接口,HLS 会合成信号 TREADY 和 TVALID,但不会合成将生成的 RTL 接口连接到 Zynq 处理系统(在我的例子中是 ARM9 内核)所需的信号 TLAST。 为了解决这个问题,Xilinx 给了你使用这个库的可能性
#include "ap_axi_sdata.h"
里面有结构-模板:
#include "ap_int.h"
template<int D,int U,int TI,int TD>
struct ap_axis{
ap_int<D> data;
ap_uint<D/8> keep;
ap_uint<D/8> strb;
ap_uint<U> user;
ap_uint<1> last;
ap_uint<TI> id;
ap_uint<TD> dest;
};
我有两个问题:
- 如果我只想使用 TLAST 而不想使用其他,我尝试将 U、TI 和 TD 设置为零,但出现错误。
- 如果我想使用 'float' 而不是 'ap_int' 并且我尝试在模板中更改它,我会收到另一个错误。
如何处理和管理带有浮点数据的 HLS 中的流接口而不会遇到这两个问题?
对我来说,解决该问题的最简单方法是声明您自己的结构数据类型,而不使用您上面提到的库。默认情况下,VivadoHLS 使用信号 TDATA、TVALID 和 TREADY 实现 AXIS 接口。如果你还需要 TLAST 和单精度单点数据,你应该声明你自己的数据类型,它应该是这样的:
struct my_data{
float data;
bool last;
};
我可以举个例子告诉你应该如何使用它:
void my_function(my_data input[25], my_data output[25])
{
#pragma HLS INTERFACE axis port=output
#pragma HLS INTERFACE axis port=input
#pragma HLS INTERFACE s_axilite port=return
float tmp_data;
float tmp_last;
int k=0;
for(k=0;k<25;k++)
{
tmp_data[k] = input[k].data;
tmp_last[k] = input[k].last;
}
for(k=0;k<25;k++)
{
output[k].data = tmp_data[k];
output[k].last = tmp_last[k];
}
}
如果你这样做,综合后你会得到这个结果:
为了避免错误您必须注意: 无论何时使用流接口的数据,都应该小心管理接口的其余信号。