前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vivado-hls使用实例

Vivado-hls使用实例

作者头像
数字积木
发布于 2021-04-15 02:51:59
发布于 2021-04-15 02:51:59
95500
代码可运行
举报
文章被收录于专栏:数字积木数字积木
运行总次数:0
代码可运行

Vivado-hls使用实例

【引言】

本系列教程演示如何使用xilinx的HLS工具进行算法的硬件加速。分为三个部分,分别为HLS端IP设计,vivado硬件环境搭建,SDK端软件控制。

在HLS端,要将进行硬件加速的软件算法转换为RTL级电路,生成便于嵌入式使用的axi控制端口,进行数据的传输和模块的控制。

【HLS介绍】

HLS可以将算法直接映射为RTL电路,实现了高层次综合。vivado-HLS可以实现直接使用 C,C++ 以及 System C 语言对Xilinx的FPGA器件进行编程。用户无需手动创建 RTL,通过高层次综合生成HDL级的IP核,从而加速IP创建。

HLS的官方参考文档主要为:ug871( ug871-vivado-high-level-synthesis-tutorial.pdf )和ug902(ug902-vivado-high-level-synthesis.pdf)。

对于Vivado Hls来说,输入包括Tesbench,C/C++源代码和Directives,相应的输出为IP Catalog,DSP和SysGen,特别的,一个工程只能有一个顶层函数用于综和,这个顶层函数下面的子函数也是可以被综合的,会生成相应的VHDL和Verilog代码,所以,C综合后的RTL代码结构通常是跟原始C描述的结构是一致的,除非是子函数功能很简单,所需要的逻辑量很小。并不是所有的C/C++都可以被综合,动态内存分配和涉及到操作系统层面的操作不可以被综合。

Vivado HLS 的设计流程如下:

在整个流程中,用户先创建一个设计 C、C++ 或 SystemC 源代码,以及一个C的测试平台。通过 Vivado HLS Synthesis 运行设计,生成 RTL 设计,代码可以是 Verilog,也可以是 VHDL。有了 RTL 后,随即可以执行设计的 Verilog 或 VHDL 仿真,或使用工具的C封装器技术创建 SystemC 版本。然后可以进行System C架构级仿真,进一步根据之前创建的 C 测试平台,验证设计的架构行为和功能。设计固化后,就可以通过 Vivado 设计套件的物理实现流程来运行设计,将设计编程到器件上,在硬件中运行和/或使用 IP 封装器将设计转为可重用的 IP。

Step 1: 新建一个工程

1,Creat New Project新建文档,输入工程名称和工程路径。完成后点击Next。

2,添加设计文件,并制定顶层函数。完成后点击Next。

3,添加C语言仿真文件。完成后点击Next。

4,:配置Solution Name,一般默认即可。配置Clock Period,单位是ns。配置Uncertainty,默认为空。选择产品型号。完成后点击Finish。

5,工程新建成功后进入的开发界面,HLS是典型的Eclipse界面,和SDK的界面十分相似。

导入的文件的代码如下:

