Данные коммутатора Vivado HLS GPIO для Zybo Board

Я создаю собственное IP-ядро в Vivado HLS для работы с системой обработки изображений / видео, которая работает во встроенном Linux на плате Zybo. Ядро принимает данные изображения/видео в сквозном и AXI-потоке, выполняет задачу обработки (скажем, Sobel), а затем выводит это в другой AXI-поток. Это работает, однако я хочу использовать встроенные переключатели для Zybo, чтобы определить, какую задачу обработки следует запускать (по умолчанию используется сквозная передача).

Я не могу найти ресурс или простой пример, который показывает (в HLS... не IP Integrator или Vivado SDK), как создать РЕСУРС/ИНТЕРФЕЙС HLS для чтения данных с коммутаторов GPIO. У меня есть код ниже в моем верхнем модуле:

    #include <hls_video.h>
    #include "ip_types.h"

    void MultiImaging(AXI_STREAM& inputStream, AXI_STREAM& outputStream, int rows, int cols, bool sw0, bool sw1)
    {
    #pragma HLS INTERFACE axis port=inputStream
    #pragma HLS INTERFACE axis port=outputStream

    #pragma HLS RESOURCE variable=rows core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS"
    #pragma HLS RESOURCE variable=cols core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS"

    #pragma HLS INTERFACE ap_stable port=rows
    #pragma HLS INTERFACE ap_stable port=cols

    //are these two correct for the switches?
    #pragma HLS INTERFACE axis port=sw0
    #pragma HLS INTERFACE axis port=sw1

    //are these two correct for the switches?
    #pragma HLS RESOURCE variable=sw0 core=AXI_SLAVE //GPIO?
    #pragma HLS RESOURCE variable=sw1 core=AXI_SLAVE //GPIO?

    RGB_IMAGE img(rows, cols);
    RGB_IMAGE oimg(rows, cols);
    RGB_IMAGE sobel_output(rows,cols);

    RGB_IMAGE imgh(rows, cols);
    RGB_IMAGE imgv(rows, cols);

    RGB_IMAGE hsobel(rows, cols);
    RGB_IMAGE vsobel(rows, cols);

    GRAY_IMAGE imgGray(rows, cols);
    GRAY_IMAGE oimgGray(rows, cols);

    #pragma HLS dataflow
    hls::AXIvideo2Mat(inputStream, img);


    //Passthrough
    if(sw1 == 0 && sw0 == 0){
        //..code here
    }
    //Sobel
    else if(sw1 == 0 && sw0 == 1){    
    //..code here
    }
    //Threshold
    else if(sw1 == 1 && sw0 == 0){
    //..code here
    }
    //..etc            
}

Вышеприведенное работает и дает правильный результат для «C Simulation» и «C Synthesis». Он выдает ошибку в «Косимуляции RTL / C»: «Ошибка OpenCV: размеры входных аргументов не совпадают». Для меня это не имеет смысла, поскольку ВСЕ RGB_IMAGES изначально устанавливаются с одинаковыми строками/столбцами.


person dcc3    schedule 02.11.2016    source источник


Ответы (1)


Ну, размер данных НЕ делается, в этом конкретном случае, только по ROW и COL. Попробуйте заглянуть в свой заголовочный файл, там должно быть что-то вроде:

// typedef video library core structures
typedef hls::stream<ap_axiu<24,1,1,1> >               AXI_STREAM;
typedef hls::Scalar<3, unsigned char>                 RGB_PIXEL;
typedef hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC3>     RGB_IMAGE;

Это понятно, потому что вы используете AXI_STREAM. Здесь вы определяете, сколько битов в пикселе, сколько цветов канала в вашем пикселе и так далее. Если размер изображений одинаковый, предложение «Размеры входных аргументов не совпадают» относится к этой проблеме несоответствия с верхней основной функцией.

person Leos313    schedule 18.11.2016