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框架提供的重要功能之一,主要进行拦截用户请求,在指定方法前后,根据业务需求,执行预先设定的代码。 也就是说,允许开发⼈员提前预定义⼀些逻辑,在⽤⼾的请求响应前后执⾏.也可以…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
软件工程教学评价
王海林老师您好。 您的《软件工程》课程成功地将宏观的理论与具体的实践相结合。上半学期的理论教学中,您通过丰富的实例,将“高内聚低耦合”、SOLID原则等抽象概念解释得十分透彻,让这些理论不再是停留在纸面的名词,而是可以指导…...
Linux信号保存与处理机制详解
Linux信号的保存与处理涉及多个关键机制,以下是详细的总结: 1. 信号的保存 进程描述符(task_struct):每个进程的PCB中包含信号相关信息。 pending信号集:记录已到达但未处理的信号(未决信号&a…...
