定点数据类型以 2 的补码形式将数据作为整数位和小数位进行建模,格式为 ap_fixed<W,I,[Q,O,N]>
,如下表所述。在以下示例中,Vitis HLS
ap_fixed
类型用于定义 18 位变量,其中 6 位(包括符号位)指定为表示二进制小数点前的数值,12 位则隐含用于表示小数点后的小数值。此变量指定为有符号变量,量化模式设置为舍入到正无穷。由于未指定上溢模式,因此针对上溢使用默认卷绕模式。
#include <ap_fixed.h>
...
ap_fixed<18,6,AP_RND> t1 = 1.5; // internally represented as 0b00'0001.1000'0000'0000 (0x01800)
ap_fixed<18.6,AP_RND> t2 = -1.5; // 0b11'1110.1000'0000'0000 (0x3e800)
...
提示:
ap_fixed
的整数值 (I
) 指定了二进制小数点左侧的整数位数(包括符号位)。执行计算时,如果其中所含变量具有不同位数或不同精度,那么二进制小数点将自动对齐。例如,以不同大小的定点类型变量执行除法时,商的小数部分不大于被除数的小数部分。为了保留商的小数部分,可在赋值前先将结果强制转换为新的变量宽度。
使用定点执行的 C++ 语言仿真行为与生成的硬件相匹配。这使您能够使用 C 语言层次快速仿真来分析位精度、量化和上溢行为。
定点类型适合替代需要多个时钟周期才能完成的浮点类型。除非需要浮点类型的完整范围,否则通常使用定点类型即可实现相同精度,并且硬件更小也更快。
下表中提供了 ap_fixed
类型的标识符的汇总。
标识符 | 描述 | |
---|---|---|
W | 字宽(位) | |
I |
用于表示整数值的位数,即,二进制小数点左侧的整数位数,包括符号位。 当 I 为负值(如以下示例所示)时,它表示隐式有符号位(对应有符号表示法)的数量,或者小数点右侧的隐式零位(对应无符号表示法)的数量。例如:
|
|
Q | 量化模式:用于规定当生成的精度大于用于存储结果的变量中的最小小数位可定义的精度时的行为。 | |
ap_fixed 类型 | 描述 | |
AP_RND | 舍入到正无穷 | |
AP_RND_ZERO | 舍入到 0 | |
AP_RND_MIN_INF | 舍入到负无穷 | |
AP_RND_INF | 舍入到无穷 | |
AP_RND_CONV | 收敛舍入 | |
AP_TRN | 截位到负无穷(默认) | |
AP_TRN_ZERO | 截位到 0 | |
O |
上溢模式:用于规定当运算结果超出用于存储结果的变量可存储的最大值(或者对于负值为最小值)时的行为。 |
|
ap_fixed 类型 | 描述 | |
AP_SAT 1 | 饱和 | |
AP_SAT_ZERO 1 | 饱和到 0 | |
AP_SAT_SYM 1 | 对称饱和 | |
AP_WRAP | 卷绕(默认) | |
AP_WRAP_SM | 符号量值卷绕 | |
不支持 | 定义上溢卷绕模式中的饱和位数。 | |
|
针对 ap_[u]fixed
数据类型允许的默认最大位宽为 1024 位。此默认设置可通过在包含 ap_int.h 头文件之前定义含正整数(小于或等于 4096)的 AP_INT_MAX_W
宏来覆盖。
重要: 使用
ap_[u]fixed
时,ROM 综合耗时较长。将其更改为 int
可加速综合。例如:static ap_fixed<32,0> a[32][depth] =
可更改为:
static int a[32][depth] =