我正在Vivado HLS中构建一个自定义IP核,以运行在Zybo板上嵌入式Linux中运行的图像/视频处理系统。核心采用via和AXI流中的图像/视频数据,执行处理任务(比如Sobel),然后将其输出到另一个AXI流。然而,这是有效的,我希望使用Zybo的板载开关来确定应该运行哪个处理任务(默认是直通)。
我找不到显示(在HLS ..而不是IP Integrator或Vivado SDK中)如何创建HLS RESOURCE / INTERFACE以从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模拟”和“C合成”提供了正确的输出。它在'RTL / C Cosimulation'中出错:“OpenCV Error:输入参数的大小不匹配。”这对我来说没有意义,因为所有RGB_IMAGES最初都设置有相同的行/列。
答案 0 :(得分:0)
嗯,在这种特定情况下,数据的大小不会仅由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。在这里,您可以定义像素中有多少位,像素中有多少通道颜色等等。如果图像的大小相同,则句子“输入参数的大小不匹配”指的是顶部主函数的这种不匹配问题。