【问题标题】:How to transfer part of a Xilinx HLS stream to another function?如何将 Xilinx HLS 流的一部分传输到另一个函数?
【发布时间】:2021-03-29 10:04:22
【问题描述】:

我有两个变量:

void func1(hls::stream<ap_axiu<8,1,1,1>> &a);
void func2(hls::stream<ap_uint<8>> &b);

其中ap_axiu定义为:

template<int D,int U,int TI,int TD>
  struct ap_axiu{
    ap_uint<D>       data;
    ap_uint<(D+7)/8> keep;
    ap_uint<(D+7)/8> strb;
    ap_uint<U>       user;
    ap_uint<1>       last;
    ap_uint<TI>      id;
    ap_uint<TD>      dest;
  };

我想在func1中调用func2,使用func1的参数a的数据(见ap_axiu的定义)。所以func 看起来像这样:

void func1(hls::stream<ap_axiu<8,1,1,1>> &a) {
   func2(???);
}

其中??? 应该是变量hls::stream&lt;ap_axiu&lt;8,1,1,1&gt;&gt; aap_uint&lt;D&gt; data 部分,被hls::stream&lt; &gt; 包围。

如何在 C++ 中做到这一点?我对模板没有太多经验,在 Google 上也找不到。

【问题讨论】:

标签: c++ templates xilinx vivado-hls


【解决方案1】:

试试这个:

void func1(hls::stream<ap_axiu<8,1,1,1>> a)
{
    ap_axiu<8,1,1,1> input = a.read();
    hls::stream<ap_uint<8>> intermediate;
    intermediate.write(input.data);
    func2(intermediate);
}

想法是从a 读取整个结构并将您关心的一个字段推送到intermediate,以便您可以调用func2

这假设您只想将单个元素从 func1 传输到 func2。一个流可能包含许多元素,在这种情况下,您可能需要添加一个循环来读取和写入多个值。

【讨论】:

  • 我忘了说 a 和 b 既可以读也可以写。我在原始帖子中为 a 和 b 变量添加了参考符号。将其存储在中间变量中是行不通的,因为我需要传输大量数据并且没有足够的资源可以在本地存储它们。
  • 参考符号不会有任何区别:上面的解决方案是**唯一可能的方式**。毕竟,您正在合成一个 FIFO(hls::stream 类),根据定义,FIFO 有一个生产者端和一个消费者端。在实践中,您不能使用同一个流来读取和写入您的 IP:您需要多一个参数,以便一个流仅用于读取,而另一个流仅用于写入。如果您确实需要在端口(或资源)方面保持短缺,请改用 BRAM 或 AXI 接口。
猜你喜欢
  • 2019-08-11
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2017-03-12
  • 1970-01-01
相关资源
最近更新 更多