微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Xilinx Zynq使用HLS实现OpenCV的开发流程

Xilinx Zynq使用HLS实现OpenCV的开发流程

时间:03-13 来源:电子产品世界 点击:

ivadoHLS 在FPGA部件中采用数据流优化来实现。

VivadoHLS对OpenCV的支持,不是指可以将OpenCV的函数库直接综合成RTL代码,而是需要将代码转换为可综合的代码,这些可综合的视频库称为HLS视频库,由VivadoHLS提供。

OpenCV函数不能直接通过HLS进行综合,因为OpenCV函数一般都包含动态的内存分配、浮点以及假设图像在外部存储器中存放或者修改。

VivadoHLS视频库用于替换很多基本的 OpenCV函数,它与OpenCV具有相似的接口和算法,主要针对在FPGA架构中实现的图像处理函数,包含了专门面向FPGA的优化,比如定点运算而非浮点运算(不必精确到比特位),片上的行缓存(line buffer)和窗口缓存(window buffer)。图2.1展示了在Xilinx Zynq AP SOC器件上实现视频处理的系统结构。

图2.1 Zynq视频处理系统结构

2.2 在FPGA/Zynq开发中使用VivadoHLS实现OpenCV的设计流程

设计开发流程主要有如图2.2三个步骤。

1. 在计算机上开发OpenCV应用,由于是开源的设计,采用C++的编译器对其进行编译,仿真和debug,最后产生可执行文件。这些设计无需修改即可在 ARM内核上运行OpenCV应用。

2. 使用I/O函数抽取FPGA实现的部分,并且使用可综合的VivadoHLS Video库函数代码代替OpenCV函数的调用。

3. 运行HLS生成RTL代码,在VivadoHLS工程中启动co-sim,HLS工具自动重用OpenCV的测试激励验证产生的RTL代码。在Xilinx的ISE或者Vivado开发环境中做RTL的集成和SoC/FPGA实现。

图2.2 在FPGA/Zynq设计中使用OpenCV的开发流程

2.2.1 VivadoHLS视频库函数

HLS视频库是包含在hls命名空间内的C++代码。#include “hls_video.h”

HLS视频库与OpenCV等具有相似的接口和等效的行为,例如:

OpenCV库:cvScale(src, dst, scale, shift);

HLS视频库:hls::Scale<...>(src, dst, scale, shift);

HLS视频库的一些构造函数具有类似的或替代性的模板参数,例如:

OpenCV库:cv::Mat mat(rows, cols, CV_8UC3);

HLS视频库:hls::Mat mat(rows, cols);

ROWS和COLS指定处理的最大图像尺寸。

表1 VivadoHLS视频处理函数库

2.2.2 VivadHLS实现OpenCV设计的局限性

首先,必须用HLS视频库函数代替OpenCV调用。

其次,不支持OpenCV通过指针访问帧缓存,可以在HLS中使用VDMA和 AXI Stream adpater函数代替。

再者,不支持OpenCV的随机访问。HLS对于读取超过一次的数据必须进行复制,更多的例子可以参见见hls::Duplicate()函数。

最后,不支持OpenCVS的In-place更新,比如 cvRectangle (img, point1, point2)。

下表2列举了OpenCV中随机访问一帧图像处理对应HLS视频库的实现方法。

表2 OpenCV和HLS中对一帧图像像素访问对应方法

 

OpenCV

HLS视频库

读操作

pix = cv_mat.at(i,j)

pix = cvGet2D(cv_img,i,j)

hls_img>> pix

写操作

cv_mat.at(i,j) = pix

cvSet2D(cv_img,i,j,pix)

hls_img<< pix

2.3 用HLS实现OpenCV应用的实例(快速角点滤波器image_filter)

我们通过快速角点的例子,说明通常用VivadoHLS实现OpenCV的流程。首先,开发基于OpenCV的快速角点算法设计,并使用基于OpenCV的测试激励仿真验证这个算法。接着,建立基于视频数据流链的OpenCV处理算法,改写前面OpenCV的通常设计,这样的改写是为了与HLS视频库处理机制相同,方便后面步骤的函数替换。最后,将改写的OpenCV设计中的函数,替换为HLS提供的相应功能的视频函数,并使用VivadoHLS综合,在Xilinx开发环境下在FPGA可编程逻辑或作为Zynq SOC硬件加速器实现。当然,这些可综合代码也可在处理器或ARM上运行。

2.3.1 设计基于OpenCV的视频滤波器设计和测试激励

在这个例子中,首先设计开发完全调用OpenCV库函数的快速角点滤波器

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top