HDL 和定点算术
规则:简明扼要
-
如果所有参数类型均为无符号,则结果类型为无符号。否则,结果类型为有符号类型。
-
类型宽度不限于 8/16/32/64 位,可以是 128 位(含 128 位)以下的任意自然数。
-
选择结果类型时要确保不会发生溢出。
操作 |
结果类型 |
示例 |
---|---|---|
加法 |
容纳全部可能结果值所需的最小类型 |
|
乘法 |
结果类型的宽度是参数类型宽度之和,小数部分也是如此。 |
|
定点
除浮点数外,定点数也用于软件和硬件开发。定点数的灵活性不如浮点数,但定点数的运算速度通常更快。以下是定点数的基本概念。
目前,Engee 使用的是仅二进制点(二的幂次方)版本的定点数,而不是斜率偏置。 |
要了解如何在 Engee 计算环境中使用定点数,请参阅文章Engee 中的定点算术(固定点 。 |
二进制点
整数用二进制表示为 2 的幂和。例如,二进制的 9 是 :
从 MSB(最显著)到 LSB(最不显著)的位数 |
3 |
2 |
1 |
0 |
价值 |
1 |
0 |
0 |
1 |
两*位值的度 |
|
|
|
|
响应捐款 |
8 |
0 |
0 |
1 |
用二进制表示非整数时,可以在零位后加一个点,然后以 2 的负幂数开始计数。例如,`9.625`编码为 :
从 MSB(最显著位)到 LSB(最不显著位)的位数 |
3 |
2 |
1 |
0 |
-1 |
-2 |
-3 |
数值 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
两*位值的度 |
|
|
|
|
|
|
|
响应捐款 |
8 |
0 |
0 |
1 |
0.5 |
0 |
0.125 |
定义
-
类型宽度(Type Width)是对类型值进行编码的位数。
-
小数 "位的数量就是 "小数长度",也称为 "二进制点"(BP)。
-
以十进制表示的值称为实际值(RWV)。
-
如果从零开始从 LSB 到 MSB 对比特进行编号(即使是非整数实数值),得到的整数称为存储整数 SI。例如, 的存储整数是 9, 的存储整数是 77。
在这种情况下
此外,小数部分的长度可能是负数。在这种情况下,存储的整数要乘以小数部分长度的模数。因此,数字 112 只需使用三个比特和缩放 即可表示:
从 MSB(最显著)到 LSB(最不显著)的位数 |
6 |
5 |
4 |
数值 |
1 |
1 |
1 |
两*位值的度 |
|
|
|
对答案的贡献 |
64 |
32 |
16 |
还要注意,小数部分的长度可以超过类型的宽度。例如, 可以用字宽 3 和 BP 11 表示,即 :
从 MSB(最有效)到 LSB(最小有效)的位数 |
-9 |
-10 |
-11 |
数值 |
0 |
1 |
0 |
两 * 位值的度 |
|
|
|
对响应的贡献 |
0 |
0.0009765625 |
0 |
负数编码为two’s complement (two’s complement)。
代号
根据Engee 中的定点算术 一文,我们将最一般的形式表示为 fixdt(S,W,f)
。此处:
-
S
- 0 表示无符号类型,1 表示有符号类型; -
W
- 类型的宽度; -
f
- 小数部分的长度 (BP)。
具体类型名称举例:
名称 | 含义 |
---|---|
uint32 |
宽度为 32 位的无符号整数类型 |
`uint123 |
宽度为 123 的无符号整数类型 |
sint16 |
宽度为 16 的有符号整数类型 |
符号定点类型 |
带符号定点类型,宽度(总长度)32,小数部分长度 5 |
|
无符号定点类型,宽度为 32,小数部分长度为 5 |
`ufix3_E4 |
无符号定点类型,宽度 3,小数部分长度 -4 |
从算术角度看,以下类型是等价的:uint42`、ufix42 、ufix42_En0 、ufix42_E0 。
|
算术
运算前,先对参数的二进制点进行对齐,然后对参数进行相加/相乘运算。例如,要将 ufix4_En3
中的 与 ufix2_En1
中的 相加,必须先在第二个数字的虚数点后面加上两个 0:
1001 (ufix4_En3)
+ 01 (ufix2_En1)
= 1.001
+ 0.100
= 1.101
而 的分数长度为 3,就是 。
规则:详细
操作 | 参数 1 类型 | 参数 2 类型 | 结果类型 |
---|---|---|---|
加法 |
|
fixdt(S2,W2,f2)`。 |
所需的最小类型,在简单情况下可容纳结果的全部可能值 |
乘法 |
|
|
|
加法
宽度的选择是为了适应参数加法结果的可能取值范围。
*算法
-
找出操作数相加后可能得到的最小值和最大值。
-
找出存储结果范围所需的最小位数。
-
示例
-
添加两个
sfix5_En2
将产生sfix6_En2
,因为我们需要将结果类型扩展一位,以节省高位的可能进位。添加ufix8_En1
和ufix8_En3
会产生ufix11_En3
:1111111.1 + 11111.111 = 1111111.100 + 0011111.111 = 11011111.001
由于位宽 .
-
其他示例:
参数类型 1 | 参数类型2 | 结果类型 |
---|---|---|
|
`sfix5_En2 |
`sfix6_En2 |
|
|
|
|
`ufix32_E2 |
|
|
`ufix5_E2 |
|
`ufix4_En7 |
`ufix5_E2 |
|
`ufix4_En7 |
`fix14_E2 |
fix24_En7 |
`ufix4_En7 |
`fix14_En2``修复 |
|
修复 4_En38 |
`sfix6_E78``fix123_E78 |
|
多个数字之和
对于多个参数,累加器的最小宽度是同时计算所有参数的,而不是按顺序先计算前两个参数,然后再计算前一个结果与第三个参数的相加,以此类推。同时考虑所有参数类型的计算,可以节省保存结果所需的宽度。
向量元素之和
对于程序块Sum(输入矢量元素的求和,Add 程序块的特殊模式),我们进行了优化,以避免循环计算(如在 Add 中发生的情况),并快速确定结果的类型。也就是说,由于所有元素的类型都是相同的 "fixdt(S, W, f)",因此可以观察到:
同样,先确定结果的最小值,然后选择所需的类型宽度。
可以估计 。
乘法
推断乘法运算结果类型的规则已在本节的表格中作了充分说明。 规则:详细,并通过归纳法和关联法扩展到任何数量的参数。没有任何例外或额外的复杂性。