Xilinx Zynq使用HLS实现OpenCV的开发流程
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 pix = cvGet2D(cv_img,i,j) |
hls_img>> pix |
写操作 |
cv_mat.at 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库函数的快速角点滤波器
可编程 处理器 VivadoHLS OpenCV 相关文章:
- Reed Solomon编解码器的可编程逻辑实现(06-21)
- 基于VxWorks的MB系列智能可编程控制器设计(01-16)
- 在应用可编程测控网络设计(03-15)
- 基于AT89C51单片机的微型可编程控制器(04-23)
- 基于可编程DSP内核为通信和多媒体SoC提供出色功控(01-10)
- 可编程逻辑技术在数字信号处理系统中的应用(03-09)