FPGA学习笔记#4 Vitis HLS 入门的第一个工程

本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,这一篇终于没有再大量使用别人的内容,是我自己从头捋到尾的结果,不过之后的笔记还是要参照别人的教程就是了。


学习笔记:《FPGA学习笔记》索引
FPGA学习笔记#1 HLS简介及相关概念
FPGA学习笔记#2 基本组件——CLB、SLICE、LUT、MUX、进位链、DRAM、存储单元、BRAM
FPGA学习笔记#3 Vitis HLS编程规范、数据类型、基本运算
FPGA学习笔记#4 Vitis HLS 入门的第一个工程
FPGA学习笔记#5 Vitis HLS For循环的优化(1)
FPGA学习笔记#6 Vitis HLS For循环的优化(2)
FPGA学习笔记#7 Vitis HLS 数组优化和函数优化
FPGA学习笔记#8 Vitis HLS优化总结和案例程序的优化


目录

  • 1.工程的创建
  • 2.添加程序文件
  • 3.程序编写
  • 4.指定Top函数(第一次执行)
  • 5.程序运行
  •     5.1.C仿真
  •     5.2.C综合
  •     5.3.C/RTL联合仿真
  • 6.简单的优化

1.工程的创建

Vitis的安装请自行查找教程,本教程使用的Xilinx IDE为Vitis HLS,比较早的版本则可以使用Vivado HLS,功能都差不多。

首先点击Create Project创建工程。

输入工程名和工程目录,点击Next。

无视添加Design文件和Testbench文件,我们之后再加,直接点Next。

选择FPGA型号,根据自己需要写,如果想完整复现结果就选一样的,选完后点OK,再点Finish完成创建。

工程创建结束。


2.添加程序文件

在工程界面左上角是资源管理器,右键Source->New Source File,创建top.h和top.cpp(一次只能创建一个文件),然后同样的方式右键Test Bench->New Test Bench File,创建test.cpp文件。文件存储位置任意,可以放在工程根目录。

创建完成后如下图所示:

至于为什么不和其他教程里叫VectorAdd.h和.cpp,因为这样以后用这个工程直接跑别的测试没有啥违和感。


3.程序编写

我们用一个经典的测试例程,数组A的每一个元素+数据t,其结果输出到数组B中。

top.h:

// top.h
#define N 5
typedef int data_t;
void VectorAdd(data_t A[N],data_t t,data_t B[N]);

top.cpp:

// top.cpp
#include "top.h"void VectorAdd(data_t A[N],data_t t,data_t B[N])
{unsigned int i;myloop:for(i=0;i<N;i++){B[i] = A[i] + t;}
}

test.cpp:

#include <iostream>
#include <iomanip>
#include "top.h"using namespace std;int main(){data_t A[N] = {-4,-3,0,1,2};data_t c = 5;data_t B[N] = {0};data_t RefB[N] = {1,2,5,6,7};unsigned int i = 0;unsigned int errcnt = 0;VectorAdd(A,c,B);cout<<setfill('-')<<setw(30)<<'-'<<'\n';cout<<setfill(' ')<<setw(10)<<left<<"A";cout<<setfill(' ')<<setw(10)<<left<<"C";cout<<setfill(' ')<<setw(10)<<left<<"B"<<'\n';cout<<setfill('-')<<setw(30)<<'-'<<'\n';for ( i = 0;i<N;i++){cout<<setfill(' ')<<setw(10)<<left<<A[i];cout<<setfill(' ')<<setw(10)<<left<<c;cout<<setfill(' ')<<setw(10)<<left<<B[i];if(B[i] == RefB[i]){cout<<'\n';}else{cout << "(" << RefB[i] << ")" << '\n';errcnt ++ ;}}cout << setfill('-') << setw(30) << '-' <<'\n';if(errcnt > 0){cout << "Test Failed" << '\n';return 1;}else{cout<< "Test Passed" << '\n';return 0;}
}

4.指定Top函数(第一次执行)

第一次执行前,我们要先配置程序的Top函数,HLS的程序分为内核代码(Top函数及其依赖)和主机代码(Test Bench及其依赖)。

点击菜单栏Project->Project Settings。

点击Synthesis->Browse,选择仿真的Top Fuction。

选择编写的VectorAdd函数,依次点击OK后配置完成。


5.程序运行

5.1.C仿真

点击左下角的Run C Simulation,执行C仿真,得到代码的执行结果。

直接点OK。

打印内容为下,说明仿真执行成功。


5.2.C综合

点击Run C Synthesis执行C综合。

点击OK。

可以看到C代码被综合成RTL代码后,会给出其性能指标、使用的硬件资源量,以及下面会给出接口等信息。

循环迭代延迟就是从上一轮循环结束到判断是否进入下一轮循环的延迟,比如for(int i=0; i<N; i++)中i++和i<N所需的时钟周期数,Interval就是循环之间的间隔周期数。


5.3.C/RTL联合仿真

