Skip to content

第一章 - 数字系统和信息

约 2329 个字 预计阅读时间 8 分钟

计算机系统设计的抽象层次

现代计算系统典型的抽象层次
算法
编程语言
操作系统
指令集结构
微结构
寄存器传输
逻辑门
晶体管电路

抽象的一个重要特点是修改低层抽象不需要改变它上层的内容。

本课程主要关心从逻辑门到操作系统的抽象层次,重点关注从硬件到硬件与软件之间的接口的设计。

数字系统、计算机及其他

模拟信号和数字信号

模拟信号 (analog signal) 和数字信号 (digital signal) 是携带信息的两种信号。

模拟信号在数值和时间上都是连续的 (continuous),而数字信号在数值和时间上都是离散的 (discrete)。

数字系统

数字系统 (digital system) 基于离散的输入信息和离散的内部信息(即系统状态),生成离散的输出信息。

一个嵌入式系统的模块图如下:

模拟数字转换器

模拟数字转换器 (Analog-To-Digital Converters, ADC) 将(连续的)模拟信号转换为(离散的)数字信号。它为传感器的模拟世界和信号处理的数字世界建立了联系。

ADC 的结果是比特串,例如 010, 110, 100, 001

信息表示

信号

当前绝大多数电子数字系统的信号都采用两个离散值,称为二进制 (binary, BIN)。

二进制的两个值可以抽象为:

  • 数字:0 和 1
  • 逻辑: (TRUE, T) 和 (FALSE, F)
  • 电平: (HIGH, H) 和 (LOW, L)

一般地,我们约定 T 和 1 表示高电平,F 和 0 表示低电平。这种约定称为正逻辑 (positive logic)。

二进制的两个值由物理量的值或值的范围决定。

由电压决定的 1 位信号

阈值区域 (throshold region) 内的电压所对应的电平是未定义的,会导致该位的状态无效,这被称为浮动 (floating)。

如果输出引脚的电压在此范围内浮动,那么其输出的信号将是不确定的,会在高电平和低电平间波动。

可以发现,输入和输出信号对电压的容差是不同的。输入信号的电压容差宽于输出信号的电压容差,这是为了保证电路在不断变化和存在不良噪声 (noise) 的情况下仍能正常工作。

输入和输出信号的电压容差间的差异被称作噪声容限 (noise margin)。

使用二进制的原因

  • 电子元件天然具有双态性。
  • 一个开关要么开,要么关
  • 一个晶体管要么导通,要么不导通
  • 二进制所需的电路最少,从而占用的空间最少、能耗最少、成本最少。

例如为了表示 100 以内的数字,用十进制表示需要 20 个状态,二进制只需要 14 个状态。

Note

事实上从这一点出发,理论最优的进制应当是 \(e\) 进制,理论最优的整数进制应当是三进制。但三进制与电子元件的双态性相悖,故难以在现实中大规模应用。

数制

数制 (number systems) 是通过一个正数作为基底 (radix, base) 和各位数码来表示所有数字的系统。

一个基底为 \(r\) 的进制系统使用 \(r\) 个不同的数码:\(0, 1, \cdots, r - 1\),并可以用如下 \(r\) 的不同次幂的多项式表示:

\[A_{n - 1}r^{n - 1} + \cdots + A_{1}r^{1} + A_{0}r^{0} + A_{-1}r^{-1} + \cdots + A_{-m}r^{-m}\]

其中,\(0 \leq A_{i} < r\)

采用按位计数法表示数字时,上式对应的数字即为:

\[A_{n - 1} \cdots A_{1}A_{0}.A_{-1} \cdots A_{-m}\]

其中,\(.\)小数点 (radix point),\(A_{n - 1}\)最高有效位 (most significant digit, MSD),\(A_{-m}\)最低有效位 (least significant digit, LSD)。

进制转换

常用进制

进制 基底 数码
二进制 2 0, 1
八进制 (Octal, OCT) 8 0, 1, 2, 3, 4, 5, 6, 7
十进制 (Decimal, DEC) 10 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
十六进制 (Hexadecimal, HEX) 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

转换方法

  • 转换整数部分:用目标基底除原数,并记录余数,重复这一过程。将所有余数逆序排列即可得到原数在目标基底下的整数表示。
  • 转换小数部分:重复用目标基底乘该数,并记录乘积的整数部分,重复这一过程。将所有整数部分正序排列即可得到原数在目标基底下的小数表示

大部分十进制下的有限小数在转换为二进制(八进制、十六进制)后会变为无限小数。一般的,我们会指定小数部分的保留位数,并四舍五入或截断得到一个含有限位小数的数字。

Note

这里放一下小数部分在有限位进制转换时不能被精确表示的原因:

需要注意的是,这种由小数进制转换产生的数值差异,是出现计算误差的关键因素。

二进制编码

