处理器芯片的本质是数字电路
0
和1
的芯片
需要先理解信息在数字电路中是如何表示, 处理和存储的
0
和1
的含义0
和1
0
和1
是两个抽象的概念
0
和1
的表示和晶体管有关
金属-氧化物-半导体场效应晶体管(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)
晶体管\(\approx\)生活中的开关
0
和1
CMOS = Complementary MOS = nMOS + pMOS
最简单的CMOS电路:
CMOS将nMOS和pMOS的开关特性转换成输出电压的高低
1
(高电平),
低电压定义为逻辑0
(低电平)我们得到了数字电路中信号的两种基本状态!
光有0
和1
还不够, 还要进行运算
0
和1
进行各种有意义的转换
1
时, n管导通, p管截止, Y点为0
0
时, n管截止, p管导通, Y点为1
这正好是逻辑上的非运算!
1
0
A | B | P1 | P2 | N1 | N2 | Y |
---|---|---|---|---|---|---|
0 | 0 | 导通 | 导通 | 截止 | 截止 | 1 |
0 | 1 | 导通 | 截止 | 截止 | 导通 | 1 |
1 | 0 | 截止 | 导通 | 导通 | 截止 | 1 |
1 | 1 | 截止 | 截止 | 导通 | 导通 | 0 |
这正好是逻辑上的与非运算!
A | B | P1 | P2 | N1 | N2 | Y0 | P3 | N3 | Y |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 导通 | 导通 | 截止 | 截止 | 1 | 截止 | 导通 | 0 |
0 | 1 | 导通 | 截止 | 截止 | 导通 | 1 | 截止 | 导通 | 0 |
1 | 0 | 截止 | 导通 | 导通 | 截止 | 1 | 截止 | 导通 | 0 |
1 | 1 | 截止 | 截止 | 导通 | 导通 | 0 | 导通 | 截止 | 1 |
1
0
A | B | P1 | P2 | N1 | N2 | Y |
---|---|---|---|---|---|---|
0 | 0 | 导通 | 导通 | 截止 | 截止 | 1 |
0 | 1 | 导通 | 截止 | 截止 | 导通 | 0 |
1 | 0 | 截止 | 导通 | 导通 | 截止 | 0 |
1 | 1 | 截止 | 截止 | 导通 | 导通 | 0 |
这正好是逻辑上的或非运算!
或非门的输出连一个非门, 可组成或门
由一对n管和p管并联组成
1
时, P和N均导通, 此时A和B连通0
时, P和N均截止, 此时A和B断开异或(XOR)操作的两种理解:
异
表示不同
, 输入不同结果为1
,
否则为0
或
的基础上, 排除输入均为1
的情况
排斥或
(eXclusive OR)或
也称相容或
,
允许输入均为1
A | B | Y | 描述 |
---|---|---|---|
0 | 0 | 0 | ~A & ~B |
0 | 1 | 1 | ~A & B |
1 | 0 | 1 | A & ~B |
1 | 1 | 0 | A & B |
从真值表得到逻辑表达式的步骤:
1
,
则取输入信号本身; 若为0
, 则取输入信号的非.
对这些信号进行与
, 得到该表项的描述1
的表项,
对这些表项的描述进行或运算即可
异或操作的逻辑表达式为:
Y = A ^ B = (~A & B) | (A & ~B)
在门电路层面, Y=(~A&B)|(A&~B)
在晶体管层面搭建, 效果更优
A=1
时, P2和N2相当于非门; 传输门截止;
故此时Y=~B
A=0
时, P2和N2均截止; 传输门导通;
故此时Y=B
0
和1
的电气特性应当一致
1
所产生的电流,
应当与输出0
所吸收的电流一致
1
时电流经过p管所产生的电压降,
应当与输出0
时电流经过n管所产生的电压降一致
若不满足对等设计原则
, 不同拓扑位置的同一种门电路,
其电气特性可能不同
对等设计原则
使得CMOS电路的使用者只需关心电路逻辑,
而不必过多关心电气特性
回顾之前对#T(x)
的定义, 有
要满足对等设计原则, 门电路中不同位置的晶体管, 尺寸可能不同
单位1
#T(x)
,
记其为门电路x
中包含的等效最小晶体管的数量
非门的拓扑结构是对称的, 采用最小晶体管仍符合对等设计原则
#T(not) = 2
与非门的拓扑结构并非对称
为了满足对等设计原则, 应调整n管, 使得每个n管的电阻是原来的一半
在门电路层面搭建
物理世界并非只有0
和1
,
需要考虑如何用0
和1
来表示各种信息
编码
(encoding)先考虑如何表示自然数
生活中使用十进制(decimal)计数法, 真值可通过加权求和展开式得到:
\[734 = 10^2\times7+10^1\times3+10^0\times4\]
对于\(n\)位\(b\)进制数\(a_{n-1}a_{n-2}\dots a_1a_0\), 其真值为:
\[\sum_{i=0}^{n-1}a_ib^i=a_{n-1}b^{n-1}+a_{n-2}b^{n-2}+\dots+a_1b^1+a_0\]
其中\(b\)称为基(base), \(b^i\)称为每一位的权(weight)
\[\sum_{i=0}^{n-1}a_ib^i=a_{n-1}b^{n-1}+a_{n-2}b^{n-2}+\dots+a_1b^1+a_0\]
令\(b=2\), 并让\(a_i\)只在0
和1
中取值,
得到二进制(binary)计数法:
\[\sum_{i=0}^{n-1}a_i2^i=a_{n-1}2^{n-1}+a_{n-2}2^{n-2}+\dots+a_12^1+a_0\]
例如, 二进制数0b101110
的真值是
\[2^5\times1+2^4\times0+2^3\times1+2^2\times1+2^1\times1+2^0\times0=46\]
需要求出加权求和展开式中各个二进制位\(a_{n-1}a_{n-2}\dots a_1a_0\)
可以将加权求和展开式改写如下: \[\begin{array}{ll} & \displaystyle \sum_{i=0}^{n-1}a_i2^i \\ &=a_{n-1}2^{n-1}+a_{n-2}2^{n-2}+\dots+a_12^1+a_0 \\ &=(a_{n-1}2^{n-2}+a_{n-2}2^{n-3}+\dots+a_1)\times2+a_0 \\ &=((a_{n-1}2^{n-3}+a_{n-2}2^{n-4}+\dots+a_2)\times2+a_1)\times2+a_0 \\ &=\dots \\ &=(\dots((a_{n-1}\times2+a_{n-2})\times2+a_{n-3})\dots)\times2+a_0 \\ \end{array}\]
发现: 如果将十进制数不断除以2, 这个过程中得到的余数就分别对应\(a_0,a_1,\dots,a_{n-1}\)
\[\sum_{i=0}^{n-1}a_i2^i = (\dots((a_{n-1}\times2+a_{n-2})\times2+a_{n-3})\dots)\times2+a_0\]
对于十进制数46
:
2 | 46 -> 0 ^ 低位
+---- |
2 | 23 -> 1 |
+---- |
2 | 11 -> 1 |
+---- |
2 | 5 -> 1 |
+---- |
2 | 2 -> 0 |
+---- |
2 | 1 -> 1 | 高位
+----
0 (商为0, 结束)
将所得余数从高位到低位组合, 得到0b101110
,
即为46
的二进制表示
\[2^5\times1+2^4\times0+2^3\times1+2^2\times1+2^1\times1+2^0\times0=46\]
二进制能被数字电路(门电路)直接处理, 但很难阅读和记忆
0b1011111011101111
计算机领域还通常采用十六进制(hexadecimal)计数法
0~9
以外, 还有a
,
b
, c
, d
, e
,
f
(大写亦可), 数值上分别表示10
,
11
, 12
, 13
, 14
,
15
例如, 十六进制数0xbeef
的加权求和展开式如下: \[16^3\times11+16^2\times14+16^1\times14+16^0\times15=48879\]
数字电路无法直接处理十六进制数
但由于\(16=2^4\), 故能在1位十六进制数和4位二进制数之间快速转换
例如, 对于二进制数0b1011111011101111
,
从右到左每4位分成一组(高位不足4位时补0
),
直接写出每组对应的十六进制数字:
因此, 该二进制数对应的十六进制数即为0xbeef
和二进制表示的0b1011111011101111
相比,
十六进制表示的0xbeef
更加简洁紧凑
译码器 = 一种将\(k\)位输入转换成最多\(2^k\)种不同输出的电路
一类常见的译码器是n选1译码器
1
(独热码(One-hot))例: 2-4译码器
\(A_1\) | \(A_0\) | \(|\) | \(Y_3\) | \(Y_2\) | \(Y_1\) | \(Y_0\) |
---|---|---|---|---|---|---|
0 | 0 | \(|\) | 0 | 0 | 0 | 1 |
0 | 1 | \(|\) | 0 | 0 | 1 | 0 |
1 | 0 | \(|\) | 0 | 1 | 0 | 0 |
1 | 1 | \(|\) | 1 | 0 | 0 | 0 |
按照指定的规则将一种编码的输入转换成另一种编码的输出
1
常见应用: 七段数码管译码器(7-segment decoder)
8
字型排列成的输出元件
a
---
f| g |b input output | |
--- abcdefgh ---
e| |c 0100 01100110 |
--- .h
d
可列出真值表, 推导出每个控制信号的逻辑表达式, 得到电路层实现
功能和n选1译码器相反, 用于将独热码转换成相应的二进制数值
1
的位置例: 4-2编码器
\(A_3\) | \(A_2\) | \(A_1\) | \(A_0\) | \(|\) | \(Y_1\) | \(Y_0\) |
---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | \(|\) | 0 | 0 |
0 | 0 | 1 | 0 | \(|\) | 0 | 1 |
0 | 1 | 0 | 0 | \(|\) | 1 | 0 |
1 | 0 | 0 | 0 | \(|\) | 1 | 1 |
其 | 他 | 情 | 况 | \(|\) | 0 | 0 |
一些运算或模块需要满足一定的前提条件, 才能得到有意义的输出
除数不为0
的前提条件
0
时, 除法运算的结果是未定义的输入为独热码
是编码器正确工作的前提条件
背后的约定:
输入为独热码
具体到数字电路层次, 编码器的输出信号要么为0
,
要么为1
可支持独热码以外的输入, 但只编码优先级最高的位
0
, 则输出最高位的1
的位置0
, 则输出是未定义的
例: 4-2优先编码器
\(A_3\) | \(A_2\) | \(A_1\) | \(A_0\) | \(|\) | \(Y_1\) | \(Y_0\) |
---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | \(|\) | 0 | 0 |
0 | 0 | 1 | X | \(|\) | 0 | 1 |
0 | 1 | X | X | \(|\) | 1 | 0 |
1 | X | X | X | \(|\) | 1 | 1 |
0 | 0 | 0 | 0 | \(|\) | X | X |
根据选择端选择一路输入
例: 2选1多路选择器
\(S\) | \(|\) | \(Y\) |
---|---|---|
0 | \(|\) | \(D_0\) |
1 | \(|\) | \(D_1\) |
译码器生成的独热码作为数据的选择信号, 只有一路数据可以通过与门
#T(2-1 mux) = #T(1-2 dec) + 2#T(and) + #(or) = #T(not) + 2 * 8 + 8 = 26
#T(2-1 mux32) = #T(1-2 dec) + 32(2#T(and) + #(or)) = 2 + 32 * (2 * 8 + 8) = 770
对于数据位宽为\(M\)位的\(N\)选1多路选择器, \(\log_{2}{N}\)-\(N\)译码器的输出只有1位为1
,
且可被\(M\)个\(N\)选1多路选择器复用
\(S\)只会导通其中一个传输门, 另一个截止, 从而实现数据选择功能
检查两个输入的每一位是否完全一致
例: 4位比较器
#T(cmp4) = 4#T(xnor) + #T(and4) = 4 * 6 + (4 - 1) * 8 = 48
#T(cmp32) = 32#T(xnor) + #T(and32) = 32 * 6 + (32 - 1) * 8 = 440
半加器(Half Adder, HA), 输入无进位的加法器
#T(HA) = #T(xor) + #T(and) = 6 + 8 = 14
全加器(Full Adder, FA), 输入有进位的加法器
\(A\) | \(B\) | \(|\) | \(S\) | \(C\) |
---|---|---|---|---|
0 | 0 | \(|\) | 0 | 0 |
0 | 1 | \(|\) | 1 | 0 |
1 | 0 | \(|\) | 1 | 0 |
1 | 1 | \(|\) | 0 | 1 |
可以用两个半加器组成一个全加器
#T(FA) = 2#T(HA) + #T(or) = 2 * 14 + 8 = 36
将低位FA的进位输出作为高位FA的进位输入
行波进位加法器(Ripple-Carry Adder, RCA)
#T(RCA4) = #(HA) + 3#T(FA) = 14 + 3 * 36 = 122
#T(RCA32) = #(HA) + 31#T(FA) = 14 + 31 * 36 = 1130
0
和1
0
和1
的简单运算
0
和1
表示自然数