Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vivado hls入门一
在集成电路行业飞速发展的今天,缩短产品开发的周期而又不牺牲验证过程,这不可避免地成为了商业市场的一个关键因素。Xilinx Vivado High Level Synthesis (即Vivado HLS,高层综合)。这个工具直接使用C、C++或SystemC 开发的高层描述来综合数字硬件,这样就不再需要人工做出用于硬件的设计,像是VHDL 或Verilog 这样的文件,而是由HLS 工具来做这个事情。
FPGA开源工作室
2019/10/29
1.5K0
Vivado hls入门一
FPGA Xilinx Zynq 系列(二十七)Vivado HLS: 近视 之 项目剖析
今天给大侠带来FPGA Xilinx Zynq 系列第二十七篇,开启十五章,讲述Vivado HLS: 近视之项目剖析等相关内容,本篇内容目录简介如下:
FPGA技术江湖
2020/12/30
2.2K0
System Generator学习——将代码导入System Generator
本节讲解如何讲讲代码(Matlab、HDL、C/C++)导入到 System Generator 并使用。
Gnep@97
2023/10/05
6920
System Generator学习——将代码导入System Generator
FPGA Xilinx Zynq 系列(二十六)高层综合
今天给大侠带来FPGA Xilinx Zynq 系列第二十六篇,开启十四章,讲述高层综合等相关内容,本篇内容目录简介如下:
FPGA技术江湖
2020/12/30
1.3K0
Vivado hls 入门二
Vivado HLS 是 Xilinx 提供的一个工具,是 Vivado Design Suite 的一部分,能把基于 C 的设计 (C、C++ 或 SystemC)转换成在 Xilinx 全可编程芯片上实现用的 RTL 设计文件 (VHDL/Verilog 或 SystemC)。
FPGA开源工作室
2019/10/29
1.9K0
Vivado hls 入门二
FPGA Xilinx Zynq 系列(二十五)IP包设计
今天给大侠带来FPGA Xilinx Zynq 系列第二十五篇,开启十三章,讲述IP包设计等相关内容,本篇内容目录简介如下:
FPGA技术江湖
2020/12/30
1.8K0
高层次综合(HLS)-简介
HLS是FPGA代码的综合技术。FPGA的基本知识可以从FPGA学习之基本结构得到。Xilinx的文档《Introduction to FPGA Design with Vivado High-Level Synthesis》中的两幅图可以很好的回答这一问题。
sea-wind
2019/09/11
3.3K0
高层次综合(HLS)-简介
使用 HLS 的 FPGA 的边缘检测
利用 HLS 功能创建图像处理解决方案,在FPGA中实现边缘检测 (Sobel)。
碎碎思
2022/01/04
1.2K0
使用 HLS 的 FPGA 的边缘检测
System Generator从入门到放弃(六)-利用Vivado HLS block实现VivadoHLS调用C/C++代码
System Generator是Xilinx公司进行数字信号处理开发的一种设计工具,它通过将Xilinx开发的一些模块嵌入到Simulink的库中,可以在Simulink中进行定点仿真,可以设置定点信号的类型,这样就可以比较定点仿真与浮点仿真的区别。并且可以生成HDL文件,或者网表,可以在ISE中进行调用。或者直接生成比特流下载文件。能够加快DSP系统的开发进度。
碎碎思
2020/06/29
1.2K0
图解Vivado HLS设计流程
在ESL(ElectronicSystem Level)阶段,典型的特征之一就是采用高层次语言完成设计。这里的“高层次”是相对于传统的RTL语言(VHDL/Verilog)而言。Xilinx有专门的高层次综合工具Vivado HLS,可支持C、C++和System C做为设计输入。
Lauren的FPGA
2019/10/31
2.1K0
在HLS中插入HDL代码
很多人都比较反感用C/C++开发(HLS)FPGA,大家第一拒绝的理由就是耗费资源太多。但是HLS也有自己的优点,除了快速构建算法外,还有一个就是接口的生成,尤其对于AXI类接口,按照标准语法就可以很方便地生成相关接口。
碎碎思
2024/07/15
3380
在HLS中插入HDL代码
基于vivado HLS的帧差图像实现
如图可见,由目标运动引起的运动变化区域包括运动目标在前后两帧中的共同位置(图中黑色区域)、在当前帧中新显露出的背景区域和新覆盖的背景区域三部分。
FPGA开源工作室
2019/10/29
1.2K0
基于vivado HLS的帧差图像实现
FPGA Xilinx Zynq 系列(二十八)Vivado HLS: 近视 之 算法综合
今天给大侠带来FPGA Xilinx Zynq 系列第二十八篇,讲述Vivado HLS: 近视之算法综合等相关内容,本篇内容目录简介如下:
FPGA技术江湖
2020/12/30
1.4K0
嵌入式硬件开发学习教程——Xilinx Vivado HLS案例 (3)
本文主要介绍HLS案例的使用说明,适用开发环境:Windows 7/10 64bit、Xilinx Vivado 2017.4、Xilinx Vivado HLS 2017.4、Xilinx SDK 2017.4。
创龙科技Tronlong
2021/11/11
1.5K0
嵌入式硬件开发学习教程——Xilinx Vivado HLS案例 (3)
Vitis HLS 2022.1:如何阅读C Synthesis生成报告
相比于Vivado HLS,Vitis HLS在C Synthesis之后生成的报告内容更加丰富,更有利于工程师对设计进行分析。这里我们以Vitis HLS 2022.1为例,看看C Synthesis之后的报告都包含哪些内容。
Lauren的FPGA
2022/12/21
1.9K0
Vitis HLS 2022.1:如何阅读C Synthesis生成报告
HLS最全知识库
高层次综合(High-level Synthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。
碎碎思
2023/02/14
2K0
HLS最全知识库
PYNQ上手笔记 | ⑤采用Vivado HLS进行高层次综合设计
实验中文件中包含一个矩阵乘法器的实现,实现两个矩阵inA和inB相乘得出结果,并且提供了一个包含了计算结果的testbench文件来与所得结果进行对比验证。
Mculover666
2020/07/15
1.5K0
从 IP 开始,学习数字逻辑:FIFO 篇(上)
使用 ip 对于数字逻辑方面的工作来说,是非常正常的,基础的 ip 之于数字逻辑设计,与与非门相比大概只是设计层次上的差别。更何况对于 SoC 公司来说,购买一整个外设模块的 ip 也是很正常的,比如 USB 之类的模块。
碎碎思
2020/06/30
1.6K0
使用Xilinx Vivado 创建自己板卡文件-以 EBAZ4205(旷板ZYNQ7010) 为例
我们在使用Vivado创建工程时,每次都需要选择相关的板卡器件,比较麻烦,这篇文章就教你怎么创建属于自己的板卡文件,在创建工程时就可以像官方板卡一样在板卡列表里选择。
碎碎思
2022/03/11
1.6K0
使用Xilinx Vivado 创建自己板卡文件-以 EBAZ4205(旷板ZYNQ7010) 为例
Vivado HLS学习资料有哪些
自从Xilinx推出Vivado HLS以来,越来越多的工程师,尤其是软件工程师开始转向FPGA设计与开发这一领域。其中一个主要原因是通常这些软件工程师都具有较为深厚的C/C++功底,这给他们的开发带来了一定的优势,但毕竟最终在FPGA上运行的是实实在在的电路,需要获得更高的性能就要对工具使用方法、器件结构、面向HLS的C/C++代码风格、各种pragma(Directive)、各种优化流程与优化方法都要有所了解。为此,Xilinx在推出这个工具的同时,也发布了相应的教程和用户指南。
Lauren的FPGA
2020/05/15
1.4K0
Vivado HLS学习资料有哪些
推荐阅读
相关推荐
Vivado hls入门一
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验