第四讲 数据类型的转换
1. 如何对一个变量进行定义和初始化
HLS可以采用拷贝初始化和直接初始化,但是不支持C++11后的方法统一初始化(Uniform Initialization)。我们还可以使用不同基数的格式(2进制,8进制,16进制等),其中可将前缀(0b二进制,0o八进制,0x16进制)省略,这样是极好的。同时,我们应该避免在一行定义多个变量,我们尽量每一行定义一个变量。
2. 对ap_[u]fixed<W, I,Q,0>
的变量类型的理解
ap_[u]fixed < int W, int I, ap_q_mode Q, ap_o_mode O, ap_sat_bits N >
1、W:宽度,数据占用的位宽;
2、I:整数部分的位数,那么(W-I)就是小数部分fraction占用的宽度了;
3、Q:量化模式
4、O:溢出模式
3. 对于浮点类型的定义于初始化
必须使用f
后缀来表示float
类型的文字
double vf2(5.0); float vf3(5.0f);
Vivado HLS数学库hls_math.h
为标准C的math.h
和C++的cmath.h
库提供了广泛的支持。支持包括浮点和任意精度的支持。
4. 数据类型的转换——隐式数据类型的转换
5. 数据类型的转换——显示数据类型的转换
6 . 二进制算术运算
7. 获取数据类型typeid
8. 总结
第五讲 了解HLS中的复合数据类型
1. 结构体
将结构用作顶层函数的参数时。标量(scalar)作为标准的scalar端口;数组默认为存储器的端口。在实际使用中在结构体在预先的头文件中声明 。通过数据打包优化,可以将结构上的元素打包到单个向量中。
主要有field_level和struct_level
2. 例子
怎么设定
3. Byte Pad: field level
什么是field level呢?
结构体中的所有元素都是以8为边界,例如变量A为4bit必须扩展为8bit,如果A是12bit必须扩展为16bit。由于以下元素都是4bit,所以被扩展为8bit。
4. Byte Pad: struct level
什么是struct level呢?
对于结构体所有位宽依然保留。但是在封装的位宽要以8bit作为边界。有5个元素,一个为4bit所以一共是20bit,那么最终扩展到24bit。