FPGA OpenCV加速:HLS函数内流拆分的合成失败问题求助
问题分析与解决办法
核心报错原因是:HLS规定ap_axiu/hls::axis这类AXI-Stream专用类型仅允许作为顶层模块的接口端口使用,不能用于内部数据流。你的代码中内部定义的data_stream_out属于hls::stream<ap_axiu<...>>类型,违反了这个规则,导致综合失败。
以下是无需修改顶层接口、保留流式处理的解决方案:
解决思路
绕开内部使用ap_axiu类型的流,直接通过xf::cv::Mat的原生读写接口完成数据传递,替代依赖AXI-Stream的AXIvideo2xfMat和xfMat2AXIvideo函数,同时保留原有的控制信号处理逻辑。
修改后的完整代码
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; // 从自定义输入流提取像素数据,写入xf::cv::Mat void extractDataStream(stream_t& stream_in, xf::cv::Mat<XF_8UC1, HEIGHT_MAX, WIDTH_MAX, XF_NPPC1>& imgInput, 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(); // 将ap_axiu中的像素数据写入Mat imgInput.write(i, streamBuff.Data.data); // 若需要保留startFrame/stopFrame等User信号,可在此处额外存储 } } // 从处理后的xf::cv::Mat读取数据,重构自定义输出流 void reconstructStream(xf::cv::Mat<XF_8UC1, HEIGHT_MAX, WIDTH_MAX, XF_NPPC1>& imgOutput, stream_t& stream_out, dim_t height, dim_t width){ video_if_t streamBuff; ap_uint<PIXEL_WIDTH> dataOut; for(int i = 0; i < height * width; i++){ #pragma HLS PIPELINE II=1 dataOut = imgOutput.read(i); // 填充ap_axiu的标准字段 streamBuff.Data.data = dataOut; streamBuff.Data.keep = ap_uint<1>(-1); // 保持信号全有效 streamBuff.Data.strb = ap_uint<1>(-1); streamBuff.Data.last = (i == height * width - 1) ? ap_uint<1>(1) : ap_uint<1>(0); // 最后一个像素标记帧结束 streamBuff.Data.user = ap_uint<1>(0); // 恢复User控制信号(可根据实际需求从原流中保留,示例暂设为0) streamBuff.User = 0; stream_out.write(streamBuff); } } 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); #pragma HLS DATAFLOW extractDataStream(stream_in, imgInput, height, width); xf::cv::Threshold<XF_THRESHOLD_TYPE_BINARY, XF_8UC1, HEIGHT_MAX, WIDTH_MAX, XF_NPPC1>(imgInput, imgOutput, 128, 255); reconstructStream(imgOutput, stream_out, height, width); }
关键修改说明
- 移除内部AXI-Stream类型流:删除
data_stream_in和data_stream_out,直接通过xf::cv::Mat的write/read接口传递像素数据,规避HLS的类型限制。 - 自定义数据提取与重构:
extractDataStream从输入流读取自定义结构体,提取像素数据写入xf::cv::Mat;若需保留startFrame/stopFrame等User信号,可在此处增加存储逻辑。reconstructStream从处理后的Mat读取像素,重新打包成自定义结构体,并补充AXI-Stream标准控制信号(如last帧结束标记)。
- 保留流式性能:维持
#pragma HLS DATAFLOW和PIPELINE II=1,保证模块的流水线并行处理能力,适配大型视频处理系统的需求。
内容的提问来源于stack exchange,提问作者MJ_Dred
相关产品推荐
相关产品推荐

