c++ - AXI4 Streaming 接口(interface) : how to manage Floating Point array in HLS for generating HW accelerators and connect them, 在 RTL 项目中安全吗?

标签 c++ interface floating-point streaming vivado-hls

最后我想做的是在Vivado Design Suite中使用单精度 float 组的流接口(interface)来构建硬件加速器。 HLS 用户指南 UG902表明可以使用不同的接口(interface)创建硬件加速器(从 C、C++、SystemC、OpenCL 代码开始)。

如果您想使用 AXI4 流接口(interface),HLS 会合成信号 TREADY 和 TVALID,但不会合成将生成的 RTL 接口(interface)连接到 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 中使用 float 据处理和管理流接口(interface)而不会遇到这两个问题?

最佳答案

对我来说,解决该问题的最简单方法是声明您自己的结构数据类型,而不使用您上面提到的库。默认情况下,VivadoHLS 使用信号 TDATA、TVALID 和 TREADY 实现 AXIS 接口(interface)。如果你还需要 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];
        }
     }

如果你这样做,综合后你会得到这个结果: enter image description here

为了避免错误你必须注意: 无论何时使用流接口(interface)的数据,都应该小心管理接口(interface)的其余信号。

关于c++ - AXI4 Streaming 接口(interface) : how to manage Floating Point array in HLS for generating HW accelerators and connect them, 在 RTL 项目中安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38264547/

相关文章:

serialization - 如何找到最简单的人类可读的浮点字符串,该字符串在转换回浮点时会产生相同的字节?

c++ - 学习 C++ : why is this illegal?

C# - 如何正确使用接口(interface)的实现

c++ - 从接口(interface)和实现 C++ 继承

c++ - 隐式转换整数计算以在 C++ 中 float

c - C中的 float 与小数

c++ - 使用外部库推送 QT Project GIT

c++ - 如何隐藏来自外部库的编译警告

c++ - 我的 Prim 算法 (MST) 在矩阵中的运行速度比在列表中快得多

java - 如何创建一个可以存储队列或堆栈的变量?