Vivado-HLS

Vivado HLS开发流程简单介绍

在传统的FPGA设计流程中,一般是自顶向下的模块化设计,这些模块包括用户自己编写的RTL或者是供应商提供的IP核。而在Xilinx新推出的高生产力设计流程中是以IP为核心的,把所有的模块都看做是IP,封装为IP,最主要的是IP的设计是基于C语言的,最后通过HLS将C语言代码转化为RTL,这能极大的加快设计进程。从这段时间的学习来看,HLS综合出来的电路比我自己写的RTL更省资源,在时序方面可能会差一些,因为我自己是习惯性的全流水,但它也满足了时序的要求。HLS还提供了非常多的经过深度优化的库,所以我个人觉得HLS综合的电路已经比很多刚接触FPGA不久的工程师要好了,传统的RTL设计可能不会消失,但很可能会越来越少了。

HLS在不添加任何优化指令的情况下默认综合电路为最节省资源的情况,即能使用分时复用就使用分时复用,能在一个周期中完成多个操作(满足时钟频率约束的要求)则绝不流水。从这里得到的启发是,设计不要过度的流水,只要能满足时钟频率的需求,我们在一个时钟周期内可以进行多个操作,于是在低频率的系统中,我们可以节省很多的寄存器资源。这样做还有一个好处是我们可以使用assign来完成逻辑设计,然后再对输出进行寄存,可以极大的减少代码量,增加代码的可读性,HLS综合后的RTL代码的风格就是这样的,当然因为命名的原因该代码几乎没有可读性,我们可以不用刻意去读懂它。

【下载】:Vivado HLS (高层次综合) 教程

本教程解释和演示所有将C,C ++和SystemC代码转换为RTL实现的步骤。 展示了如何创建初始RTL实现,然后将其转换为低带宽和高吞吐量的实现,方法是在不更改C代码的情况下使用优化指令。敬请点击下载:
https://china.xilinx.com/support/documentation/sw_manuals/xilinx2017_1/u...

【视频】:Vivado HLS 需要了解的知识点

本次课程主讲32张图片、16组卷积滤波、输出16组结果,计算更加复杂,采用不同的IO接口设计,将结果进行比对,找出最佳方案。

Vivado HLS嵌入式实时图像处理系统的构建与实现

作者:张艳辉,郭洺宇,何 宾

摘 要: 传统的基于CPU、GPU和DSP的处理平台难以满足图像实时处理的要求,而FPGA在并行图像处理上有着独一无二的优势,在性能和成本之间提供更加灵活的选择。通过Xilinx最新的Vivado HLS工具,设计实现了可变参数的拉普拉斯算子图像滤波算法,并且在ZYNQ-7000 SoC上构建了可视化的实时嵌入式图像处理系统。实验结果表明,系统可以实现不同的图像处理算法,很好地满足了图像处理的实时性、高性能、低成本要求,对未来高性能图像处理系统的设计和实现提供了很好的借鉴。

0 引言

关于Vivado HLS 的三大误读

作者:高亚军,赛灵思高级战略应用工程师

目前,在高层次综合(HLS, High Level Synthesis)领域,Vivado HLS可谓独树一帜。它有效地拉近了软件工程师与FPGA之间的距离,加速了算法开发的进程,缩短了产品上市时间。对于工程师,尤其是软件工程师而言是一个福音。在实际工程中,如何利用好这一工具仍值得考究。本文将介绍使用Vivado HLS时的几个误区。

误区1:只要是C或者C++描述的算法都是可综合(可转换成RTL)的。
HLS的可综合功能是有限的,并不是所有的C或者C++语句都可转换成相应的RTL代码。下面这些情形是不可综合的。
1. 动态内存分配
2. 涉及操作系统层面的操作
3. 递归函数
4. 数组规模可变

误区2:既然Vivado HLS支持C、C++和System C,那么用三者任意一种都行。

HLS使用指南

HLS就是从高层次描述,之后综合成可用的网表文件的技术。这里的“高”指采用C、C++等编写程序,而不是传统的HDL语言。然而,实际上Vivado套件中是预先采用Vivado HLS这个软件将C程序转换成为Verilog HDL或者VHDL代码,之后进行下一步操作的,并不是直接综合C代码。

