You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

关键修改说明

  1. 移除内部AXI-Stream类型流:删除data_stream_in和data_stream_out,直接通过xf::cv::Mat的write/read接口传递像素数据,规避HLS的类型限制。
  2. 自定义数据提取与重构:
    • extractDataStream从输入流读取自定义结构体,提取像素数据写入xf::cv::Mat;若需保留startFrame/stopFrame等User信号,可在此处增加存储逻辑。
    • reconstructStream从处理后的Mat读取像素,重新打包成自定义结构体,并补充AXI-Stream标准控制信号(如last帧结束标记)。
  3. 保留流式性能:维持#pragma HLS DATAFLOW和PIPELINE II=1,保证模块的流水线并行处理能力,适配大型视频处理系统的需求。

内容的提问来源于stack exchange,提问作者MJ_Dred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:59:53