Altifigence Academy

2 / 63 · 概念

数制与固定位宽表示

在进制转换之外,进一步计算表示范围、所需位数和截断误差。

本课程的起点

建议具备高中代数知识和基本编程经验。课程会梳理二进制与布尔代数布尔代数 处理 0、1 及 AND、OR、NOT 的代数。这里的加号通常表示 OR,因此规则与整数加法不同。了解更多,并以大学入门数字逻辑设计的水平快速推进。请把重点放在定义输入条件、位宽和观察时刻,并用实例验证,而非只背公式。

必须区分位串与数值

电路存储的是有限位串。将其解释为整数、有符号数还是定点数定点数 预先固定小数点位置,并对整数位串施加固定比例的数值表示方法。必须同时规定位宽、符号属性和小数位数。了解更多,由设计约定决定。本课假定你已了解整数运算和幂运算,直接进入实际 RTL 所需的范围计算。

NN 位 unsignedunsigned 将位串解释为非负整数的规则。n 位范围为 0 到 2^n−1,可能与同一位串的 signed 解释不同。 数值的解释如下。

u=∑i=0N−1bi2i,0≤u≤2N−1u=\sum_{i=0}^{N-1}b_i2^i,\qquad 0\le u\le 2^N-1

10110110 等于 128+32+16+4+2=182128+32+16+4+2=182。每四位分组得到 B6,因此 8'hB6 与 8'b10110110 是同一个位串。一个十六进制数字始终对应四位,所以阅读地址、掩码和波形时可以快速转换。

位串不变,解释不同

在下方切换 b7。按 unsigned 解释时,它增加的位权是 128;按二进制补码二进制补码 用固定位宽位串表示有符号整数的方法。n 位范围为 −2^(n−1) 到 2^(n−1)−1。了解更多解释时,最高位的权重是 −128。先构造 0x7F 与 0x80,比较两种解释在边界处的差别。

比特与数的表示

10110110 → unsigned 182 · signed -74 · hex 0xB6

改变位串和将其按 signed 解释是不同的操作。即使电路位宽同为 8 位,传给运算符的符号属性不同,也可能改变比较结果。

先确定范围,再确定位宽

区分 MM 个不同状态所需的最少位数如下。

N=⌈log⁡2M⌉N=\left\lceil\log_2 M\right\rceil

从 0 数到 999 需要表示 1000 个值,因此需要 10 位。从 0 数到 1024 有 1025 个值,需要 11 位。若混淆最大值与状态数,就会恰好在边界处少一位。若 RTL 的参数也支持 M=1M=1,必须将位宽限制为至少 1,避免产生零位宽向量。

存入较窄信号时会发生什么

丢弃高位、只保留 NN 位的 unsigned 存储是一种取模运算。

xstored=x mod 2Nx_{stored}=x\bmod 2^N

例如将 9 位计算结果 300 存入 8 位,只剩下 44。这既不是舍入,也不是饱和。若需要饱和运算,必须另行设计越界检测和选择最大值的电路。

SystemVerilog
logic [7:0] a, b, low;
logic [8:0] full_sum;
assign full_sum = {1'b0, a} + {1'b0, b};
assign low = full_sum[7:0];

两个操作数都先扩展,明确表达了保留进位的意图。不要认为仅凭进制写法就已确定符号属性和结果位宽。解读波形时,位宽、符号属性和基数缺一不可。

自己试试

分别表示从 0 到 4095 和从 0 到 4096 的计数值,需要多少位?将 511 存入 8 位 unsigned 后会留下什么值?

阅读解释

第一种范围有 4096=2124096=2^{12} 个值,需要 12 位;第二种有 4097 个值,需要 13 位。由于 511 mod 256=255511\bmod256=255,存储值为 8'hFF。仅凭该值无法判断此前是否发生过溢出。

你的选择适用于此浏览器,可随时在页脚更改。