引言

处理器芯片的本质是数字电路

  • 数字芯片 = 处理数字信号的芯片 = 处理0和1的芯片

 

需要先理解信息在数字电路中是如何表示, 处理和存储的

  • 表示: 数字信号0和1的含义
  • 处理: 门电路和组合逻辑电路
  • 存储: 时序逻辑电路

通过晶体管实现0和1

数字电路由晶体管构成

0和1是两个抽象的概念

  • 在数字电路中, 0和1的表示和晶体管有关

 

金属-氧化物-半导体场效应晶体管(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)

  • 分nMOS(下图, 为侧视图)和pMOS两种
  • 都有栅极, 源极, 漏极

 

晶体管\(\approx\)生活中的开关

  • 栅极的电压\(\approx\)手
  • 源极和漏极\(\approx\)开关连接的两端

  • 通过控制栅极的电压, 来控制源极和漏极是否连通

用高中知识理解晶体管的开关原理

  • 以nMOS为例, 在硅衬底中添加三价元素(如硼)
  • 硼元素容易吸引一个电子后与硅形成共价键, 造成电子的移动
  • 给栅极加电压时, 在绝缘体下方形成电场, 吸引电子聚集在绝缘体下方
  • 聚集的电子足够多, 形成沟道, 连通源极和漏极

  • 根据电气特性, nMOS的功能为
    • 当\(V_G-V_S\)较大时, 源极和漏极导通 - 开关合上
    • 当\(V_G-V_S\)较小时, 源极和漏极截止 - 开关断开

  • pMOS的功能表现相反: \(V_S-V_G\)较大时导通, \(V_S-V_G\)较小时截止

CMOS = 用MOS管的开关特性实现0和1

CMOS = Complementary MOS = nMOS + pMOS

最简单的CMOS电路:

  • A点加高电压时, n管导通, p管截止, 相当于Y点与地相连, 电压低
  • A点加低电压时, n管截止, p管导通, 相当于Y点与电源相连, 电压高

CMOS将nMOS和pMOS的开关特性转换成输出电压的高低

  • 将物理上的高电压定义为逻辑1(高电平), 低电压定义为逻辑0(低电平)

我们得到了数字电路中信号的两种基本状态!

通过晶体管搭建门电路

门电路 = 对状态进行运算

光有0和1还不够, 还要进行运算

  • 通过CMOS电路对0和1进行各种有意义的转换

 

  • 考虑之前的CMOS电路:
    • A点为1时, n管导通, p管截止, Y点为0
    • A点为0时, n管截止, p管导通, Y点为1

 

这正好是逻辑上的非运算!

  • 这个电路就是非门, 也称反相器

另一个门电路

  • P1和P2并联, 其中一者导通时, Y为1
  • N1和N2串联, 两者均导通时, Y为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

或非门和或门

  • P1和P2串联, 两者均导通时, Y为1
  • N1和N2并联, 其中一者导通时, Y为0
A B P1 P2 N1 N2 Y
0 0 导通 导通 截止 截止 1
0 1 导通 截止 截止 导通 0
1 0 截止 导通 导通 截止 0
1 1 截止 截止 导通 导通 0

这正好是逻辑上的或非运算!

 

或非门的输出连一个非门, 可组成或门

传输门

由一对n管和p管并联组成

  • 其中C和C\({}^\prime\)为一对互补的控制信号

 

C C′ A N P B
1 0 0 导通 截止 0
1 0 1 截止 导通 1
0 1 0 截止 截止 断开
0 1 1 截止 截止 断开

  • C为1时, P和N至少有一者导通, 此时A和B连通
  • C为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. 对于真值表中的每个表项, 考虑每个输入, 若为1, 则取输入信号本身; 若为0, 则取输入信号的非. 对这些信号进行与, 得到该表项的描述
  2. 考虑真值表中输出为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

  • 只需要6个晶体管即可实现异或门的功能, 优于门电路层面的搭建方案
  • 类似有同或门, 输入相同为1, 不同为0

全定制电路: 通过晶体管设计电路

  • 全定制电路
    • 所需要的晶体管数量更少, 因此电路面积也更小, 频率更高, 功耗更低
      • 异或门的例子
    • 设计难度大, 开发周期也很长
      • 现代处理器芯片全部使用全定制电路来开发, 是不现实的
  • 半定制电路
    • 基于标准单元的设计方法
      • 预先用全定制方式设计常用的标准单元(如与门, 或门, 触发器等)
      • 再通过这些标准单元构建出大规模电路
    • 基于门阵列的设计方法, 如FPGA

 

  • 现代处理器芯片设计中, 通常用基于标准单元的半定制电路设计方法
    • 只有在追求极致表现时, 才对电路的部分核心模块进行全定制设计

门电路的面积评估

简单的面积评估

仅从功能的角度考虑, 门电路的面积可以通过晶体管的数量来近似表示

 

记#T(x)为门电路x所需的晶体管数, 那么:

#T(not) = 2
#T(nand) = #T(nor) = 4
#T(and) = #T(or) = 6
#T(tg) = 2, tg表示transmission gate, 即传输门

