本章目录 26 节

← 返回课程首页

第 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. 前置知识快速检查

  1. 一个比特可以取哪两个逻辑值?
  2. 两个独立二值输入共有多少种组合?三个输入呢?
  3. 十进制数 347 中,3、4、7 分别乘以什么位权?
  4. 逻辑 1 为什么不等于固定的物理电压?

若第 2 题不确定,使用“每增加 1 bit,组合数乘 2”:\(N\) bit 一共有 \(2^N\) 种位模式。若第 3 题不确定,先把 347 写成 \(3\times10^2+4\times10^1+7\times10^0\);二进制只需把底数 10 换成 2。

4. 学习目标

完成本章后,你应能够:

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 本身只是一组比特:

硬件不会自动知道设计者想采用哪种解释。模块端口和文档至少要给出:总位宽、是否有符号、位序、定点小数位数或编码名称。

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 位模式放在无符号数轴和二补码数轴上。10001111 在两种解释下数值不同,但比特没有变化。

无符号与二补码解释

图 6-3 4 bit 位模式在无符号编码中表示 0~15,在二补码中表示 −8~7

11. 怎样求一个数的二补码负值

在固定 \(N\) bit 宽度内,把一个非零数变成其相反数:

  1. 每一位取反;
  2. 结果加 1;
  3. 丢弃超出 \(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. 符号扩展和零扩展

把较窄数据送入较宽总线时,需要扩展位宽:

例如 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:十六进制字母是新的数据类型

十六进制只是更紧凑的位模式书写方式。0xB60b10110110 保存相同比特。

误区 3:二补码负数就是把最高位设成 1

二补码的全部位共同决定数值。求负值应在固定位宽内取反加 1,或使用最高位负权重计算。

误区 4:有最高位进位就表示有符号溢出

进位用于无符号范围判断;二补码溢出看同号操作数是否得到异号结果。两者可以独立发生。

误区 5:定点数的小数点存储在寄存器里

寄存器只存比特。小数点位置由接口约定的 \(F\) 决定,模块两端必须采用同一缩放规则。

误区 6:BCD 59 等于普通二进制 59

BCD 按十进制数字分组,59 写成 0101 1001;普通二进制 59 是 0011 1011

误区 7:前导 0 没有任何意义

前导 0 不改变无符号数值,却声明位宽。001100000011 可能占用不同规模的硬件接口。

21. 工程中的实际意义

位宽决定寄存器数量、加法器规模、连线数量、存储容量和动态功耗。多 1 bit 可能扩大数值范围,也会增加硬件代价。符号性和定点缩放若在模块之间不一致,仿真仍会传递合法比特,却得到完全错误的物理意义。

硬件规格、RTL 端口、验证参考模型和软件驱动必须共享同一编码约定。一个可执行的接口说明应把位宽、符号、范围、缩放、非法码和复位值写完整。

22. 本章知识链

多个逻辑 0/1 组成 N bit 位模式
             ↓ 选择基数和位权
无符号整数 ↔ 二进制 ↔ 十六进制
             ↓ 选择符号解释
       二补码范围与符号扩展
             ↓ 固定位宽运算
       进位与有符号溢出
             ↓ 约定缩放
        定点范围与分辨率
             ↓ 针对特定目标编码
       BCD、格雷码、独热码
             ↓ 写入接口合同
位宽、符号、位序、缩放、合法码

23. 本章小结

24. 练习

24.1 基础题

  1. 写出 8 bit 位模式 0101 1011 的无符号十进制值和十六进制表示。
  2. 把十进制 73 转成 8 bit 二进制和十六进制。
  3. 写出 5 bit 无符号数和 5 bit 二补码数的范围。
  4. 1111 0000 分别按 8 bit 无符号数和二补码解释时是多少?
  5. 求 −25 的 8 bit 二补码,并扩展为 12 bit。
  6. 说明 MSB、LSB、零扩展和符号扩展。

24.2 计算与分析题

  1. 8 bit 无符号数 250 与 20 相加,低 8 bit 结果和进位分别是什么?
  2. 判断下列 8 bit 二补码加法是否溢出:60+50、−70+(−50)、−40+25。
  3. 某 12 bit 无符号定点数小数位数 \(F=5\)。求分辨率、最小值和最大值。
  4. 8 bit 二补码定点位模式 1101 1000\(F=3\)。求实际值。
  5. 分别写出十进制 42 的普通 8 bit 二进制和两位 BCD。指出两者位模式为何不同。
  6. 将 4 bit 二进制 1011\(G=B\oplus(B\gg1)\) 转为格雷码。
  7. 一个 6 状态控制器采用二进制编码至少需要多少 bit?采用独热码需要多少 bit?各有什么直接代价?

24.3 综合题

  1. 为一个温度采样接口制定数据格式:范围至少覆盖 −40.0~+125.0 °C,分辨率不差于 0.125 °C,采用二补码定点数。选择总位宽和 \(F\),给出可表示范围、LSB、−40.0 °C 与 +125.0 °C 的编码,并写出一段完整接口说明。
  2. 某 8 bit 总线位模式为 1001 0110。分别按无符号整数、二补码、两位 BCD 和 8 bit 无符号定点数(\(F=4\))解释;指出哪些解释合法,并说明这个例子为何证明“比特不自带含义”。
展开查看练习答案
  1. \(64+16+8+2+1=91\),十六进制为 0x5B
  2. \(73=64+8+1\),所以为 0100 1001,十六进制 0x49
  3. 5 bit 无符号范围 0~31;5 bit 二补码范围 −16~15。
  4. 无符号为 240;二补码为 \(240-256=-16\)
  5. +25 为 0001 1001,取反加 1 得 1110 0111。符号扩展到 12 bit 为 1111 1110 0111
  6. MSB 是最高有效位,LSB 是最低有效位。零扩展在左侧补 0,适用于无符号数;符号扩展在左侧复制二补码符号位,以保持有符号数值。
  7. \(250+20=270=256+14\)。低 8 bit 为 0000 1110,进位为 1。
  8. 60+50=110,在范围内,不溢出;−70−50=−120,在范围内,不溢出;−40+25=−15,不溢出。若把第二题改为 −70−70=−140,则超出 −128 并溢出。
  9. 分辨率 \(2^{-5}=1/32=0.03125\)。最小值 0,最大值 \((2^{12}-1)/32=4095/32=127.96875\)
  10. 1101 1000 的二补码整数为 \(216-256=-40\),实际值为 \(-40/8=-5.0\)
  11. 普通二进制 42 为 0010 1010;两位 BCD 为 0100 0010。普通二进制按整体位权编码 42,BCD 分别编码十位数字 4 和个位数字 2。
  12. 1011 >> 1 = 0101,逐位异或得到 1110
  13. 二进制编码至少需要 \(\lceil\log_2 6\rceil=3\) bit;独热码需要 6 bit。独热码使用更多存储位,但状态检测常更直接;二进制节省位数,但下一状态与译码逻辑可能更复杂。
  14. \(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。
  15. 无符号整数为 150;二补码为 \(150-256=-106\);两位 BCD 中高四位 1001=9、低四位 0110=6,因此合法并表示十进制 96;无符号定点 \(F=4\)\(150/16=9.375\)。四种解释都合法但含义不同,说明位模式必须配合编码合同解释。

25. 自测清单

26. 下一章衔接

本章规定了比特怎样表示数据。下一章将研究逻辑表达式本身:怎样用布尔代数和德摩根定律变换函数,怎样从真值表得到标准表达式,以及怎样用卡诺图减少门和晶体管数量。第 5 章的串并联对偶会在布尔代数中得到正式解释。