我尝试拆分从接口传入的 HLS 流。该流包含数据流和带有控制信号(startFrame、stopFrame、startLine 等)的用户流。 我想使用 xf::cv 内核(在此示例中为阈值)。阈值模块需要数据流,我想从传入流中提取数据流并在处理后重建它。 在我的 C 模拟中,这工作正常,但我无法将其合成为 VHDL 代码,我只是面临错误消息
ERROR: [HLS 214-208] The ap_axis|ap_axiu|qdma_axis|hls::axis data types must only be used for AXI-Stream ports in the interface. 'data_stream_out' is not an AXI-Stream and/or is not a port in the interface
所以我无法创建这样的子流。但我需要保持流媒体,因为该模块将成为更大的视频处理模块集的一部分。
在界面中使用正确的流类型,合成肯定可以正常工作,但我需要保持界面原样。 因此,我需要访问流的数据部分,该部分具有 AXIvideo2xfMat 的正确类型。 这是我当前的最小示例(模拟得很好,但在综合时失败了)
typedef struct video_struct{
ap_axiu<PIXEL_WIDTH, 1, 1, 1> Data;
ap_uint<4> User;
} video_if_t;
typedef hls::stream<video_if_t> stream_t;
void mat2mat_proc(stream_t& stream_in, stream_t& stream_out, dim_t height, dim_t width){
#pragma HLS INTERFACE axis register both port = stream_in
#pragma HLS INTERFACE axis register both port = stream_out
xf::cv::Mat<XF_8UC1, HEIGHT_MAX, WIDTH_MAX, XF_NPPC1> imgInput(height, width);
xf::cv::Mat<XF_8UC1, HEIGHT_MAX, WIDTH_MAX, XF_NPPC1> imgOutput(height, width);
hls::stream<Data_t> data_stream_in("data_stream_in");
hls::stream<Data_t> data_stream_out("data_stream_out");
#pragma HLS STREAM variable=data_stream_in depth=2
#pragma HLS STREAM variable=data_stream_out depth=2
#pragma HLS DATAFLOW
extractDataStream(stream_in, data_stream_in, height, width);
xf::cv::AXIvideo2xfMat(data_stream_in, imgInput);
xf::cv::Threshold<XF_THRESHOLD_TYPE_BINARY, XF_8UC1, HEIGHT_MAX, WIDTH_MAX, XF_NPPC1>(imgInput, imgOutput, 128, 255);
xf::cv::xfMat2AXIvideo(imgOutput, data_stream_out);
reconstructStream(data_stream_out, stream_out, height, width);
}
void extractDataStream(stream_t& stream_in, hls::stream<Data_t>& data_stream_in, dim_t height, dim_t width){
video_if_t streamBuff;
for(int i = 0; i < height * width; i++){
#pragma HLS PIPELINE II=1
streamBuff = stream_in.read();
data_stream_in.write(streamBuff.Data);
}
}
void reconstructStream(hls::stream<Data_t>& data_stream_out, stream_t& stream_out, dim_t height, dim_t width){
video_if_t streamBuff;
Data_t dataOut;
for(int i = 0; i < height * width; i++){
#pragma HLS PIPELINE II=1
dataOut = data_stream_out.read();
streamBuff.Data = dataOut;
// Set User_t as needed
streamBuff.User = 0;
stream_out.write(streamBuff);
}
}
就像我已经提到的问题是,不允许在模块内部创建子流。
hls::stream<Data_t> data_stream_in("data_stream_in");
hls::stream<Data_t> data_stream_out("data_stream_out");
有什么建议,我怎样才能避免这种情况?
您的示例不完整,它没有定义类型
Data_t
,您无法从中创建流。
然而,从 streambuff.Data = dataOut;
可以假设 Data_t
是 ap_axiu<PIXEL_WIDTH, 1, 1, 1>
。在这种情况下,您遇到了与我尝试直接从 ap_axiu
创建流时遇到的相同问题 - 错误 HLS 214-208
。
有一种解决方法可以使用从 ap_axiu
继承的类型。例如,使用上面假设的 Data_t
的类型定义,从 Word_t
创建流:
struct Word_t : Data_t {
Data_t() {
data = 0;
keep = 0;
last = 0;
id = 0;
user = 0;
}
template<class T>
Word_t & operator=(const T & other) {
data = other.data;
keep = other.keep;
last = other.last;
id = other.id;
user = other.user;
return *this;
}
};