HLS实现AXI4-Stream接口时如何拆分输出各独立信号
AXI4-Stream独立端口生成修正方案
问题根源
你的实现存在3个核心错误导致信号被打包进TDATA:
- 自定义的
ap_axis_str结构体没有遵循HLS的AXI-Stream接口定义规范,工具无法识别keep/user/last为副通道信号,默认将所有结构体字段作为TDATA的payload打包 - 你将握手信号
valid/ready放进了数据结构体中,这两类信号属于AXI-Stream流接口的握手控制信号,由HLS工具自动生成,不需要手动定义在数据结构内,手动赋值也不会生效 - 没有对自定义结构体添加打包指令,工具自动对齐到64bit位宽,最终生成了异常的64bit TDATA端口
修正方案
优先使用HLS官方提供的ap_axis模板(你已包含ap_axi_sdata.h头文件),无需自定义结构体,工具会自动识别并生成所有独立端口:
头文件修改
#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 // 模板参数:TDATA位宽16,TUSER位宽1,TID/TDEST位宽设为0(不使用) typedef ap_axis<16, 1, 0, 0> ap_axis_str; void core_module(hls::stream<ap_axis_str> &input_stream, hls::stream<ap_axis_str> &output_stream); #endif
源文件修改
#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(); // 仅需要赋值数据和副通道字段,valid/ready由工具自动控制 strm_val_out.data = strm_val_in.data * 2; strm_val_out.keep = 3; strm_val_out.user = ((i%2)==0); strm_val_out.last = (i == NDATA-1) ? 1:0; output_stream.write(strm_val_out); } }
可选:自定义结构体实现方案
如果你需要自定义结构体,需要移除结构体中的valid/ready字段,并添加数据打包指令:
struct ap_axis_str { word data; ap_uint<2> keep; bool user; bool last; // 对结构体添加打包指令,保证字段对齐 #pragma HLS data_pack };
注意事项
- 生成的AXI-Stream接口中,输入流的TREADY是模块向上游输出的握手信号,由工具根据输入流的缓存状态自动控制,无需手动赋值
- 输出流的TVALID由工具根据
output_stream.write()操作自动拉高,无需手动赋值 - 所有副通道信号的位宽会和你定义的字段位宽自动匹配,不会出现位宽异常问题
内容的提问来源于stack exchange,提问作者Skilopsaros
相关产品推荐
相关产品推荐

