Vivado-HLS

在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是一样的。

Vivado HLS入门

前言
FPGA的能耗比优于GPU,且设计自由度高,受到许多深度学习开发者的青睐。但是用HDL语言开发神经网络过于复杂,利用Xilinx公司的高层次综合工具vivado HLS开发RTL逻辑的IP核则可以降低开发难度。

本文主要描述了如何使用vivado HLS的基本功能。文章内容主要来自于Xilinx官方文档:ug871-vivado-high-level-synthesis-tutorial,所用代码来自于Xilinx官方例程:ug871-design-files\2016.1\Introduction\lab1。读者可以在原文档中阅读到更详细的内容。

工具说明

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++源文件进行编译测试。

同步内容