ENGG1310 P2.2 Data, Logic Gates & Binary Computation
课程内容笔记,自用,不涉及任何 assignment,exam 答案
Notes for self-use, do not include any assignments or exams
Data Representations
这里可以和前面介绍的数字信号/模拟信号进行联系
在这里我们将介绍数据的两种表征方式 (data representation): Analogue (模拟) 与 Digital (数字)
-
Analog Data
Analog Data 在时间轴上取值连续 (continuous)
现实生活中的大部分数据,例如气压,亮度,湿度,温度等等,都是 analog 的
Analog System 可以储存或处理 Analog Data -
Digital Data
Digital Data 在时间轴上取值离散 (discrete),且在不同的时间单元上取值不同
在电脑内部进行存储与处理的数据几乎都是 Digital Data (更具体的说,是 Binary Data) -
Digital Abstraction
Digital Abstraction 将所有的信号抽象成两个离散值 (2 discrete values),一般是 \(0/1\) (True/False)
这样的好处是
-
Analog-to-Digital Conversion
实际中的数据大多是 Analog 的,然而电脑只能处理 Digital 的数据
为了令电脑能储存并处理 Analog 的数据,我们需要将 Analog Data 转为 Digital Data
我们通过 Sampling 与 Quantization 来实现这个过程
Sampling 是指,recording an analog signal at regular discrete units of time (例如,每 \(3\) 秒记录一次)
Quantization 是指,将所有的 analogue value 映射到一个有限的 digital value set 中去 -
Analog-to-Digital Converter (ADC)
一个能够对 Analog Data 进行 Sampling 与 Quantization,并将其转化为 Digital Data 的装置,被称为 Analog-to-Digital Converter (ADC)
1-bit ADC 将 Analog Data 转化为 Binary Data
ADC 将决定 Binary Data \(0/1\) 所代表的- logical states:例如 \(0/1\) 代表 高/低,冷/热,关/开
- output voltage:在实际的电路设计中,\(0/1\) 将被两个不同的电压表示,一般来说,\(0\) 与 \(1\) 的代表电压分别是 minimum/maximum allowable voltage
在 Analog-to-Digital 的转化过程中,无论是 sampling 还是 quantization 都会造成信息的错误与丢失 (errors & loss of information)
转换之后的信息与原信息的差异被称为 quantization error/noise (量化错误/量化噪声)
虽然 ADC 会导致 loss of information,但是 digital data processing 有其独特的优越性
-
Digital-to-Analog Converter (DAC)
DAC 将 Digital Data 转化为有着连续物理性质的 Analog Data
例如耳机:其接收到的数据是 Digital Data,但输出的是表现为 Analog Data 的声音
Binary Computation
-
Binary Representation
二进制数据 Binary Data 由若干个 \(0\) 与 \(1\) 表示:这些数字也被称为 比特 (bits) (bits 是 binary digits 的缩写)
binary/logic value \(0\) 被 low voltage 所代表 (\(0-0.5V\) 或接地)
binary/logic value \(1\) 被 high voltage 所代表 (\(5-5.5V\)) -
Binary Digits: Bits
一个二进制数 binary digits 被称为 比特 bits,它是电脑系统中最基础的信息单元
一个比特只能代表 \(1/0\),其所对应的 electrical status 是开或者关 -
Binary numbers
binary numbers (二进制数) 以 比特串 (bit-string) 的形式表示
文本,图像这些数据类型均可用比特串进行表示,之后在计算机中进行存储与处理
一个长度为 \(n\) 的比特串可以表示 \(2^n\) 个不同的值
所有现代计算机均 work on binary numbers of data -
Binary Coding 二进制编码
一个二进制编码方案必须满足以下要求- Uniqueness:不同的值必须被不同的二进制编码表示
- Standardization:二进制编码方案必须是标准化的,这样才能在不同的环境下进行应用
- Compatibility
-
Representation of Decimal Numbers
公式 \(\sum_{i=0}=B^{i}d_i\)
其中 \(B\) 被称为 base number,迭代的 \(i\) 被称为 \(d_i\) 的 position number,这种表达方式被称为 positional-value (PV) system
\(i\) 由 least significant digit (最右侧) 迭代到 most significant digit
任意 \(B\) 进制的数转换为十进制都遵循这一规律 -
Decimal to Binary/Hex
短除法,在 remainder < base 条件下结束
通过短除法得到的结果:所有的 remainder 由下至上写出来 -
Binary \(\iff\) Hexadecinal
二进制数和十六进制数之间的转换遵循这样的规则:
由右到左 (即从 least significat digit 到 most significant digit) 分解,
若二进制转十六进制,则 四位一组,并将这四位二进制数写成对应的一位十六进制数 (若到左端的 MSD 凑不到四个,则补上前缀 \(0\))
若十六进制转二进制,则逐位将一位十六进制数写成对应的二进制数
Number representation
感觉是这堂课中为数不多的干货内容,,,趁着机会好好了解下二进制数的负数表达
-
Unsigned number
一个 \(n\) 位的比特串可以表示 \([0,2^{n-1}]\) 中的所有无符号整数 (unsigned number) -
Signed number
下面我们介绍三种计算机处理符号的方式,分别有- Sign-Magnitude 符号-大小法
- 1's complement 反码法
- 2's complement 补码法
其中,现代的所有计算机都是采用 补码法 2's complement 来表达负数
-
Sign-Magnitude 原码
将比特串的 Most Significant Bit (MSB) 作为符号位 (sign bit),负数取 \(0\),整数取 \(1\)
例:\(\{1110\}_2=-6, \{0110\}_2=6\)
在 Sign-Magnitude 表示法下,一个 \(n\) 位的比特串可以表示数的范围是 \([-(2^{n-1}-1), 2^{n-1}-1]\)
这一表示法虽然最便于人类理解,但是对于机器而言,实现一些运算显得很复杂 (这是符号位的缘故),以加法为例
(当 \(A,B\) 符号不同时,考虑 \(4\) 种情况,\(2\) (\(A,B\) 的正负号情况) \(\times 2\) (\(|A|, |B|\) 的相对大小情况))
并且对于 \(0\) 将会有两种表达:\(+0\) 与 \(-0\) -
1's complement 反码
为了将减法转化为加法,反码出现了:我们知道对于 \(n\) 位二进制数,减去某个数 \(x\) 等于加上 \(2^{n}-x\)
然而在计算 \(2^n-x\) 的过程中仍然要用到减法;幸运的是,对于二进制表示,对 \(x\) 取反码 \(\overline{x}\) 实际上等于 \(2^{n}-1-x\)
反码表示法应运而生:对于正整数,其反码等于自身原码;对于负整数,其反码等于其原码除符号位以外的所有位数翻转
例:\(\{00010111\}_2=23_{1's}, \{11101000\}_2=-23_{1's}\)
同样,在 1's complement 表示法下,一个 \(n\) 位的比特串可以表示的数的范围是 \([-(2^{n-1}-1), 2^{n-1}-1]\)
反码表示法用来运算加法简单一些:
但是,这种方法对于 \(0\) 仍然有两种表达 \(+0=\{0...0000\}_2\) 与 \(-0=\{1...1111\}\) -
2's complement 补码
在反码表示的加法中,我们仍然要通过讨论是否进位对结果进行修改 \(+1\);这是由于 \(\overline{x}=2^{n}-1-x\)
那么如果我们定义补码 \(\widetilde{x}=2^{n}-x\),在进行加法时就无需修改结果了:因此 \(\widetilde{x}=\overline{x}+1\)
对于正整数,其补码等于自身原码;对于负整数,其补码等于其反码 \(+1\)
例:对于 \(-7\),我们先写出它的原码 (4-bit 二进制表示) \(\{1111\}_2\),再对除了符号位外的所有位取反 \(+1\) 获得 \(\{1001\}_2\)
对于负整数补码,我们如何得到其原码:只要再进行一次求补 (取反 \(+1\)) 即可
补码表示法可以直接将减法变为加法,其运算最简单 (减去一个数相当于,加上一个负数,相当于加上该负数的补码)
接下来我们对 \(n\) 位二进制补码表示法能表示的数的范围进行研究
在原码与反码表示中,\(0\) 由于符号不同有两种表示 \(+0\) 与 \(-0\),这明显很不自然
而在补码表示中,我们尝试求 \(+0\) 与 \(-0\):显然,\(+0=\{00...0_n\}\)
而对于 \(-0\),我们先写出其原码 \(\{100...0_n\}\),在求反码 \(+1\):此时我们发现会得到一个长度为 \(n+1\) 的串 \(\{100...0_{n+1}\}\)
由于二进制只有 \(n\) 位,MSB 将会被舍弃,于是我们又得到了 \(\{00...0_n\}\):补码完美解决了 \(0\) 有两种表示 \(+0\),\(-0\) 的问题
那么,\(\{100...0_n\}\) 的意义便产生了空缺
根据 \(-(2^{n-1})=(-1)+(-(2^{n-1}-1))=\{10...01\}_{0's}+\{11...11\}_{0's}=\{11...11\}_{2's}+\{10...01\}_{2's}=\{10...0\}_{2's}\) (这里同样溢出了一位 \(1\))
我们规定 \(\{100...0_n\}\) 作为 \(-2^{n-1}\) 的补码 (由于该补码原来是用来表示 \(-0\) 的,我们指定其意义为 \(-2^{n-1}\),因此 \(-2^{n-1}\) 在 \(n\) 位二进制下没有原码和反码,只有补码)
所以,在 2's complement 表示法下,一个 \(n\) 位的比特串可以表示的数的范围是 \([-2^{n-1}, 2^{n-1}-1]\),比原码或反码表示法多一个最小值 \(-2^{n-1}\) (这是由于 \(-0\) 空出的位置) -
总结
对于某一个 \(n\) 位二进制 pattern,若
求 unsigned values: base-position 法
是原码,求对应值:MSB 决定符号,剩余的 \(n-1\) 位进行 base-position 法
是反码,求对应值:MSB 决定符号,剩余的 \(n-1\) 位先取反,得到原码后再进行 base-position 法
是补码,求对应值:MSB 决定符号,剩余的 \(n-1\) 位先取补 (取反 \(+1\)),得到原码后再进行 base-position 法;特殊的,若补码形式是 \(\{100...0\}\),则对应值为 \(-2^{n-1}\)
Logic Gate 逻辑门
同样也有很多干货,介绍了基础的逻辑门
-
The primitive - Logic Gate
逻辑门是对二进制数字信号的最基础控制
基础逻辑门接受 \(1\) 或 \(2\) 个信号,输出 \(1\) 个信号 (complex 逻辑门可接受 \(> 2\) 个信号,但输出信号只有 \(1\) 个)
所有的逻辑运算都能用三个特征表示:真值表 Truth Table,示意图 Schematics 与布尔表达式 Boolean Expression -
Truth Table 真值表
真值表描述对于所有输入,某个布尔函数的所有输出
All possible combinations of inputs are listed.
A truth table uniquely and completely describes a Boolean function. -
非门 NOT gate
-
与门 AND gate
-
或门 OR gate
注意自然语言中的 "或" 与逻辑语言中的 "或" 的区别 -
Other Simple Gate
注意,所有的逻辑函数 (logic function),无论多复杂,都能被 非门,与门,或门 三个基本逻辑门进行表示- 异或门 XOR gate
- 与非门,或非门 NAND,NOR
与门与非门结合,或门与非门结合
很好理解,与非门,或非门的真值表与与门,或门恰好相反;注意示意图中的泡泡 bubble 是非门的特征
- 异或门 XOR gate
-
Combinational Functions
复杂的函数能由简单的函数复合而成
我们定义一个函数是 可复合的 combinational 当且仅当它符合以下的条件- 所有组成它的函数是 combinational 的
- There is no loop in the combination
所谓 loop 循环,就是指某个输出的信号同时又作为输入产生它自身;下面的这个函数有 loop
- 任何一个输入信号只参与产生一个输出信号 (只能多对一,不能一对多)
下面的这个函数,\(a\) 与 \(b\) 同时参与了两个信号的产生,因此不是 combinational 的
-
Hierarchy
直接当成程序里的函数就行了,很好理解:一个函数的输出可以作为另一个函数的输入
函数之间的依赖关系形成了一个 hierarchy
、
-
Precedence 优先级
布尔运算中存在以下的优先级 非-与-或 (与对应乘法 \(\times\),或对应加法 \(+\))
非 NOT 的表示是上划线:例如 \(\overline{A}\) 表示非 \(A\);且,上划线隐式的携带一个括号,例如 \(\overline{A+B}\) 实际上代表的是 \(\overline{(A+B)}\) 即,先计算 \(A\) 或 \(B\) 再对整体取非