进行RTL和C的联合仿真CoSimulation。

注意这里Dump Trace要选择port,仿真后才可以查看波形。

联合仿真结束后会打印报告,主要作用为显示执行性能指标Latency,同时如果Dump Trace为port,则左上角的波形图图标会亮起,点击可以查看仿真波形。

打开波形图后,首先将原来的展示部分全部删除,然后只将Top函数(VectorAdd)生成的结果拖动到波形窗口,然后点击图中的图标展开所有信号。

然后可以看到有一些值我们直接看看不懂,那是因为它默认按照十六进制显示,右键对应的数据,然后选择Signed Decimal,因为我们使用的是有符号数据,所以选择这个。

也可以设置Signal Color来配置不同数据的颜色,看起来更加方便一些。

从这张图可以很清晰的看到A数组、B数组取出的数据,用于取出数据的地址,以及运算得到的结果。


6.简单的优化

接下来我们对Top函数进行简单的优化,因为新版本的Vitis中对每个循环默认添加了PIPELINE(流水线)优化,因此我们对top.cpp的loop进行UNROLL(展开)优化。

首先New一个Solution:

编写solution的名称,并确定是否从其他solution中拷贝约束,因为solution1中没有配置任何约束,所以勾不勾选都可以。

添加solution后会自动切换到该solution,正在使用的solution图标左上角会有一个对钩。

选择top.cpp,点击右侧的Directive(没有的可以在Window->Show View->Directive打开),右键myloop标签,添加约束。

选择UNROLL,并点击OK,完成添加,这里选择Directive File会将约束语句放在solution_name/constraints/directive.tcl中,选择Source File会将约束语句直接写在程序中,这里以Source File为例,因为之后也会用到在程序中直接编写约束的情况。

添加Source约束后会在for循环左大括号的下一行添加#pragma HLS UNROLL,这也是我为什么目前更喜欢添加到源文件,因为学习起来更加直观一些,添加到directive文件的话测试移植等则更加方便。

再次执行C仿真,可以得到结果如下,应该是很明显有效率的提升,那我们该怎么更方便的对比呢?Vitis HLS提供了多个Solution仿真报告的比较功能。

点击Project->Compare Reports。

将左侧的可选报告双击或Add到右边,上下顺序在对比报告中会对应左右顺序,可以在这里调整。

生成的对比报告可以更清楚的区分和对比各个solution的性能,因为它把运行时间、Latency、资源消耗都分开展示,所以这个功能也可以用来分析单个报告,可以更直观一些。

性能对比:

资源使用量对比:

可以看到性能提升很明显,同时LUT的使用量也变多了,是用资源换取性能的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468777.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中给普通账户一次性提权

我在以前文章中Linux常见指令大全&#xff08;必要知识点&#xff09;-CSDN博客 写过sudo的概念与用法。其实本质就是提权用的但是在某些场景下就算提权了也不能使用。 例如&#xff1a;打开主工作目录 他不相信你这个用户&#xff0c;虽然你是erman 解决方法 使用root账号打开…

A027-基于Spring Boot的农事管理系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

linux命令详解,存储管理相关

存储管理 一、内存使用量&#xff0c;free free 命令是一个用于显示系统中物理内存&#xff08;RAM&#xff09;和交换空间&#xff08;swap&#xff09;使用情况的工具 free -m free -m -s 5参数 -b 功能: 以字节&#xff08;bytes&#xff09;为单位显示内存使用情况。说…

关于若依500验证码问题的求助

关于若依框架中验证码出现500错误的问题&#xff0c;这通常表示服务器内部错误。以下是一些可能的原因及解决方案&#xff1a; 一、配置文件问题 .env.production文件&#xff1a; 确保.env.production文件中的VUE_APP_BASE_API已经修改成服务器上的域名地址&#xff0c;而不…

HashMap(深入源码追踪)

一篇让你搞懂HashMap的几个最重要的知识点,往源码跟踪可以让我们很轻松应对所谓的一些八股面试题. 一. 属性解释 先来解释HashMap中重要的常量属性值 DEFAULT_INITIAL_CAPACITY : 默认初始化容量,也就是如果不指定初始化的Map存储容量大小,默认生成一个存储16个空间的Map集合…

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto- WriteUp

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto-WriteUp Crypto&#xff1a;Crypto-2&#xff1a;Crypto-3&#xff1a; 前言&#xff1a;本次比赛已经结束&#xff0c;用于赛后复现&#xff0c;欢迎大家交流学习&#xff01; Crypto&#xff1a; Crypto-2&#xff1a; …

【代码随想录day22】【C++复健】77. 组合;216.组合总和III; 17.电话号码的字母组合

77. 组合 这题做完之后还是有一种稀里糊涂的感觉。思考了半天什么范围合理&#xff0c;并且怎么设置才能让这个范围合理&#xff0c;然而一看答案&#xff0c;发现答案完全没考虑这些因素&#xff0c;直接暴力全遍历了。只能说确实这样能够放弃思考&#xff0c;比较省心一些.…

