Vivado HLS中的数据类型
Posted 朽月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vivado HLS中的数据类型相关的知识,希望对你有一定的参考价值。
Vivado HLS中的数据类型
- 参考文献
- 项目简述
- 为什么在VIVADO HLS中使用任意精度数据类型
- VIVADO HLS中如何使用任意精度数据类型
- VIVADO HLS中数据类型的转换
- VIVADO HLS中的复合数据类型
- 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中不支持递归函数。
总结
创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
以上是关于Vivado HLS中的数据类型的主要内容,如果未能解决你的问题,请参考以下文章