Vivado HLS教程整理(一)任意精度数据类型

本文整理自高亚军老师的Vivado HLS视频教程,完整的笔记在公众号“Quant_Times"中回复”HLS“即可获取。

System Generator & HLS数字信号处理教程暨FPGA高级数字信号处理教程:
System Generator & HLS数字信号处理教程

1. HLS新的数据类型

C/C++数据类型:
在这里插入图片描述
其中HLS中不支持char16_t和char32_t两种数据类型。在C/C++中,所有的数据位宽都是基于8-bit,即位宽都是8-bit的倍数,当在逻辑中使用时,会明显造成资源的浪费,因此HLS中引入了Arbitrary Precision Data Type。

HLS中的Arbitraty Precision Data Types:
在这里插入图片描述
其中W表示数据长度;I表示整数长度;Q表示量化方式;默认的为AP_TRN_ZERO,即Truncation to zero方式;O表示溢出模式,默认为AP_WPAP即Wrap Around方式。
在这里插入图片描述
eg1.截位方式的影响

ap_fixed<3,2> var1 = 1.25;
ap_fixed<3,2,AP_RDN> var2 = 1.25;

1.25的二进制表示为:0 1.0 1,按第一种方式默认的TRN模式,则会将后面的1直接砍掉,剩下0 1.0,得到实际的结果是1.0;第二种方式的RDN是4舍5入的方式,后面的1进位到前一位,得0 1.1,实际结果为1.5

eg2.溢出方式的影响

ap_fixed<4,4> var3 = 19;
ap_fixed<4,4,AP_RND,AP_SAT> var4 = 19;

19的二进制表示为0 1 0 0 1 1,第一种方式截取低4位,得到0011,对应10进制3;第二种方式中,由于19大于4 bits无符号数能表示的最大范围,因此按最大值取,得15。

可以使用sizeof()函数来查看数据所占用的空间大小。

ap_int<1> a;  // a占用1个Byte
ap_int<8> b;  // b也占用1个Byte

在VS中也可以使用HLS的任意数据类型,只需将VS工程的库路径设置为HLS的路径即可。当头文件中包含<hls_math.h>时,VS编译会报错,hsl_math.h里面包含的几个其他的头文件中的错误,这是将hls_math.h改为cmath,再综合就没有错误了。

在这里插入图片描述

2. 变量初始化

变量可以使用copy initialization方式或者direct initialization()方式。
在这里插入图片描述
需要注意的是:

1.在定义单精度浮点数据类型时,需要有后缀f:

float var = 5.0(f)

2.当常数参与到具体的运算中,要明确告知其数据类型:

a = a + ap_fixed<6,4>(0.25);

3.HLS中不支持的C/C++的代码方式:动态分配、涉及OS的和递归操作。

3. 数据类型的转换

有隐式转换和显式转换两种。

隐式转换:有promotion(扩展)和conversion(截取),其中promotion时会自动扩符号位,当conversion时会截取低位。

显式转换:采用()或者调用函数的方式

ap_uint<3> i3 = 4;
ap_uint<4> i4 = 10;
ap_ufixed<6,4> i5 = i4/i3;     // 结果 2
ap_ufixed<6,4> i6 = (ap_fixed<6,4>)i4/i3;  // 结果 2.5
ap_ufixed<6,4> i7 = ap_fixed<6,4>(i4)/i3;  // 结果 2.5

可以用tpyeid()来获取数据的类型,需要typeinfo头文件。

4. 复合数据类型

复合数据类型包括struct和enum类型。

在HLS中对struct类型有Byte Pad的选项,可选field level和struct level类型,其中field level类型表示每个变量都要扩展为8-bit整数倍的位宽;struct level类型表示每个变量的实际位宽保留,但整体封装后要扩展为8-bit整数倍位宽。

对于enum类型,当在top level时,会当做一个具体的数据来应用。

5. 复数的应用

在使用复数时,应包含有头文件,并且使用std来定义一个复数,复数的乘法可以采用常规的分别计算实部和虚部的方式,如下图所示。
在这里插入图片描述
在这里插入图片描述
采用这种乘法方式进行了4次乘法和2次加法,也可以对该结构进行变换,如下图所示。用下面的这种方式,需要3次乘法和5次加法。

在这里插入图片描述
微信公众号:Quant_Times
在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vivado HLS是一款针对高层次综合(High-Level Synthesis,HLS)的工具,可以将C/C++代码转换为硬件描述语言(HDL)代码。这款工具可用于快速设计和优化FPGA(Field Programmable Gate Array)上的硬件加速器。有一个名为"Vivado HLS C入门详解教程"的教程提供了对Vivado HLS的入门指导,包括各个流程的使用和配合,以及附带的代码示例。该教程是基于Vivado 2017.4版本进行学习和测试的。 以下是该教程的一些主要步骤: 1. 双击Vivado HLS图标以打开工具。 2. 创建一个新的工程,可以通过快捷键或从File菜单中选择"创建新工程"来实现。 3. 在创建新工程时,填写工程名和工程存放路径。 4. 添加主函数名和文件(如果需要)。 5. 添加测试文件。 6. 添加优化文件和选择主时钟频率(注意:教程中提到的10MHz可能有误)。 7. 选择目标芯片。 8. 新建源文件。 9. 设置源文件名。 10. 新建一个接口文件。 11. 在接口文件中定义宏,并写入接口相关的代码。 12. 编写主函数的功能。 13. 添加激励文件。 14. 编写激励文件。 15. 删除头文件并设置主函数(通过点击设置按钮)。 16. 运行仿真。 通过上述步骤,你可以开始学习和使用Vivado HLS工具。希望这个简要介绍对你有所帮助。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Vivado HLS 教程.pptx](https://download.csdn.net/download/weixin_42576437/12583622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Vivado HLS基本应用](https://blog.csdn.net/qq_45159887/article/details/121705586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值