Vivado HLS中的数据类型

参考文献

[1]、lauren的FPGA(微信公众号)
[2]、小鱼FPGA(微信公众号)

项目简述

我们知道C、C++中数据类型的大小都是以字节为单位,这在FPGA中式相当浪费资源,因为只能式8bit的整数倍。所以在VIVADO HLS中我们需要具体指定每个数据类型的位宽,比如5位、10位。这篇文章将介绍在VIVADO HLS中为什么要使用任意精度的数据类型,以及如何使用任意精度数据类型。

为什么在VIVADO HLS中使用任意精度数据类型

C、C++语言中常见的数据类型如下:
在这里插入图片描述
我们举一个DSP48的例子解释为什么要使用任意精度,用过FPGA的同学都应该知道DSP48是FPGA中非常重要的硬件资源,而且数目不算多,在中端芯片中也就几百个DSP48。该硬件的简略图如下:
在这里插入图片描述
从图中我们可以看出DSP48可以计算的表达式,其中两个表达式中的a、b、c、d之间的任意组合,DSP48均可以计算。上面最重要的就是乘法器资源,上面的乘法器是25x18 Multiplier,这也满足了绝大多数的计算要求,但是如果我们要计算两个int类型的数据相乘,那么便需要3个DSP48,相当占用资源,从这个例子上便说明了VIVADO HLS中任意进度类型的重要性。

VIVADO HLS中如何使用任意精度数据类型

我们在VIVADO HLS中定义任意精度数据类型主要使用以下数据类型进行分定义:
在这里插入图片描述
这里注意C语言的限制比较大,不能进行相应的RTL与C的联合仿真,所以我们一般使用C++来写代码。
我们经常使用的任意精度的数据类型主要是ap_fixed,这个数据类型有五个关键字:
在这里插入图片描述
每个关键字的含义如下:
在这里插入图片描述
上面前两个参数指定了定义任意精度数据类型的长度与整数部分的长度,后面两个参数指定了在做四舍五入时的标准,这些标准特别常用,在MATLAB中有其一一对应的标准,具体的含义大家可以查阅相关资料,这里不再赘述。

举一个例子说明上面的描述
在这里插入图片描述

sizeof()函数返回该变量所使用的字节数。
在这里插入图片描述
举一个使用任意精度数据类型定义的数据使用sizeof()函数的返回值,如下:
在这里插入图片描述
VIVADO HLS提供了一个数学库hls_math.h是C、C++中数学库math.h、cmath.h在任意精度数据类型下的扩展。

VIVADO HLS中数据类型的转换

VIVADO HLS中变量的初始化可以使用copy initialization与direct initialization两种方式,举例如下:
在这里插入图片描述

数据类型的转换分为隐式数据类型转换、显式数据类型转换两种。
隐式数据类型转换又可分为把小位宽的变量赋值给大位宽的变量、大位宽的变量赋值给小位宽的变量。

其中把小位宽的变量赋值给大位宽的变量(有符号数扩展最高位,无符号数补零)的例子如下:
在这里插入图片描述

其中把小位宽的变量赋值给大位宽的变量(直接取地位)的例子如下:
在这里插入图片描述
在这里插入图片描述

显示数据类型的转换例子如下:
在这里插入图片描述
常用的数据运算为了保证大数据不溢出、小数据不丢失需要满足的位宽大小:
在这里插入图片描述

typeid() 函数可以被使用来获取变量的数据类型,使用该函数需要引入头文件typeinfo.h。举例子说明如下:
在这里插入图片描述

VIVADO HLS中的复合数据类型

复合数据类型包括两种,分别是结构体和枚举。

结构体中的数据可以通过data packing optimization打包成一个单一向量。
Directive中的命令为:DATA_PACK,该约束分为两个
1、filed_lecel
2、struct_level

举例子如下:
在这里插入图片描述在这里插入图片描述
对上面的例子施加field_level:
在这里插入图片描述
对上面的例子施加struct_level:
在这里插入图片描述
施加该约束之后的效果如下:
在这里插入图片描述
所以碰见结构体,一般使用:DATA_PACK进行约束

对于枚举类型,举例如下:
在这里插入图片描述
综合后的结果如下:
在这里插入图片描述

VIVADO HLS中的基本运算

当一个常数在HLS中参与运算,一定要进行强制类型转换,说明该常数的数据类型,否则HLS无法判断。
VIVADO HLS中进行复数运算引入头文件complex。

例子:计算最大公约数

计算最大公约数的数学原理如下:
在这里插入图片描述
代码如下:
在这里插入图片描述
生成消耗的资源如下:
在这里插入图片描述

VIVADO HLS中不支持递归函数。

总结

创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值