FPGA学习笔记#3 Vitis HLS编程规范、数据类型、基本运算
本笔记根据笔者目前的项目确定学习目标,目前主要集中在Vitis HLS上,使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,从这一篇开始是HLS的学习进度,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习,并结合部分学习中查找的其他资料整理而成。
学习笔记:《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.Vitis HLS编程规范
- 2.Vitis HLS数据类型
- 2.1.任意精度数据
- 2.1.1.任意精度数据结构及声明方式
- 2.1.2.任意精度数据运算逻辑
- 2.2.复合数据类型
- 2.2.1.结构体
- 2.2.2.枚举
- 3.基本运算
1.Vitis HLS编程规范
Vitis HLS(原Vivado HLS)是一个高级综合工具,即可以用C/C++高级语言也可以用verilog等硬件语言来实现硬件逻辑。
根据Vivado HLS的使用指南,需要对输入程序作出以下规范:
- 不使用动态内存分配(malloc, free, new, delete)
- 减少使用指针对指针的操作
- 不使用系统调用(如abort, exit, printf),可以在测试平台上使用,但综合时这些指令会被无视
- 减少使用其他标准库里的内容(支持math.h中常用内容)
- 减少使用C++中的函数指针和虚拟函数
- 不使用递归方程
- 精准表达交互接口
2.Vitis HLS数据类型
2.1.任意精度数据
在HLS编程中,主要用到的数据为任意精度数据,其中C语言和C++使用的头文件不同:
C:ap_cint.h —— [u]int<W> (1024 bits)
C++:ap_int.h —— ap_[u]int<W> (1024 bits,可扩展为32K位宽)
C++:ap_fixed.h —— ap_[u]fixed<W,I,Q,O,N>
本文主要使用C++语言,使用的类型为ap_int<W>、ap_fixed<W,I,Q,O,N>及其无符号版本。
对于任意精度类型使用sizeof()时,其结果会对其到1、2、4等字节:
在例如VScode等IDE中显示类型或包含头文件报错时,可以在.vscode\c_cpp_properties.json中添加Vitis HLS的include目录:
安装根目录\Vivado_HLS(Vitis_HLS)\版本号\include
2.1.1.任意精度数据结构及声明方式
整型数据:
ap_int<W>或ap_uint<W>作用为声明任意位数的整型数据(后者为无符号整型),W为数据位宽,主要声明方式为:
ap_int<6> a_6bit_var = -22;
ap_int<6> a_6bit_var(-22);
ap_int<6> a_6bit_var(“0b101010”, 2); // 通过第二个参数指定字符串表示的数字进制
ap_int<6> a_6bit_var(“101010”, 2);
ap_int<6> a_6bit_var(“-22”, 10);
浮点数据
更应该说是小数数据,因为它和浮点数由阶码、尾数组成不同,是由整数部分、小数部分组成,常用前四个参数:ap_fixed<W,I,Q,O>和ap_fixed<W,I,Q,O>
W:数据总位宽
I:整数部分位宽
Q:量化模式(针对低位),默认为AP_TRN_ZERO(舍去低位),可指定为AP_RND(0舍1入)
O:溢出模式(针对高位),默认为AP_WARP(舍去高位),可指定为AP_SAT(饱和,所有非符号位填充1)
主要声明方式为:
ap_fixed<10,7> var = 10.5; // 声明整数部分位宽为7,小数部分位宽为3(精度只能到0.125)
ap_fixed<3,2> var1 = 1.25; // 小数部分字长1,丧失精度=1
ap_fixed<3,2,AP_RND> var2 = 1.25; // AP_RND量化模式,0b01.01->0b01.1,0舍1入=1.5
ap_fixed<4,4> var3 = 19; // 0b010011,取低四位0x0011=3
ap_fixed<4,4,AP_RND,AP_SAT> var4 = 19; // 饱和溢出模式,填充为0x0111=7
2.1.2.任意精度数据运算逻辑
运算目的:“大数据不溢出,小数据不损失”
短数据+长数据,扩展短数据
有符号+无符号,扩展符号位
整型和浮点型相运算,结果为浮点型
本文本框内“同类型”和“不同类型”指的是有/无符号类型,整型和浮点型运算可以参考int和float运算
相加:同类型相加,结果位宽为最大位宽+1不同类型相加,如果无符号较大,则最大位宽+2,否则最大位宽+1
相乘:同类型相乘,位宽相加
相除:有符号相除,被除数位宽+1无符号相除,结果位宽为被除数位宽
取模:同类型取模,结果位宽为最小位宽
整型给整型赋值:左值位宽n小于右值位宽m时,会在右值中取低n位赋值给左值,不仅可能发生溢出,并且左值为有符号数时,还可能改变整数符号。
浮点型给浮点型赋值:整数部分与整型类似,但通过配置AP_RND和AP_SAT,会得到不同的小数部分结果。
整型和浮点型赋值:均为整数部分赋值。
ap_int<4> v1 = 3;
ap_uint<4> v2 = 3;
ap_int<2> res;
res = v1; // 最终=-1,v1为0b0011,res赋值为0b11,数值位覆盖到符号位,出错
res = v2; // 最终=-1,同上
ap_fixed<4,2> v3 = 1.25;
ap_fixed<3,2,AP_RND> v4 = v3; // 最终=1.5,v3=0b01.01,v4赋值为0b01.1(AP_RND)ap_uint<3> i1 = 4;
ap_uint<4> i2 = 10;
ap_ufixed<6,4> i3 = i2 / i1; // 最终=2,和int类型一样,保留整数部分
ap_ufixed<6,4> i4 = (ap_ufixed<6,4>)i2 / i1; // 最终=2.5,方式1,浮点与整形运算=浮点
ap_ufixed<6,4> i5 = ap_ufixed<6,4>(i2) / i1; // 最终=2.5,方式2,浮点与整形运算=浮点
获取数据类型信息
#include <typeinfo>
typeid(var).name()
hls的math库
虽然HLS中无法使用标准库,但hls_math.h库支持了C的math.h和C++的cmath.h,包括数据类型和方法。
2.2.复合数据类型
Vitis HLS中支持结构体和枚举类型。
2.2.1.结构体
Vitis HLS中和C/C++一样,可以声明结构体类型,并且可以使用任意精度类型声明成员:
对于实例化的结构体对象,可以使用DATA_PACK约束(directive)来指定结构体内部数据结构
field_level会将结构体所有成员位宽分别对齐到1字节,然后在内存中依次放置:
struct_level则会保留每个成员的实际位宽,在内存中紧靠着放,最后向上对其1字节,如下图中,各个成员的位宽相加为19,因此对其到3字节:
2.2.2.枚举
枚举类型占用位宽会自动分配,如下图mymode_t共4个枚举数据,因此位宽为2,其余和C/C++的枚举相同,不再赘述。
3.基本运算
算术运算 + - * / % 大数据不溢出,小数据不损失
算术赋值 = += -= *= /= %=
自增自减 ++ --
条件 ?:
关系运算 > < >= <= == !=
逻辑 ! && ||
位运算 << >> ~ & | ^
常数参与具体运算时,最好告知具体数据类型:
sum = din + din_t(0.25);
相关文章:
FPGA学习笔记#3 Vitis HLS编程规范、数据类型、基本运算
本笔记根据笔者目前的项目确定学习目标,目前主要集中在Vitis HLS上,使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,从这一篇开始是HLS的学习进度,主要根据教程&…...
爬虫 - 二手交易电商平台数据采集 (一)
背景: 近期有一个需求需要采集某电商网站平台的商品数据进行分析。因此,我计划先用Python实现一个简单的版本,以快速测试技术的实现可能性,再用PHP实现一个更完整的版本。文章中涉及的技术仅为学习和测试用途,请勿用于商业或非法用…...
“成交量分布指标“,通过筹码精准锁定价格方向+简单找市场支撑压力位 MT4免费公式!
指标名称:成交量分布指标 版本:MT4 ver. 1.32 之前发布的市场分布图不少朋友反馈不错,希望获得其它版本。 这个版本只有MT4的,MT5可以看之前版本,链接: “市场分布图”,精准把握价格动向 更直…...
简记Vue3(四)—— 路由
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
Python批量合并多个PDF
在日常工作中,处理和合并多个 PDF 文件是一个常见需求,尤其是在需要将大量文件整理成一个完整文档时。本文将详细介绍如何使用 Python 的 PyMuPDF 库来实现批量 PDF 文件合并,并提供针对大文件优化的解决方案。 安装 PyMuPDF 要使用 PyMuPD…...
Linux:vim命令总结及环境配置
文章目录 前言一、vim的基本概念二、vim模式命令解析1. 命令模式1)命令模式到其他模式的转换:2)光标定位:3)其他命令: 2. 插入模式3. 底行模式4. 替换模式5. 视图模式6. 外部命令 三、vim环境的配置1. 环境…...
贪心算法day05(k次取反后最大数组和 田径赛马)
目录 1.k次取反后最大化的数组和 2.按身高排序 3.优势洗牌 1.k次取反后最大化的数组和 题目链接:. - 力扣(LeetCode) 思路: 代码: class Solution {public int largestSumAfterKNegations(int[] nums, int k) {//如…...
默认 iOS 设置使已锁定的 iPhone 容易受到攻击
苹果威胁研究的八个要点 苹果手机间谍软件问题日益严重 了解 Apple 苹果的设备和服务器基础模型发布 尽管人们普遍认为锁定的 iPhone 是安全的,但 iOS 中的默认设置可能会让用户面临严重的隐私和安全风险。 安全研究员 Lambros 通过Pen Test Partners透露&#…...
上海市计算机学会竞赛平台2024年11月月赛丙组
题目描述 在一个棋盘上,有两颗棋子,一颗棋子在第 aa 行第 bb 列,另一个颗棋子在第 xx 行第 yy 列。 每一步,可以选择一个棋子沿行方向移动一个单位,或沿列方向移动一个单位,或同时沿行方向及列方向各移动…...
Python批量设置图片背景为透明
我们日常生活中制作PPT等教学资源时,需要批量去除图片背景,就可以使用 Python 的 rembg 库。 这个库基于神经网络模型,去背景效果较好,可以批量处理png, jpg, jpeg等图片。采用以下代码可以批量处理当前目录下的所有图片…...
Vue CLI 脚手架
cli脚手架创建项目步骤 全局安装(一次):yarn global add vue/cli 无法识别yarn的要先安装yarn;终端执行npm install -g yarn 查看Vue版本:vue --version 这里有问题(success上方有warning) 报错:‘vue’不是内部或外部…...
Linux【基础篇】
-- 原生罪 linux的入门安装学习 什么是操作系统? 用户通过操作系统和计算机硬件联系使用。桥梁~ 什么是Linux? 他是一套开放源代码(在互联网上找到Linux系统的源代码,C语言写出的软件),可以自由 传播&…...
多线程环境下安全地使用 SimpleDateFormat的常见方法
文章目录 1. 使用局部变量(每个线程独立一个实例)2. 使用 ThreadLocal<SimpleDateFormat>3. 使用 DateTimeFormatter(Java 8 及以上)4. 使用 DateFormat 子类(如 FastDateFormat)5. 使用 synchronize…...
easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头
easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头 原版表头和表体字体美化自动拼接错误提示列自适应宽度自动合并单元格使用Easyexcel使用poi导出 在后台管理开发的工作中,离不开的就是导出excel了. 如果是简单的导出, 直接easyexce…...
ANDROIDWORLD: A Dynamic Benchmarking Environment for Autonomous Agents论文学习
这个任务是基于androidenv的。这个环境之前学过,是一个用来进行强化学习的线上环境。而这篇文章的工作就是要给一些任务加上中间的奖励信号。这种训练环境的优点就是动态,与静态的数据集(比如说我自己的工作)不同,因此…...
Docker 常用命令详解(详细版)
Docker 是一个开源的容器化平台,它使得开发人员可以打包应用程序及其所有依赖项,并在任何环境中运行。Docker 提供了简单而强大的命令行工具来管理容器、镜像、网络等。本文将详细介绍 Docker 的常用命令及其使用方法。 1. 安装 Docker 在使用 Docker …...
【网络安全 | 甲方安全建设】分布式系统、Redis分布式锁及Redisson看门狗机制
未经许可,不得转载。 文章目录 分布式系统分布式系统的核心特性分布式系统的典型架构分布式锁概念Redis 分布式锁原理互斥性锁释放锁的唯一性具体实现Redisson分布式锁分布式系统 分布式系统是一种由多台计算机(节点)组成的系统,这些节点通过网络相互连接并协同工作,共同…...
「QT」几何数据类 之 QLineF 浮点型直线类
✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...
Treeland 技术揭秘,如何使得 DDE 纵享丝滑?
近日,deepin(深度)社区亮相COSCon24 第九届中国开源年会开源市集,且社区资深桌面研发工程师张丁元为大家来了《Treeland,DDE进步的阶梯》技术分享。 就着这个机会,今天就让我们一起来聊聊如何在追求华丽动…...
快速了解SpringBoot 统一功能处理
拦截器 什么是拦截器: 拦截器是Spring框架提供的重要功能之一,主要进行拦截用户请求,在指定方法前后,根据业务需求,执行预先设定的代码。 也就是说,允许开发⼈员提前预定义⼀些逻辑,在⽤⼾的请求响应前后执⾏.也可以…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
