函数内部的高级综合流分割(FPGA openCV 加速)

问题描述 投票:0回答:1

我尝试拆分从接口传入的 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");

有什么建议,我怎样才能避免这种情况?

opencv streaming vhdl fpga vitis
1个回答
0
投票

您的示例不完整,它没有定义类型

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;
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.