solidworks默认模板无效/打开step文件为空白 不显示模型

①打开step文件时如下提示&#xff1a; 是由于sw模版没有设置好 解决方法&#xff1a; 把零件和装配体模版选一下&#xff0c;gb_part和gb_assembly 再打开文件就不会有提示了。 ②打开step文件为空白 不显示模型 文件未损坏且sw版本正确情况下&#xff0c; 首先尝试按F&…

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头 原版表头和表体字体美化自动拼接错误提示列自适应宽度自动合并单元格使用Easyexcel使用poi导出 在后台管理开发的工作中,离不开的就是导出excel了. 如果是简单的导出, 直接easyexce…

微深节能 煤码头自动化翻堆及取料集控系统 格雷母线

一、系统概述 微深节能在煤码头自动化翻堆及取料集控系统中引入了格雷母线高精度位移测量系统&#xff0c;该系统是一项重要的技术创新&#xff0c;显著提升了煤码头作业的自动化水平和精确性。它主要用于实现对斗轮堆取料机等大型机械设备的精准定位和自动化控制&#xff0c;从…

LeetCode 热题100 之 栈

1.有效的括号 思路分析&#xff1a;我们可以使用栈&#xff08;stack&#xff09;来解决这个问题。栈是一种先进后出的数据结构&#xff0c;这与括号匹配的需求非常契合。 unordered_map<char, char> bracket_map&#xff1a;这个哈希表用来存储右括号与左括号的对应关系…

yolov11-seg数据集制作训练推理流程:

文章目录 前言一、数据集制作二、模型训练推理&#xff1a; 前言 随着深度学习技术的不断发展&#xff0c;目标检测与分割技术在计算机视觉领域扮演着越来越重要的角色。YOLO&#xff08;You Only Look Once&#xff09;作为一种高效、实时的目标检测算法&#xff0c;自提出以…

基于Spring Boot的乡政府管理系统设计与实现,LW+源码+讲解

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装乡政府管理系统软件来发挥其高效地信息处理的作用&#xf…

python的学习

0.tips 1.变量命名规则 2.变量的赋值 3.变量的类型 int&#xff0c;float&#xff0c;str&#xff08;双引号、单引号、三引号包含都可以&#xff09; 类型带来的意义 动态类型的基本特性 4.注释 5.控制台 格式化字符串f-string 输入/输出input 6.运算符 算术运算符 //&…

信息安全工程师(79)网络安全测评概况

一、定义与目的 网络安全测评是指参照一定的标准规范要求&#xff0c;通过一系列的技术、管理方法&#xff0c;获取评估对象的网络安全状况信息&#xff0c;并对其给出相应的网络安全情况综合判定。其对象主要为信息系统的组成要素或信息系统自身。网络安全测评的目的是为了提高…

【GoWeb示例】通过示例学习 Go 的 Web 编程

文章目录 你好世界HTTP 服务器路由&#xff08;使用 gorilla/mux&#xff09;连接到 MySQL 数据库MySQL 数据库简单操作模板静态资源和文件操作表单处理中间件&#xff08;基础&#xff09;中间件&#xff08;高级&#xff09;会话JSONWebsockets密码哈希 你好世界 Go语言创建…

UnixBench和Geekbench进行服务器跑分

1 概述 服务器的基准测试&#xff0c;常见的测试工具有UnixBench、Geekbench、sysbench等。本文主要介绍UnixBench和Geekbench。 1.1 UnixBench UnixBench是一款开源的测试UNIX系统基本性能的工具&#xff08;https://github.com/kdlucas/byte-unixbench&#xff09;&#x…

打造个性化时钟应用:结合视觉与听觉的创新实践

​ 在数字时代&#xff0c;虽然手机、电脑等设备已经能够非常方便地显示时间&#xff0c;但一款融合了视觉艺术和声音效果的桌面时钟仍能给我们的日常生活带来不一样的体验。本文将引导读者通过Python语言及其强大的库支持来创建一个具有整点及半点报时功能的美观时钟界面。该项…

ASMR助眠声音视频素材去哪找 吃播助眠素材网站分享

在快节奏的现代生活中&#xff0c;越来越多的人感到压力山大&#xff0c;许多人开始寻求助眠和放松的方式。而ASMR&#xff08;自发性知觉经络反应&#xff09;助眠声音视频&#xff0c;凭借其独特的声音刺激和放松效果&#xff0c;成为了睡前的“神器”。如果你是一位内容创作…

Ente: 我们的 Monorepo 经验

原文&#xff1a;manav - 2024.10.29 九个月前&#xff0c;我们切换到了 monorepo。在此&#xff0c;我将介绍我们迄今为止的切换经验。 这并不是一份规范性的建议&#xff0c;而是一个经验的分享&#xff0c;目的是希望能够帮助其他团队做出明智的决策。 与大多数岔路不同&…