若在门电路层面搭建异或门, 则

#T(xor) = 2#T(not) + 2#T(and) + #T(or)
        = 2 * 2 + 2 * 6 + 6 = 22

 

如果考虑CMOS的电气特性, 那么: 不同位置的晶体管, 其尺寸可能不同

  • 最终导致门电路面积的评估也不同

 

为了更准确地评估面积, 先来讨论电气特性如何影响晶体管的尺寸

CMOS电路的对等设计原则

在CMOS中, 0和1是对称的 => 其电气特性也应当对称

  • 输出1所产生的电流, 应当与输出0所吸收的电流相同
    • 即\(I_{Y=1}=-I_{Y=0}\)
  • 输出1时电流经过p管所产生的电压降, 应当与输出0时电流经过n管所产生的电压降相同
    • 即\(V_{CC}-V_{Y=1}=V_{Y=0}-V_{GND}\)

 

若不满足对等设计原则, 不同拓扑位置的同一种门电路, 其电气特性可能不同

  • \(V_A\)可能不满足第3个非门的栅极电压工作条件, 使Y=~X不成立
    • 需要在A附近添加用于调整电压的电路 => 大规模电路就很复杂

对等设计原则使得CMOS电路的使用者只需关心电路逻辑, 而不必过多关心电气特性

考虑对等设计原则的门电路面积评估

要满足对等设计原则, 就要在不同拓扑位置采用不同尺寸的晶体管, 来实现电气特性的对称性

  • 为了描述不同尺寸的晶体管对电路面积的影响
    • 定义一个最小晶体管模型, 将其面积定义为单位1
    • 为了简化计算, 此处认为最小p管和最小n管的面积相同(实际上前者稍大)
  • 重新定义#T(x), 记其为门电路x中包含的等效最小晶体管的数量

 

考虑非门中晶体管的电气特性:

  • 无论何者导通, 电流只会经过其中一个晶体管, 产生的电压降均相同
  • 均采用最小晶体管时, 符合对等设计原则
  • 故有#T(not) = 2, 与前文结论相同

考虑对等设计原则的门电路面积评估(2)

考虑与非门中晶体管的电气特性:

  • 当n管导通时, 电流需要经过两个串联的晶体管
  • 当p管导通时, 电流在每个并联分支上只需要经过一个晶体管
  • 若n管和p管尺寸相同, 电流对等时, 电流经过两个n管所产生的电压降, 是p管导通时的2倍

  • 当晶体管都采用最小晶体管时, 电压降不满足对等设计原则

 

为了满足对等设计原则, 应调整n管, 使得每个n管的电阻是原来的一半

  • 例如, 增加n管的尺寸, 或将原来的每个n管分别替换为两个并联的n管
  • 也即, 采用最小晶体管时, N1和N2应分别改为两个最小晶体管的并联

因此, 在满足对等设计原则的情况下, 门电路的面积为:

#T(nand) = #T(P1) + #T(P2) + #T(N1) + #T(N2) = 1 + 1 + 2 + 2 = 6
同理可得: #T(and) = 8, #T(nor) = 6, #T(or) = 8, #T(tg) = 2

多输入的门电路

在门电路层面搭建

#T(nand3) = #T(and) + #T(nand) = 8 + 6 = 14
#T(nandN) = (N-2)#T(and) + #T(nand) = 8N - 10
#T(andN) = (N-1)#T(and) = 8(N - 1)
// 呈线性关系

 

在晶体管层面搭建(考虑对等设计原则)

#T(nand3) = 3#T(P1) + 3*#T(N1) = 3 * 1 + 3 * 3 = 12
#T(nandN) = N*1 + N*N = N(N + 1)
#T(andN) = #T(nandN) + #T(not) = N(N + 1) + 2
// 呈二次关系

 

在门电路层面搭建的方案, 面积更优, 但延迟也更大

  • 在一些要优化延迟的场合, 反而会选择面积更大的设计方案
  • 若采用与非门和非门, 面积可更小, 此处不追求最小设计

进位计数法

进位计数法

物理世界并非只有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)计数法

  • 每一位数字有16种可能, 除了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), 直接写出每组对应的十六进制数字:

     1011 1110 1110 1111
      |    |    |    |
      b    e    e    f

因此, 该二进制数对应的十六进制数即为0xbeef

 

和二进制表示的0b1011111011101111相比, 十六进制表示的0xbeef更加简洁紧凑

通过门电路搭建基本组合逻辑电路

译码器: n选1译码器

译码器 = 一种将\(k\)位输入转换成最多\(2^k\)种不同输出的电路

一类常见的译码器是n选1译码器

  • 将\(n\)位输入看成真值\(x\), 使\(2^n\)位输出中仅第\(x\)位为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

#T(2-4 dec) = 2#T(not) + 4#T(and) = 2 * 2 + 4 * 8 = 36
#T(5-32 dec) = 5#T(not) + 32#T(and5) = 5 * 2 + 32 * (5 - 1) * 8 = 1034
#T(10-1024 dec) = 10#T(not) + 1024#T(and10) = 10 * 2 + 1024 * (10 - 1) * 8 = 73748

