这一部分主要介绍一下Vivado HLS的开发流程
学习HLS最好的参考资料还是xilinx官方的ug871和ug902,但xilinx的教程实在太长了,我也只是挑着看,等空下来了一定要细品
一、HLS简介
Vivado HLS是Xilinx公司发布的面向新一代FPGA推出的高级综合工具,在HLS工具中,用户不用受传统HDL语言的限制,能够选择不同的高级语言(C、C++、system C)进行FPGA设计,经仿真、优化和综合等步骤后即可生成RTL(Register Transfer Level)级代码,大幅降低了产品的研发周期。HLS更注重系统级建模,是一种全新的设计方法,能够将设计效率大幅提高。
二、HLS加速opencv
HLS的C语言函数库提供了丰富的函数接口与数据结构,其中HLS Video Functions Library堪称FPGA的opencv,在ug902的第四章有这些接口函数的详细介绍。
在Zynq系列APSoC上使用opencv主要有以下四种方式:
这里我主要采用的是第四种。不依赖于Arm进行一些重复运算,而是把算法中诸如滤波之类的需要大量计算的部分用硬件来实现,充分利用FPGA的并行特性。
zynq系列是ARM与FPGA集成的SoC,ARM与FPGA之间共享DDR,二者之间的通信与数据交换基于AXI4流协议,基于该协议可以实现视频处理模块之间的像素级通信。在使用HLS开发opencv应用的过程中,需要将输入定义为Video Stream接口,视频函数库采用hls::Mat数据类型, 因此还需要AXI4 video stream 到 VivadoHLS 中 hls::Mat<>类型的转换。
// 输入数据类型
typedef hls::stream<ap_axiu<24,1,1,1> > AXI_STREAM;
//注:后面两个尖括号之间要加空格
// Convert AXI4 Stream data to hls::mat format
hls::AXIvideo2Ma