0

我正在尝试编写一个使用 AXI4 流协议与上一个和下一个模块进行通信的模块。模块使用以下通信信号:

  1. TDATA,即 16 位,
  2. TKEEP,即 2 位,
  3. TUSER,即 1 位,
  4. TVALID,即 1 位,
  5. TREADY,1 位,指向前一个模块,以及
  6. TLAST,即 1 位。

这些都需要是单独的信号。我尝试使用以下代码实现它:

#include "core.h"

void core_module(hls::stream<ap_axis_str> &input_stream, hls::stream<ap_axis_str> &output_stream){
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE axis port=output_stream
#pragma HLS INTERFACE s_axilite port=return bundle=CTRL
    ap_axis_str strm_val_in;
    ap_axis_str strm_val_out;
    for (int i = 0; i<NDATA; i++){
        strm_val_in = input_stream.read();
        strm_val_out.data = strm_val_in.data * 2;
        strm_val_out.keep = 3;
        strm_val_out.valid = 1;
        strm_val_in.ready = 1;
        strm_val_out.user = ((i%2)==0);
        strm_val_out.last = (i == NDATA-1) ? 1:0;
        output_stream.write(strm_val_out);
    }
}

头文件在哪里

#ifndef core_h
#define core_h

#include <ap_int.h>
#include <ap_axi_sdata.h>
#include <hls_stream.h>

typedef ap_uint<16> word;

#define NDATA 10

struct ap_axis_str {
    word    data;
    ap_uint<2>    keep;
    bool    user;
    bool    last;
    bool    ready;
    bool    valid;
};

void core_module(hls::stream<ap_axis_str> &input_stream, hls::stream<ap_axis_str> &output_stream);

#endif

问题是这并没有分离信号。当我合成它并在联合仿真中运行它时(给它从 0 到 9 的值),即使结果是我所期望的,产生的波形也是这样的: 在此图像中,您可以看到输入(底部三个信号)和输出(顶部三个信号)。 不要以为 TREADY 正朝着相反的方向发展。

我们可以看到 TREADY、TVALID 和 TDATA 存在,但其他 3 不存在。此外,查看 TDATA 的内容(由于某种原因是 64 位),我们注意到它们包含所有信号。它们是:

0001000001030000,
0001000000030002,
0001000001030004,
0001000000030006,
...
000100000003000c, (they are in base 16)
0001000001030010,
0001000100030012.

从中我们可以看出,位置 12 中的 3 可能是 TKEEP,位置 8 中仅出现在最后一种情况下的 1 可能是 TUSER,最后 4 位是应该的是 TDATA 等。此外,程序在未准备好接收数据时丢弃 TREADY,这是 TREADY 的本意,但我没有将它编程为以这种方式工作,这意味着它是自动生成的,并且可能有与我告诉它拥有的 TREADY 无关。

所以我的问题是:如何制作一个模块,为我们正在使用的 AXI4 协议版本发出正确的 6 个独立信号?

4

1 回答 1

0

好吧,根据Xilinx 文档

如果您指定hls::stream数据类型不是ap_axisor的对象ap_axiu,该工具将推断出没有 TLAST 信号或任何边通道信号的 AXI4-Stream 接口。AXI4-Stream 接口的这种实现消耗更少的设备资源,但无法查看流何时结束。

现在我已经用 导入了所需的模块#include <ap_axi_sdata.h>,我需要做的就是通过删除来实际使用它

struct ap_axis_str {
    word    data;
    ap_uint<2>    keep;
    bool    user;
    bool    last;
    bool    ready;
    bool    valid;
};

并将其替换为

typedef ap_axiu<16, 1, 0, 0> ap_axis_str;

此外,我需要删除手动控制 TREADY 和 TVALID 的尝试,因为这些都是自动完成的。

于 2021-10-25T12:20:30.883 回答