Vivado-HLS

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

Vivado HLS 学习笔记(二)

参考资料:ug871 《Vivado Design Suite Tutorial》

利用多个Solutions优化性能

1.优化I/O接口

1)新建一个新的Solution,在新的Solution中的Directive面板中找到所定义的几个接口
2)选择Directive面板中所定义的接口,右键选择Insert Directive,在弹出的窗口中选择所需要的存储介质和优化方式?


3)在Destination选项中选择Source File。
4)点击OK结束,其他借口也按照以上步骤进行优化。
5)最后点击Run C Synthesis在Outline中观察优化后的结果。

2.分析结果(Analyze Results)

1)点击右上角的Analysis按钮,回出现具体的运行细节?

Vivado HLS 学习笔记(一)

作者:宋易之

参考资料:ug871 《Vivado Design Suite Tutorial》

1.建立工程添加文件

2.高级综合

点击Run C Synthesis后出现Synthesis Report在Auxiliary Pane中会出现相应的信息总结。

1.Timing(ns)

在Performance Estimates 中可以看到Timing一栏,表示的是对系统时钟的估计,Estimates代表最差情况下的时钟周期,目标时钟周期减Uncertainty代表可能最优的时钟周期。

2.Latency(clock cycle)

Summary:
Latency中表示该程序会在78个时钟周期后输出结果。
Interval中的79表示两次写入的时钟间隔为79个时钟周期。
Detail:
由于该程序中不存在子块,所以Instance展开后为空。

Vivado HLS基本应用(流水灯)

核心算法顶层函数—>综合时选择这个函数作为入口进行RTL级映射。

HLS将C语言函数转换成RTL电路或verilog

不需要添加.h头文件

Test Bench:用来测试,放测试文件

可以有多个solution,不同的解决方案可以对比演示特性,时序特性等。

Create New Project—>Project Name:shift_led—>Top Function暂时先不指定—>Solution Name:solution1,clock:period:10(ns)(目标跑的主时钟的一个频率10ns相当于100MHZ);Uncertainty:不稳定度。不设置;Part:选择器件:xc7z010clg400-1,(-1代表速度等级较慢的芯片);—>Finish。

工程窗口中:includes放各种头文件和接口文件;放算法的核心文件,要生成的文件要放到source里面;Test Bench放基例的文件;

在Vivado HLS中综合时如何指定端口的综合类型

如果你对Vivado HLS中综合之后端口的ap_none之类的类型指示摸不着头脑的话,那就来一起学习一下它们是如何使用的吧。在Vivado HLS中,我们可以指定端口使用的类型,这样在对C代码进行综合的时候,就可以指定某个端口所使用的转换协议了。常见的类型有:

1. ap_none
默认类型,该类型不适用任何I/O转换协议,它用于表示只读的输入信号,对应于HDL中的wire类型。

2. ap_stable
只用于输入信号,其具体实现方式仍为ap_none。它用于向Vivado HLS的综合器表明该信号在两次复位之间值是不变的。

3. ap_vld
在数据端口port_name的基础上创建一个额外的数据有效信号指示< port_name >_vld。

4. ap_ack
在数据端口port_name的基础上创建一个额外的应答信号指示< port_name >_ack。

5. ap_hs
使用该类型,则会同时创建额外的数据有效信号和应答信号,其效果相当于ap_vld与ap_ack之和。

6. ap_ovld
对于输入信号,其效果与ap_none是一样的。
对于输出信号,其效果与ap_vld是一样的。

视频:RFNoC和 Vivado HLS 挑战赛优胜者公布

从Ettus Research和Xilinx共同赞助的RFNoC 和 Vivado HLS 挑战赛结果,了解用C,C++或System C进行FPGA编程时Vivado HLS的杰出生产力和开发优势。

同步内容