需要编码的信息通常可以分为两类,对应二进制编码的需求也有所不同:

  • 数字
    • 需要涵盖所表示数据的全部范围
    • 能够满足简单、普遍的运算
    • 和二进制数值本身有紧密关联
  • 非数字
    • 因为不需要满足运算法则而相对灵活,只需保证信息和编码间构成双射
    • 和二进制数值本身不需要有紧密关联

根据编码的方式,可以将二进制编码分为以下两类:

  • 有权码:二进制每位都有确定位权值的编码
  • 无权码:二进制每位没有确定位权值的编码

有权码的优势在于编码和数字间有固定的计算方式。

BCD 码

BCD 码 (binary-coded decimal),又称 8, 4, 2, 1 码,是一种用二进制对十进制数字编码的常用形式,其直接用十进制数作进制转换后得到的二进制数作为编码。

显然 BCD 码是一种有权码。

十进制数字 BCD 码 十进制数字 BCD 码
0 0000 5 0101
1 0001 6 0110
2 0010 7 0111
3 0011 8 1000
4 0100 9 1001

余三码

余三码 (Excess-3 code) 是对 BCD 码的改进。其核心思路是在 BCD 码的基础上,增加一个大小为 3 的偏移量。这导致余三码是一种无权码。

这种编码方式的优势在于,十进制下相加进位的两个数,在余三码下相加也刚好进位。同时,余三码还是一种补码,和为 \(10\) 的两个数的编码可以通过按位取反得到,这可以使计算更加便携。

十进制数字 余三码 十进制数字 余三码
0 0011 5 1000
1 0100 6 1001
2 0101 7 1010
3 0110 8 1011
4 0111 9 1100

8, 4, -2, -1 码

8, 4, -2, -1 码即通过给二进制的前四位分别赋权 \(8, 4, -2, -1\),从而通过计算得到在该位权下与原十进制数字相等的数码。

8, 4, -2, -1 码是一种有权码,同时其还是一种补码。

十进制数字 余三码 十进制数字 余三码
0 0000 5 1011
1 0111 6 1010
2 0110 7 1001
3 0101 8 1000
4 0100 9 1111

独热码和独冷码

独热码 (one-hot code) 指的是只有一个比特为 1,其他全为 0 的一种编码;对应的可以定义独冷码 (one-cold code)。一种可能的独热码与独冷码编码如下:

十进制数字 独热码 独冷码
0 0001 1110
1 0010 1101
2 0100 1011
3 1000 0111

独热码或独冷码的优势在于,决定或改变状态机当前状态的成本很低,容易设计也容易检测非法行为等。相应的,其缺点在于信息表示率很低,非法状态多、有效状态少,对存储的浪费较为严重。

Warning

需要注意的是,不能将数制转换编码混为一谈。

字符编码

目前国际上采用的字母数字字符的标准编码为 ASCII (American Standard Code for Information Interchange)。它采用 7 位二进制编码,可表示 128 个字符,其包含内容如下:

  • 可打印字符(94 个)
    • 大写字母(26 个)
    • 小写字母(26 个)
    • 阿拉伯数字(10 个)
    • 特殊可打印字符(32 个)
  • 不可打印字符(34 个)

特别的,如果在 ASCII 下作字母大小写转换,只需对编码的第 6 位取反。

考虑到一个字节有 8 位,往往会在 ASCII 前用第 8 位作校验位。

错误侦测

冗余

在真实的通信系统中,编码既包括信源编码 (soruce coding),还包括信道编码 (channel coding)。

在信道编码中,由于噪声的存在,可能导致编码在传输过程中发生变化。因此建立一个错误侦测 (error-detection) 机制就显得很重要。

一种常见的方法是冗余 (redundancy),即在传输过程中加入一些额外的信息用以校验。

校验位

为了检测出数据传送过程中可能出现的错误,通常在二进制编码中额外加上一个校验位 (parity bit)。

最常见的校验方式是 偶校验 (even parity) 和奇校验 (odd parity)。

在偶校验下,当字符编码中 1 的个数为偶数时,校验位为 0;奇校验则反之。一个例子如下:

偶校验 奇校验
1000001 01000001 11000001
1010100 11010100 01010100

一般应用中只需要采用奇偶校验中的一种,偶校验用得更广泛。

Warning

在做题过程中,请一定注意题目要求的是偶校验还是奇校验,以及校验位是加到原编码的最高位前还是最低位后!

格雷码

格雷码 (Grey code) 指的是这样一类编码:对于任意相邻的两个数,其编码只有一位不同。

格雷码的编码方式不止一种。最常见的是二进制反射格雷码 (binary reflected Grey code),其编码方式极其简洁:

\[n_\text{grey} = n\ \mathrm{XOR}\ (n >> 1)\]

得益于格雷码的特性,其在工程领域应用广泛,对减小能耗起到了一定的作用。