第 6 章 数制、编码与逻辑表示
本章从十进制位权开始。只要知道十进制
352=3×100+5×10+2×1,就能用同一种方法理解二进制;不需要预先会二进制转换。
1. 本章要解决的问题
前五章中的 0 和 1 表示电路状态。把多个比特排成一组后,同一串比特可以表示无符号整数、负数、小数、十进制数字、状态或字符。硬件只保存比特,设计者必须明确这些比特的解释规则。
本章从十进制的位权直觉出发,建立二进制和十六进制表示,随后讲清无符号数、二补码有符号数、定点数和常见编码。目标不是背换算技巧,而是能回答三个问题:每一位的权重是什么、这组比特允许哪些值、相同位模式在当前接口中代表什么。
2. 与第 5 章的联系
第 5 章用输入组合描述逻辑门,每个输入只有 0 或 1。实际模块常把多个逻辑信号组成总线(bus),一次传送一个多比特数据。例如 8 根数据线可形成 8 bit 总线,但“10110010”究竟表示 178、−78、两个十进制数字,还是某个控制码,要由编码约定决定。
本章位于逻辑与系统之间:暂时忽略每个比特下面的晶体管,只保留稳定的 0/1;同时为后续布尔逻辑、组合模块和算术电路准备数据表示基础。
3. 前置知识快速检查
- 一个比特可以取哪两个逻辑值?
- 两个独立二值输入共有多少种组合?三个输入呢?
- 十进制数 347 中,3、4、7 分别乘以什么位权?
- 逻辑 1 为什么不等于固定的物理电压?
若第 2 题不确定,使用“每增加 1 bit,组合数乘 2”:\(N\) bit 一共有 \(2^N\) 种位模式。若第 3 题不确定,先把 347 写成 \(3\times10^2+4\times10^1+7\times10^0\);二进制只需把底数 10 换成 2。
4. 学习目标
完成本章后,你应能够:
- 解释基数、位权、最高有效位和最低有效位;
- 在二进制、十进制和十六进制之间转换;
- 写出 \(N\) bit 无符号数的范围并判断加法是否产生进位;
- 按二补码解释有符号位模式,完成正负数转换;
- 区分最高位进位与有符号溢出;
- 用明确的总位宽和小数位数解释定点数;
- 解释 BCD、格雷码和独热码各自解决什么问题;
- 识别同一位模式因解释规则不同而代表不同数值;
- 在接口说明中完整写出位宽、符号性、位序和编码。
5. 位权制:一串数字为什么能表示一个数
十进制数 347 的含义是
\[ 347=3\times10^2+4\times10^1+7\times10^0 \]
10 称为基数(radix)。每个位置具有一个 10 的幂次位权。二进制采用基数 2,只允许数字 0 和 1。一个 \(N\) bit 二进制位模式
\[ b_{N-1}b_{N-2}\ldots b_1b_0 \]
按无符号整数解释时,数值为
\[ U=\sum_{i=0}^{N-1}b_i2^i \]
\(b_i\) 只能取 0 或 1;\(i\) 是位索引;\(U\) 是无量纲整数。最右边 \(b_0\) 的位权为 \(2^0=1\),称为最低有效位(least significant bit, LSB);最左边 \(b_{N-1}\) 称为最高有效位(most significant bit, MSB)。
观察图 6-1 时,从右向左看位权每次乘 2,再把值为 1 的列相加。
图 6-1 8 bit 位模式中,每一位的权重由位置决定,置 1 的位权相加得到无符号数值
例如
\[ (10110110)_2=1\times128+0\times64+1\times32+1\times16+0\times8+1\times4+1\times2+0\times1=182 \]
下标 2 表示二进制,下标 10 表示十进制。代码和工程文档中也常写
0b10110110。
6. 十进制与二进制怎样互相转换
6.1 二进制转十进制
按位权展开并相加。建议先标出 \(2^0,2^1,2^2,\ldots\),避免从左向右错配权重。
6.2 十进制整数转二进制
可以反复除以 2 并记录余数,最后从后向前读取;也可以从不超过目标值的最大 2 的幂开始逐项分解。
例如把 45 转成二进制:
\[ 45=32+8+4+1=2^5+2^3+2^2+2^0 \]
所以
\[ (45)_{10}=(101101)_2 \]
前导 0 不改变数值,但会声明位宽:00101101 是 8 bit
表示,101101 是 6 bit
表示。在硬件接口中,位宽直接决定导线、寄存器和运算器规模,因此不能随意忽略。
7. 十六进制为什么适合阅读硬件数据
十六进制基数为 16,使用 0~9 和 A~F,其中 A~F 分别代表十进制 10~15。因为
\[ 16=2^4 \]
每 1 个十六进制数字正好对应 4 bit。二进制与十六进制转换只需从小数点或最低位开始,每 4 bit 分组。
图 6-2 二进制每 4 bit 映射为一个十六进制数字,分组保持位序和位宽
例如
\[ (1101\ 0110\ 1011)_2=(D6B)_{16} \]
硬件文档常写 0xD6B。3 个十六进制数字代表 12 bit;8
个十六进制数字代表 32 bit。若位宽不是 4 的整数倍,可以在最高位左侧补 0
后分组。
8. 无符号整数的范围
\(N\) bit 共有 \(2^N\) 种位模式。无符号编码从全 0 开始,连续表示到全 1,因此范围是
\[ 0\le U\le2^N-1 \]
例如 8 bit 无符号数范围为 0~255。全 1 的值为
\[ 11111111_2=128+64+32+16+8+4+2+1=255 \]
无符号加法若超过 \(2^N-1\),第 \(N\) 位会产生进位输出(carry-out)。固定为 \(N\) bit 保存时,结果只保留低 \(N\) 位,相当于对 \(2^N\) 取模。
例如 8 bit 的 \(250+10=260\),而
\(260=256+4\)。低 8 bit 保存
00000100,同时产生进位 1。这个结果不是普通整数意义上的
260;接口必须说明是否使用额外进位位。
9. 同一位模式可以有不同解释
位模式 11111111 本身只是一组比特:
- 按 8 bit 无符号数解释,它是 255;
- 按 8 bit 二补码解释,它是 −1;
- 按两个 BCD 数字解释,两个四位组都是 1111,属于非法 BCD;
- 按控制字段解释,它可以表示“全部功能使能”。
硬件不会自动知道设计者想采用哪种解释。模块端口和文档至少要给出:总位宽、是否有符号、位序、定点小数位数或编码名称。
10. 为什么有符号数采用二补码
最直观的负数表示是“最高位表示正负,其余位表示大小”,称为符号—数值表示。它有
+0 和 −0
两个零,而且加减法需要额外处理符号。
数字硬件普遍采用二补码(two’s complement)。它只有一个零,并允许同一组二进制加法器完成正数和负数加法。对于 \(N\) bit 二补码位模式,数值为
\[ S=-b_{N-1}2^{N-1}+\sum_{i=0}^{N-2}b_i2^i \]
最高位的权重不再是 \(+2^{N-1}\),而是 \(-2^{N-1}\)。因此范围为
\[ -2^{N-1}\le S\le2^{N-1}-1 \]
8 bit 二补码范围是 −128~127。
图 6-3 把同一组 4 bit
位模式放在无符号数轴和二补码数轴上。1000~1111
在两种解释下数值不同,但比特没有变化。
图 6-3 4 bit 位模式在无符号编码中表示 0~15,在二补码中表示 −8~7
11. 怎样求一个数的二补码负值
在固定 \(N\) bit 宽度内,把一个非零数变成其相反数:
- 每一位取反;
- 结果加 1;
- 丢弃超出 \(N\) bit 的最高进位。
以 8 bit 的 \(+18\) 为例:
+18 0001 0010
逐位取反 1110 1101
加 1 1110 1110 → -18
验证时把两者相加:
0001 0010
+1110 1110
-----------
1 0000 0000
保留低 8 bit 得到 0,说明两者互为相反数。
对于二补码负数,也可以直接使用最高位负权重。例如
\[ 11101110_2=-128+64+32+8+4+2=-18 \]
12. 符号扩展和零扩展
把较窄数据送入较宽总线时,需要扩展位宽:
- 零扩展(zero extension):无符号数在左侧补 0;
- 符号扩展(sign extension):二补码数在左侧复制原最高符号位。
例如 8 bit 的 1110 1110 表示 −18。扩展到 16 bit
时应写成
1111 1111 1110 1110
若错误地在左侧补 0,就会变成正数 238。符号扩展保持数值,是因为新增位继续承担负权重与高位正权重的组合。
13. 进位不等于有符号溢出
有符号溢出(signed overflow)表示真实结果超出 \(N\) bit 二补码范围。两个同号数相加却得到异号结果时发生溢出:
- 正数 + 正数得到负符号;
- 负数 + 负数得到正符号。
图 6-4 最高位进位用于无符号范围判断;二补码溢出由操作数与结果符号关系判断
4 bit 例子:
0111 (+7)
+ 0011 (+3)
------
1010 (按二补码解释为 -6)
真实结果 +10 超出 4 bit 二补码的 −8~+7,发生有符号溢出。这个判断与是否出现最高位进位不是同一问题。
硬件还常用“符号位的进位输入与进位输出异或”检测二补码溢出;第 9 章讲加法器时再推导。
14. 选学:定点数——把二进制小数点放在约定位置
数字寄存器不存储一个实体小数点。定点数(fixed-point number)约定最低 \(F\) 位表示小数部分,位模式先按无符号或二补码整数解释,再除以 \(2^F\):
\[ X=I\times2^{-F} \]
\(I\) 是同一位模式的整数解释,\(F\) 是小数位数,\(X\) 是实际数值。最低有效位对应的分辨率为
\[ \Delta=2^{-F} \]
例如 8 bit 无符号数据、小数位数 \(F=4\):
0011 0100 = 52
X = 52 / 16 = 3.25
若同样采用 8 bit 二补码且 \(F=4\):
1110 1000 = -24
X = -24 / 16 = -1.5
不同资料对 Qm.n
中是否计入符号位存在差异。接口文档直接写“总位宽、是否有符号、小数位数
\(F\)”最清楚。
定点数增加 \(F\) 会提高分辨率,但在总位宽不变时压缩整数范围。选择格式就是在范围与精度之间分配有限比特。
15. 选学:BCD——每个十进制数字单独编码
二进制编码十进制(binary-coded decimal, BCD)用 4 bit 表示一个十进制数字 0~9:
| 十进制数字 | BCD |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| … | … |
| 9 | 1001 |
1010~1111 在单个 BCD 数字中非法。十进制 59 的 BCD 是
0101 1001,而普通二进制 59 是 0011 1011。BCD
适合十进制显示、计费等需要保持十进制数字边界的场景,位利用率低于纯二进制。
16. 选学:格雷码——相邻代码只改变一位
格雷码(Gray code)安排代码顺序,使相邻数值只改变 1 bit。这可降低多位同时翻转在异步采样、位置编码器或时钟域交界处产生不一致中间码的机会。
4 bit 二进制 \(B\) 转反射格雷码 \(G\) 的关系为
\[ G=B\oplus(B\gg1) \]
\(\oplus\)
表示逐位异或,>>1 表示右移一位并在左侧补
0。此处先把异或理解为“两位不同输出 1,相同输出 0”;第 7
章会正式介绍。
17. 选学:独热码——用更多位换取简单判定
独热码(one-hot code)用 \(N\) bit 表示 \(N\) 个状态,并要求合法状态中恰好只有 1 bit 为 1:
状态 S0 0001
状态 S1 0010
状态 S2 0100
状态 S3 1000
它比二进制状态编码使用更多触发器,但判断某个状态只需查看一位,组合逻辑可能更简单。第 16 章状态机会重新比较独热码与二进制状态编码。
图 6-5 将普通二进制、BCD、格雷码和独热码放在同一张图中。比较时先问编码对象:是整数、十进制数字、相邻位置还是互斥状态。
图 6-5 二进制、BCD、格雷码和独热码使用相同比特符号,却针对不同表示目标
18. 位序、总线和接口说明
多比特信号常写成 data[7:0],表示从 bit 7 到 bit 0 的 8
bit 总线。bit 7 是否为符号位,取决于该信号是否按二补码解释。
位序还可能指数据在存储器字节中的排列,即大端和小端。那是“多个字节怎样排地址”的问题,与单个字节内部 bit 7、bit 0 的权重不是一回事。本章先固定单个数值内部的 MSB/LSB 概念,存储器章节再讨论字节组织。
一个清楚的接口说明示例:
temperature[11:0]:12 bit 二补码定点数,小数位数 \(F=4\),LSB=0.0625 °C,有效范围 −128.0~+127.9375 °C。
这里同时给出位宽、符号、缩放和单位,接收模块不需要猜测。
19. 完整例题
例题 1:二进制、十进制和十六进制转换
把 1011 0110 转成十进制和十六进制。
按无符号位权展开:
\[ 128+32+16+4+2=182 \]
每 4 bit 分组:
1011 0110
B 6
因此
\[ (10110110)_2=(182)_{10}=(B6)_{16} \]
变式:若把相同 8 bit 按二补码解释,数值为 \(182-256=-74\)。
例题 2:求 −37 的 8 bit 二补码
先写 +37:
0010 0101
取反并加 1:
1101 1010
+ 1
---------
1101 1011
所以 −37 的 8 bit 二补码为 1101 1011。用负权重验证:
\[ -128+64+16+8+2+1=-37 \]
变式:扩展到 12 bit 时复制符号位,得到
1111 1101 1011。
例题 3:判断二补码加法溢出
用 8 bit 二补码计算 \(100+45\) 是否可表示。
0110 0100 (+100)
0010 1101 (+45)
---------
1001 0001
两个操作数都是正数,结果最高位却为 1,按 8 bit 二补码解释为负数。真实和 145 超过最大值 127,因此发生有符号溢出。
变式:若按 8 bit 无符号数解释,100+45=145,可正常表示;同一加法位模式是否出错取决于数据解释。
例题 4:解释定点位模式
某 10 bit 二补码定点信号,小数位数 \(F=3\),位模式为
11 1101 0100。求实际值和分辨率。
先按 10 bit 二补码解释。无符号值为 980,减去 \(2^{10}=1024\):
\[ I=980-1024=-44 \]
再除以 \(2^3=8\):
\[ X=-44/8=-5.5 \]
分辨率为
\[ \Delta=2^{-3}=0.125 \]
结果检查:最低 3 bit 表示八分之一量级,−5.5 正好是 0.125 的整数倍。
20. 常见误区与反例
误区 1:最高位为 1 就一定表示负数
只有按二补码等有符号规则解释时,最高位才承担符号作用。无符号
11111111 是 255。
误区 2:十六进制字母是新的数据类型
十六进制只是更紧凑的位模式书写方式。0xB6 与
0b10110110 保存相同比特。
误区 3:二补码负数就是把最高位设成 1
二补码的全部位共同决定数值。求负值应在固定位宽内取反加 1,或使用最高位负权重计算。
误区 4:有最高位进位就表示有符号溢出
进位用于无符号范围判断;二补码溢出看同号操作数是否得到异号结果。两者可以独立发生。
误区 5:定点数的小数点存储在寄存器里
寄存器只存比特。小数点位置由接口约定的 \(F\) 决定,模块两端必须采用同一缩放规则。
误区 6:BCD 59 等于普通二进制 59
BCD 按十进制数字分组,59 写成 0101 1001;普通二进制 59
是 0011 1011。
误区 7:前导 0 没有任何意义
前导 0 不改变无符号数值,却声明位宽。0011 和
00000011 可能占用不同规模的硬件接口。
21. 工程中的实际意义
位宽决定寄存器数量、加法器规模、连线数量、存储容量和动态功耗。多 1 bit 可能扩大数值范围,也会增加硬件代价。符号性和定点缩放若在模块之间不一致,仿真仍会传递合法比特,却得到完全错误的物理意义。
硬件规格、RTL 端口、验证参考模型和软件驱动必须共享同一编码约定。一个可执行的接口说明应把位宽、符号、范围、缩放、非法码和复位值写完整。
22. 本章知识链
多个逻辑 0/1 组成 N bit 位模式
↓ 选择基数和位权
无符号整数 ↔ 二进制 ↔ 十六进制
↓ 选择符号解释
二补码范围与符号扩展
↓ 固定位宽运算
进位与有符号溢出
↓ 约定缩放
定点范围与分辨率
↓ 针对特定目标编码
BCD、格雷码、独热码
↓ 写入接口合同
位宽、符号、位序、缩放、合法码
23. 本章小结
- 位权制用数字位置和基数的幂共同确定数值。
- \(N\) bit 无符号数范围为 0~\(2^N-1\)。
- 每个十六进制数字对应 4 bit,适合紧凑阅读硬件数据。
- 二补码最高位权重为 \(-2^{N-1}\),范围是 \(-2^{N-1}\)~\(2^{N-1}-1\)。
- 固定位宽内取反加 1 可求相反数;扩宽负数时复制符号位。
- 最高位进位与有符号溢出是不同判断。
- 定点数按 \(X=I2^{-F}\) 解释,\(F\) 在范围与分辨率之间分配比特。
- BCD 保持十进制数字边界,格雷码使相邻代码只变一位,独热码用更多位简化状态判定。
- 同一位模式可以有多种含义,接口必须明确位宽、符号、位序、缩放和编码。
24. 练习
24.1 基础题
- 写出 8 bit 位模式
0101 1011的无符号十进制值和十六进制表示。 - 把十进制 73 转成 8 bit 二进制和十六进制。
- 写出 5 bit 无符号数和 5 bit 二补码数的范围。
1111 0000分别按 8 bit 无符号数和二补码解释时是多少?- 求 −25 的 8 bit 二补码,并扩展为 12 bit。
- 说明 MSB、LSB、零扩展和符号扩展。
24.2 计算与分析题
- 8 bit 无符号数 250 与 20 相加,低 8 bit 结果和进位分别是什么?
- 判断下列 8 bit 二补码加法是否溢出:60+50、−70+(−50)、−40+25。
- 某 12 bit 无符号定点数小数位数 \(F=5\)。求分辨率、最小值和最大值。
- 8 bit 二补码定点位模式
1101 1000,\(F=3\)。求实际值。 - 分别写出十进制 42 的普通 8 bit 二进制和两位 BCD。指出两者位模式为何不同。
- 将 4 bit 二进制
1011按 \(G=B\oplus(B\gg1)\) 转为格雷码。 - 一个 6 状态控制器采用二进制编码至少需要多少 bit?采用独热码需要多少 bit?各有什么直接代价?
24.3 综合题
- 为一个温度采样接口制定数据格式:范围至少覆盖 −40.0~+125.0 °C,分辨率不差于 0.125 °C,采用二补码定点数。选择总位宽和 \(F\),给出可表示范围、LSB、−40.0 °C 与 +125.0 °C 的编码,并写出一段完整接口说明。
- 某 8 bit 总线位模式为
1001 0110。分别按无符号整数、二补码、两位 BCD 和 8 bit 无符号定点数(\(F=4\))解释;指出哪些解释合法,并说明这个例子为何证明“比特不自带含义”。
展开查看练习答案
- \(64+16+8+2+1=91\),十六进制为
0x5B。 - \(73=64+8+1\),所以为
0100 1001,十六进制0x49。 - 5 bit 无符号范围 0~31;5 bit 二补码范围 −16~15。
- 无符号为 240;二补码为 \(240-256=-16\)。
- +25 为
0001 1001,取反加 1 得1110 0111。符号扩展到 12 bit 为1111 1110 0111。 - MSB 是最高有效位,LSB 是最低有效位。零扩展在左侧补 0,适用于无符号数;符号扩展在左侧复制二补码符号位,以保持有符号数值。
- \(250+20=270=256+14\)。低 8 bit 为
0000 1110,进位为 1。 - 60+50=110,在范围内,不溢出;−70−50=−120,在范围内,不溢出;−40+25=−15,不溢出。若把第二题改为 −70−70=−140,则超出 −128 并溢出。
- 分辨率 \(2^{-5}=1/32=0.03125\)。最小值 0,最大值 \((2^{12}-1)/32=4095/32=127.96875\)。
1101 1000的二补码整数为 \(216-256=-40\),实际值为 \(-40/8=-5.0\)。- 普通二进制 42 为
0010 1010;两位 BCD 为0100 0010。普通二进制按整体位权编码 42,BCD 分别编码十位数字 4 和个位数字 2。 1011 >> 1 = 0101,逐位异或得到1110。- 二进制编码至少需要 \(\lceil\log_2 6\rceil=3\) bit;独热码需要 6 bit。独热码使用更多存储位,但状态检测常更直接;二进制节省位数,但下一状态与译码逻辑可能更复杂。
- 取 \(F=3\) 可得到 0.125 °C
分辨率。为覆盖 +125.0,缩放整数需到 1000;为覆盖 −40.0 需到 −320。11 bit
二补码整数范围 −1024~1023,缩放后为 −128.0~+127.875
°C,满足要求。−40.0 对应整数 −320,11 bit 编码为
110 1100 0000;+125.0 对应整数 1000,编码为011 1110 1000。接口说明可写:temperature[10:0]为 11 bit 二补码定点数,\(F=3\),LSB=0.125 °C,有效数值范围 −128.0~+127.875 °C。 - 无符号整数为 150;二补码为 \(150-256=-106\);两位 BCD 中高四位 1001=9、低四位 0110=6,因此合法并表示十进制 96;无符号定点 \(F=4\) 为 \(150/16=9.375\)。四种解释都合法但含义不同,说明位模式必须配合编码合同解释。
25. 自测清单
26. 下一章衔接
本章规定了比特怎样表示数据。下一章将研究逻辑表达式本身:怎样用布尔代数和德摩根定律变换函数,怎样从真值表得到标准表达式,以及怎样用卡诺图减少门和晶体管数量。第 5 章的串并联对偶会在布尔代数中得到正式解释。