关于HLS的来历可以从“AutoESL与Xilinx那些人和事”中看到,AutoESL可以直接把C语言转化为硬件描述语言 ,并且质量不仅比现有的所有ESL的工具要至少高2倍。该公司的愿景就是让不懂FPGA的人可以立即使用FPGA. 后来就是Xilinx收购AutoESL。下图HLS使用性能。

VIVADO HLS具体功能可以参考《。。。Tutorial》和《。。。Synthesis》文档,以下是文档里的功能说明图。

Vivado HLS ap_fixed数据类型

任意精度定点数定点数
C++ Arbitrary Precision Fixed Point Types的缩写就是ap_fixed

定义如下
ap_[u]fixed int I,
ap_q_mode Q,
ap_o_mode O,
ap_sat_bits N>;

W:宽度,数据占用的位宽,
I:整数部分的位数,那么(W-I)就是小数部分fraction占用的宽度了
Q:量化模式

有这么几种:
Rounding to plus infinity AP_RNDAP_RND 指示该值应舍入到最接近ap_ [u]定点类型的可表示值。
ap_fixed<3, 2, AP_RND, AP_SAT> UAPFixed4 = 1.25; // Yields: 1.5
ap_fixed<3, 2, AP_RND, AP_SAT> UAPFixed4 = -1.25; // Yields: -1.0

Rounding to zero AP_RND_ZERO 向零取整
ap_fixed<3, 2, AP_RND_ZERO, AP_SAT> UAPFixed4 = 1.25; // Yields: 1.0

参考资料:xilinx大学计划
实验平台:ZYBO开发板

本次实验要做的是一个基于FPGA的简单图像处理程序, 共实现两个功能:
1.输出一个灰度图像的直方图。
2.将一个曝光不足的图像进行处理,使其对比度更大。

一、Vivado HLS 部分

首先我们用Vivado HLS来编写FPGA图像处理所用的IP核。

1.绘制直方图

1.首先编写相应的C/C++语言程序,加入到Vivado HLS工程中,再编写相应的testbench代码进行编译测试。


代码很简单大家看一下就明白了。

注意到右侧Directive窗口中的优化部分,分别表示doHist的输出接口使用AXI4-lite传输协议,inStream图像输入接口采用AXI4协议,输入数组histo存入bram中,loop_init循环进行展开。

2.点击Run C Simulation进行对C/C++源文件进行编译测试。

Vivado HLS 设计优化

在使用高层次综合,创造高质量的RTL设计时,一个重要部分就是对C代码进行优化。Vivado Hls总是试图最小化loop和function的latency,为了实现这一点,它在loop和function上并行执行尽可能多的操作。比如说,在function级别上,高级综合总是试图并行执行function。

除了这些自动优化,directive是用来:
(1) 并行执行多个tasks,例如,同一个function的多次执行或同一loop的多次迭代。这是流水线结构。
(2) 调整数组的物理实现((block RAM),函数,循环和端口,以提高数据的可用性,并帮助数据流更快地通过设计。
(3) 提供关于数据dependency的信息,或者缺乏数据dependency,允许执行更多的优化。最终的优化是修改C源代码,以消除在代码中意外的dependency,但是这可能会限制硬件的性能。

本文使用的sample设计是一个matrix multiplier函数。目标是在每一个时钟周期处理一个新的sample,并实现数据流接口。

优化matrix multiplier

solution1

Vivado HLS学习笔记(三)

参考资料:Xilinx大学计划

已经看了几天的Vivado和Vivado HLS的使用流程了,已经对整个Xilinx FPGA的开发流程有了一点初步的了解。下面就来简单的介绍一下。

HLS开发流程

1.打开Vivado HLS

1.建立Vivado HLS工程文件
建立工程文件的部分就不赘述了。只要选择对你所开发的FPGA开发板就好。
2.编写源文件与Test Bench测试文件
3.分别在Source和Test Bench目录下添加你所编写的C/C++文件。

6.点击Run C Synthesis对多编写的C/C++文件进行高级综合的编译。随后会输出高级综合之后所估计的资源使用情况和端口信息等等,同时会生成verilog文件,但是大多这些verilog文件都是不可读的。

2.打开Vivado

同步内容