1,源文件。axi_interfaces.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "axi_interfaces.h"void axi_interfaces (dout_t d_o[N], din_t d_i[N]) {int i, rem;// Store accumulated datastatic dacc_t acc[CHANNELS];axi_interfaces_label0:for (i=0;i<CHANNELS;i++) {acc[i] = 0;}// Accumulate each channelFor_Loop: for (i=0;i<N;i++) {rem=i%CHANNELS;acc[rem] = acc[rem] + d_i[i];d_o[i] = acc[rem];}}

2,头文件。axi_interfaces.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef AXI_INTERFACES_H_

#define AXI_INTERFACES_H_

#include <stdio.h>

typedef int din_t;

typedef int dout_t;

typedef int dacc_t;

#define CHANNELS 8

#define SAMPLES  4

#define N CHANNELS * SAMPLES

void axi_interfaces (dout_t d_o[N], din_t d_i[N]);

#endif

3,测试文件。axi_interfaces_test.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "axi_interfaces.h"



int main () {



// Create input data

  din_t d_i[N] = {10, 20, 30, 40, 50, 60, 70, 80,

11, 21, 31, 41, 51, 61, 71, 81,

12, 22, 32, 42, 52, 62, 72, 82,

13, 23, 33, 43, 53, 63, 73, 83};



  dout_t d_o[N];

int i, retval=0;

FILE        *fp;

// Call the function to operate on the data

  axi_interfaces(d_o,d_i);

// Save the results to a file

fp=fopen("result.dat","w");

fprintf(fp, "Din Dout\n");

for (i=0;i<N;i++) {

    fprintf(fp, "%d   %d\n", d_i[i], d_o[i]);

}

fclose(fp);

// Compare the results file with the golden results

retval = system("diff --brief -w result.dat result.golden.dat");

if (retval != 0) {

printf("Test failed  !!!\n");

retval=1;

} else {

printf("Test passed !\n");

  }

// Return 0 if the test passes

  return retval;

}

4,测试数据。result.golden.dat

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Din Dout

10   10

20   20

30   30

40   40

50   50

60   60

70   70

80   80

11   21

21   41

31   61

41   81

51   101

61   121

71   141

81   161

12   33

22   63

32   93

42   123

52   153

62   183

72   213

82   243

13   46

23   86

33   126

43   166

53   206

63   246

73   286

83   326

Step 2: C源代码验证

本步骤是对功能代码的逻辑验证,相当于功能前仿。

1,测试程序的代码入下图。该程序先调用综合的函数,得到计算结果,再和预先的数据集进行比较,最后返回计较的结果。计算结果和预先的数据集一致时,测试通过,不一致时,测试失败。需要查看代码,寻找错误。

2,点击红框中的按钮,开始C源代码验证。

3,验证的结果显示在控制栏中。如图显示,测试通过。

4,在头文件中,重定义了数据类型,参数,并进行了函数声明。

Step 3: 高层次综合

本步骤是把功能代码的综合成RTL逻辑。

1,点击红框中的按钮,将C代码综合成RTL。综合完成后,查看结果。

2,综合完成后,查看综合报告。包括时序,延时,资源占用,端口信息等。

3,端口分析。

(1)控制端口用于控制和显示该模块的工作状态。各个端口的功功能如下,默认情况下会生成下面四个控制端口。

l ap_start(in):为高时,该模块开始处理数据。

l ap_done(out):为高时,表示模块处理数据完成。

l ap_idle(out):表明模块是否处于空闲态。高电平有效。为高时,该处于空闲态。

l ap_ready(out):为高时,表示模块可以接受新的数据。

(2)数据端口用于传递模块的输入输出参数。

参数d_o,d_i 为数组类型,故默认状态下回生成内存接口。内存接口 (数组类型参数)数据来自外部的memory,通过地址信号读取相应的数据,输入到该模块中。输入数组从外部内存中读源数据,输出数组从向外部内存写入结果数据。各个端口的定义如下。

l address:地址信号

l ce0:片选信号

l we0:写使能信号

l d0 :数据信号

4,综合结果分析。

在分析界面,可以看到模块的运行情况。包括数据依赖关系和各个周期执行的操作,IO口的读写,内存端口的访问等等。

Step 4: 综合优化

在使用高层次综合,创造高质量的RTL设计时,一个重要部分就是对C代码进行优化。

Vivado HLS拥有自动优化的功能,试图最小化loop(循环)和function(函数)的latency。除了自动优化,我们可以手动进行程序优化,即用在不同的solution中添加不同的directive(优化指令)的方法,进行优化和性能对比。其中,对同一个工程,可以建立多个不同的solution(解决方案),为不同的solution添加directive可以达到如下目的。

优化的类型可分为如下类别:

l 端口优化。指定不同类型的模块端口。

l 函数优化。加快函数的执行速度,减小执行周期。

l 循坏优化。利用展开和流水线形式,减小循环的执行周期。

1,点击下面红框的图标,新建solution。

2,不同solution位于不同的文件夹中。

3,选中综合文件。可以在direct框中看可进行优化的标签。

4,双击选择d_o,选择interface,s_axilite。点击ok。将d_o的端口类型设置为s_axilite类型。

5,参考d_o,将d_i的接口类型也设置为s_axilite。将d_i的端口类型设置为s_axilite类型。

6,双击选择函数名称axi_interface,选择interface,s_axilite。点击ok。将控制端口的端口类型设置为s_axilite类型。

7,双击循环标签,选择流水线优化(pipeline),点击ok。

8,双击循环标签,选择循环展开优化(unroll),点击ok。

9,同上,也将标签为for_loop的循环进行流水线和展开优化。

10,最终的优化情况总结如下。

11,重新进行函数综合,查看综合报告如下。

12,分析。

同未优化相比,优化过后的函数综合后生成的模块的运行时钟大大减小。端口的接口类型也变为了axi_lite端口。但资源占用率有所增加,也体现了用资源换速度的设计理念。

Step 5: 综合结果文件

综合完成后,在各个solution的syn文件夹中可以看到综合器生成的RTL代码。包括systemc,VHDL,Verilog。

Step 6: 导出IP

在菜单里Solution>Export TL,设置如下,点击ok。

IP封装完成后,会在impl文件夹中输出ip文件夹,其中包含了RTL代码(hdl),模块驱动(drivers),文档(doc)等信息,其中包含一个压缩包文件,是用于建立vivado工程所用的IP压缩包。

Step 7: 总结

本文重点讲解了hls软件的使用方法和优化方法,在C语言模块设计上没有重点讲解。在掌握了hls软件的基本用法和优化方法后,接下来就可以设计更加复杂的C语言模块,进行rtl综合,加快设计开发的速度。

Step 8: 源码

在该公众号后台回复“HLS-axi_interfaces”,即可获得上述示例的工程源码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字积木 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年12月 GDI+绘图专题 图形图像编程基础
本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础、C#图像处理基础以及简单的图像处理技术。
愚公搬代码
2023/12/22
1K0
【愚公系列】2024年01月 GDI+绘图专题 DrawString
DrawString是C#中Graphics类的一个方法,用于在指定的位置绘制文本。在WinForm应用程序中使用DrawString,可以在窗体或控件上绘制文本。
愚公搬代码
2024/01/02
5960
【愚公系列】2023年12月 GDI+绘图专题 Brush
在WinForm中,Brush是用于填充绘制图形的对象,它们提供了不同的填充方式和样式。在绘制图形时,可以通过Graphics对象的Fill方法使用Brush进行填充。以下是一些常见的Brush类型:
愚公搬代码
2023/12/29
3340
C#一些常用的图片操作方法:生成文字图片 合并图片等
生成文字图片: 1 /// <summary> 2 /// 生成文字图片 3 /// </summary> 4 /// <param name="text"></param> 5 /// <param name="isBold"></param> 6 /// <param name="fontSize"></param> 7 public Image CreateImage(stri
晓晨
2018/06/22
1.5K0
C#下怎样处理并保存单色格式PNG图片?
用微软自带的画图,打开一个已经存在的单色PNG图片文件,然后复制图像粘贴上去,做点反色或其他处理再保存,可以得到黑白单色PNG图片;但是,如果有很多黑底白字的图片要想改成白纸黑字的单色PNG格式保存这就很麻烦了,譬如2,3百张BMP或JPG图片用来保存只有白纸黑字的书页真是浪费。可是,有些索引格式图像如单色位图,或者单色PNG,如果用C#的Graphics类处理之后,保存文件只能得到非索引色格式或者GIF格式,若想以原格式保存文件似乎没有直接方便的方法可用,不得已只能用自己的代码一点一点去写像。 以下代码,参考网上找了些的,加上实际证得:(注释并不是必需要的,有些编写代码过程中的记录,或者为了方便说明)
全栈程序员站长
2022/09/13
1K0
【愚公系列】2023年12月 GDI+绘图专题 Font
在WinForm中,Font是用于控件中显示文本的字体。它是一个封装了字体族、字号、字体样式的类。
愚公搬代码
2023/12/30
2330
工业党福利:使用PaddleX高效实现指针型表计读取系列文章(2)
最近在做一个工业巡检的项目,主要涉及的内容是指针型表计的读取。本系列文章主要介绍实现表计读取的全流程开发(立个FLAG,想想真是肝...留下了不争气的眼泪),其中主要使用的工具为百度开发的PaddleX和Visual studio 2019。
用户7699929
2020/08/27
1.7K0
工业党福利:使用PaddleX高效实现指针型表计读取系列文章(2)
【愚公系列】2024年01月 GDI+绘图专题(裁剪、变换、重绘)
裁剪(Clipping)指的是将图像或元素的一部分进行裁剪,只显示所需区域,而隐藏不需要的部分。
愚公搬代码
2024/01/11
7501
【愚公系列】2023年12月 GDI+绘图专题 图形图像的重绘
图形图像的重绘是指在对图形或图像进行修改后,需要重新绘制该图形或图像以反映修改后的结果。重绘可以在屏幕上直接进行,也可以在内存中进行,最后再将修改后的图形或图像显示在屏幕上。
愚公搬代码
2023/12/23
2980
Windows Forms:在C#中将图像转换成灰度图
本文翻译自Windows Forms: Convert an image into grayscale in C# 这篇文章向你展示在C# Windows窗体应用程序中如何将图像转换成灰度图。 创建一个新的Windows窗体应用程序项目,然后创建一个允许你可以打开图像,然后将图像转换成黑白图像的简单的UI,如下图所示:
ccf19881030
2021/03/02
1.7K0
Windows Forms:在C#中将图像转换成灰度图
C#生成缩略图
/**/ /// <summary> /// 生成缩略图 /// </summary> /// <param name="originalImagePath">源图路径(物理路径)</param> /// <param name="thumbnailPath">缩略图路径(物理路径)</param> /// <param name="width">缩略图宽度</param> /// <param name="height">缩略图高度</param> /// <param name="mode">生成缩略图的方式</param> public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode,string type) { System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);
jack.yang
2025/04/05
560
ImageHelper.cs-支持高清缩略图
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; namespace System { /// <summary> /// 图片处理类 /// </summary> public class
KenTalk
2018/09/11
9400
.net下灰度模式图像在创建Graphics时出现:无法从带有索引像素格式的图像创建graphics对象 问题的解决方案。
文章主要介绍了如何通过GDI+绘制椭圆,并给出了具体的实现代码和示例。主要步骤包括:定义一个基于GDI+的Bitmap对象,使用GraphicsPath绘制椭圆,将GraphicsPath转换为Bitmap,并使用RenderOptions.SetBitmapScalingMode进行缩放处理。
用户1138785
2018/01/03
5.7K1
.net下灰度模式图像在创建Graphics时出现:无法从带有索引像素格式的图像创建graphics对象 问题的解决方案。
【愚公系列】2023年12月 GDI+绘图专题 颜色获取和图形绘制
颜色获取是指从图像或者其他的颜色源中获取颜色值的过程。在计算机中,颜色值通常由RGB值来表示,即红、绿、蓝三原色的取值组合。通常可以通过鼠标选择选取颜色和颜色值,或者通过程序代码指定颜色值来获取颜色。
愚公搬代码
2023/12/24
2880
2020-10-22在线识图搜索引擎
最近在逛淘宝时发现了淘宝的图片搜索功能,可能是我太Low了这个技术点已经实现很长时间了。想想自己能不能实现这个功能,起初我是这么想的,对两张图片从左上角的第一个像素点一直比较到右下角的最后一个像素点,并在比较时记录它们的相似度,可能是我太天真了(主要还是知识限制了想象),这样做有很多问题,比如说两张图片大小不一致、核心要素点的位置不同等...最终只得借助网络了,找到了一种叫做均值哈希的算法(Average hash algorithm),接下来具体阐述它的基本思路以及适用场景。
爱笑的架构师
2020/10/28
1K0
2020-10-22在线识图搜索引擎
C# 使用OpenCV在一张图片里寻找人脸
例程中用到一个库叫做emgucv,是opencv\的net封装 编译打包好的稳定版,在这:https://sourceforge.net/projects/emgucv/files/emgucv/ 如果要最新代码,在这里获取:https://github.com/emgucv/emgucv
zls365
2020/08/19
2.8K0
C# 使用OpenCV在一张图片里寻找人脸
【愚公系列】2023年12月 GDI+绘图专题 Pen
Pen是在WinForm中用于绘制线条、轮廓和边框的对象。它定义了一个画笔,具有不同的颜色、宽度和样式。在绘制图形或图形对象时,Pen对象通常会与Graphics对象一起使用。
愚公搬代码
2023/12/28
2190
GDI+ 不求人之-自己画个验证码
GDI+ 不求人之-自己画个验证码 😃😃😃😃😃😃🤔🤔🤔🤔🤔🤔 简单来说就是画图的 先小试牛刀画个小图形 在点击事件里写下几行画正方形: Graphics g = this.CreateGraphics(); Pen pen = new Pen(Brushes.Black); Rectangle rec = new Rectangle(50,50,80,80); g.DrawRectangle(pen,rec); 在点击
用户9857551
2022/06/28
3970
GDI+ 不求人之-自己画个验证码
C#对图片文件的压缩、裁剪操作初探
在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便。毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意。 于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小、尺寸的目标图片。 进入正题--> 先说图片压缩 第一步:需要读取一个图片文件,读取方法: // <param name="ImageFilePathAndName">图片文件的全路径名称</param> 说明: Image类:引
小端
2018/04/16
2.2K0
推荐一款DataGridView的打印解决方案
今天有朋友请教在CS的WinForm中如何打印DataGridView中的内容。 网上搜索一番之后,还是在藏宝库CodeProject中找到一篇好文章《DataGridView Printing by Selecting Columns and Rows》(http://www.codeproject.com/KB/grid/PrintDataGrid_CS.aspx) 效果图 【打印设置画面】
跟着阿笨一起玩NET
2018/09/18
1.9K0
推荐一款DataGridView的打印解决方案
推荐阅读
相关推荐
【愚公系列】2023年12月 GDI+绘图专题 图形图像编程基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验