常用于寻址: 输入地址, 生成相应的有效信号(地址\(\approx\)Excel表中的行号)

译码器: 转码器

按照指定的规则将一种编码的输入转换成另一种编码的输出

  • 和n选1译码器不同, 转码器不限制输出中1的数量

 

常见应用: 七段数码管译码器(7-segment decoder)

  • 七段数码管 = 由7段发光二极管按8字型排列成的输出元件
    • 由8个控制信号控制(7+1个小数点)
    • 只要某控制信号有效, 就会点亮相应的发光二极管
   a
  ---
f| g |b         input    output       |   | 
  ---                   abcdefgh       ---  
e|   |c          0100   01100110          | 
  ---    .h
   d
  • 七段数码管译码器: 将一组4位的输入信号解析为二进制数, 输出一组控制信号, 用于控制七段数码管显示和输入对应的数字

可列出真值表, 推导出每个控制信号的逻辑表达式, 得到电路层实现

编码器

功能和n选1译码器相反, 用于将独热码转换成相应的二进制数值

  • 若输入为\(2^n\)位独热码, 且第\(x\)位为1, 则输出真值为\(x\)的\(n\)位二进制数
  • 若输入不为独热码, 则输出是未定义(undefined)的

例: 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

#T(4-2 enc) = 4#T(not) + 4#T(and4) + 2#(or) = 4 * 2 + 4 * 24 + 2 * 8 = 120
  • 用途: 根据独热码生成地址; 找出独热码中1的位置

理解未定义的输出

一些运算或模块需要满足一定的前提条件, 才能得到有意义的输出

  • 数学上的除法运算, 需要满足除数不为0的前提条件
    • 除数为0时, 除法运算的结果是未定义的
  • 输入为独热码是编码器正确工作的前提条件
    • 输入不为独热码时, 编码器的输出是未定义的

 

背后的约定:

  • 如果编码器的使用者希望编码器能输出正确的结果, 就需要保证输入为独热码
  • 如果不满足前提条件, 算是使用者违反约定
    • 此时编码器的输出是无意义的
    • 如果后续电路使用了这些无意义的输出, 后果由使用者承担

利用未定义情况简化编码器的设计

具体到数字电路层次, 编码器的输出信号要么为0, 要么为1

  • 输出结果未定义时, 无论输出信号取什么值, 都不具备实际含义
  • 编码器的设计者可以为未定义情况下的输出信号取任意值
    • 根据约定, 编码器的使用者不应该让后续电路使用未定义的输出信号

 

\(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
其 他 情 况 \(|\) X X

一种简化的编码器设计

  • 不关心其他情况的输出, 只需要保证在输入为独热码时能得到正确的输出
    • \(Y_0 = A_1 | A_3\)
    • \(Y_1 = A_2 | A_3\)
#T(4-2 enc) = 2#(or) = 2 * 8 = 16

优先编码器

可支持独热码以外的输入, 但只编码优先级最高的位

  • 若输入不全为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

有更简单的电路方案, 但要用到吸收律, 不方便理解, 此处采用更直观的方案

#T(4-2 prioenc) = 2#T(not) + #T(and3) + 2#(or) = 2 * 2 + 16 + 2 * 8 = 36

多路选择器

根据选择端\(S\)选择其中一路数据(\(D_0\)或\(D_1\))

  • 将选择端看作地址,则类似一次寻址操作
  • 用来对数据来源和处理结果进行选择
\(S\) \(|\) \(Y\)
0 \(|\) \(D_0\)
1 \(|\) \(D_1\)

例: 2选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

在处理器中, 选择器是使用频率很高的元件

  • 因为处理器主要用于处理数据, 而数据的来源和处理方式都很多

用传输门实现多路选择器

\(S\)只会导通其中一个传输门, 另一个截止, 从而实现数据选择的功能

#T(2-1 mux) = #T(not) + 2#T(tg) = 2 + 2 * 2 = 6
#T(2-1 mux32) = #T(not) + 32 * 2#T(tg) = 2 + 32 * 2 * 2 = 130

比较器

检查两个输入的每一位是否完全一致

例: 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

1位加法器

半加器(Half Adder, HA), 输入无进位的加法器

S = A ^ B
C = A & B
#T(HA) = #T(xor) + #T(and) = 6 + 8 = 14

全加器(Full Adder, FA), 输入有进位的加法器

S = A ^ B ^ Cin
Cout = (A & B) | (Cin & (A ^ B))
\(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

总结

MOS -> CMOS -> 门电路 -> 组合逻辑电路

  • 用nMOS和pMOS实现开关

 

  • 用MOS管的开关特性实现CMOS中的0和1

 

  • 通过晶体管搭建门电路进行0和1的简单运算
    • not, nand, and, nor, or, tg, xor, xnor

 

  • 用多位0和1表示自然数
    • 二进制计数法, 十六进制计数法

 

  • 通过门电路搭建组合逻辑电路处理信息
    • 译码器, 编码器, 多路选择器, 比较器, 加法器