首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HLS:如何分离AXI4信号

HLS:如何分离AXI4信号
EN

Stack Overflow用户
提问于 2021-10-22 10:42:11
回答 1查看 528关注 0票数 0

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

  1. TDATA,16位,
  2. TKEEP,是2位,
  3. TUSER,1位,
  4. TVALID,1位,
  5. TREADY,它是1位,并指向前面的模块,以及
  6. 最后,这是1位。

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

代码语言:javascript
复制
#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);
    }
}

头文件的位置

代码语言:javascript
复制
#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、TVALID和TDATA存在,但其他3没有。此外,查看TDATA的内容(由于某种原因,它是64位),我们注意到它们包含所有的信号。它们如下:

代码语言:javascript
复制
0001000001030000,
0001000000030002,
0001000001030004,
0001000000030006,
...
000100000003000c, (they are in base 16)
0001000001030010,
0001000100030012.

从这里我们可以看到,位置12中的3很可能是TKEEP,而第8位置中的1只出现在最后一种情况下可能是TUSER,最后4位数字应该是TDATA,等等。另外,当程序还没有准备好接收数据时,这就是我想要的,但我并没有用这种方式来编程,这意味着它是自动生成的,而且可能与我告诉它的树无关。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-25 12:20:30

根据Xilinx文档的说法,

如果您指定的hls::stream对象的数据类型不是ap_axisap_axiu,则该工具将推断一个AXI4 4流接口,而不包含TLAST信号或任何侧通道信号。AXI4 4- stream接口的这种实现消耗了较少的设备资源,但没有提供流结束时的可见性。

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

代码语言:javascript
复制
struct ap_axis_str {
    word    data;
    ap_uint<2>    keep;
    bool    user;
    bool    last;
    bool    ready;
    bool    valid;
};

代之以

代码语言:javascript
复制
typedef ap_axiu<16, 1, 0, 0> ap_axis_str;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69675472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档