基本的计算机组成 | Major Components of a Computer
本节概述
- 处理器的核心结构可以概括为: Processor = Control + Datapath + Memory + Interconnect
- 后续 Arithmetic 章节主要关注: Datapath 中的执行单元
- 重点对象包括:
- 加法器
- 乘法器
- 除法器
- 移位器
- ALU

计算机与数字处理器基本结构
- 计算机系统组成Computer = Processor + Memory + Devices
- Processor 处理器
- 负责执行程序,是计算机系统的核心。
- 主要包括:
- Control 控制单元:产生控制信号,决定指令如何执行、数据如何流动。
- Datapath 数据通路:负责数据运算、暂存和传输,是算术逻辑单元所在位置。
- Memory 存储器
- 保存程序和数据。
- 供处理器读取指令、读取数据、写回结果。
- Devices 输入输出设备
- Input 输入设备:键盘、传感器、摄像头等。
- Output 输出设备:显示器、通信接口等。
- Processor 处理器
通用数字处理器抽象
- 基本数据流 Input / Output ↔ Datapath ↔ Memory
- Input / Output:负责与外部设备交换数据。
- Datapath:执行运算、暂存数据、传输数据。
- Memory:存放指令和数据。
- Control:根据指令控制 Datapath 和 Memory 的工作。
Basic Building Blocks
- Datapath 数据通路
- Execution units 执行单元
- Adder 加法器
- Multiplier 乘法器
- Divider 除法器
- Shifter 移位器
- ALU 算术逻辑单元
- Register file 寄存器堆
- 存放处理器内部临时数据。
- Pipeline registers 流水线寄存器
- 在流水线各阶段之间暂存数据。
- Multiplexers 多路选择器
- 在多个输入数据中选择一个输出。
- Decoders 译码器
- 将编码信息转换为控制信号或选择信号。
- Execution units 执行单元
- Control 控制单元
- 负责产生控制信号。
- 常见实现方式:
- FSM 有限状态机
- PLA 可编程逻辑阵列
- ROM
- Random logic 随机逻辑
- Interconnect 互连结构
- 负责模块之间的数据连接与传输。
- 包括:
- Switches 开关
- Arbiters 仲裁器
- Buses 总线
- Memory 存储结构
- 包括:
- Cache 高速缓存
- TLB 地址转换缓存
- DRAM 主存
- Buffers 缓冲器
- 包括:
现代处理器结构风格
- Pipelined, single issue
- 流水线单发射。
- 每个周期通常发射一条指令。
- Superscalar
- 超标量结构。
- 由硬件控制多发射,每周期可发射多条指令。
- VLIW
- Very Long Instruction Word,超长指令字。
- 由软件 / 编译器安排多发射。
- Multithreaded
- 多线程结构。
- 从多个线程中取指令执行,提高硬件利用率。
Datapath Bit-Sliced Organization
多位数据通路 = 重复的一位处理单元 + 统一控制信号。

Adder | 加法器设计
Single-Bit Addition
Half adder & Full Adder

Brute force implementation from eqns | 直接按照公式硬搭majority gate电路

经过优化关键路径后的加法器

- 先计算进位,然后再利用公式计算出求和
- 此种方法会比串行进位加法器速度快,因为串行操作需要三次异或操作
进位加法器设计
进位行为分析
|
|
- Carry status—— 进位状态
只看当前位的 ,判断它对输入进位 做什么:
- Generate 产生进位
- (A=1,B=1)
- 不管 (C_i) 是多少,(C_o=1)
- Propagate 传播进位
- ()
- 输出进位等于输入进位
- Kill / Delete 删除进位
- (A=0,B=0)
- 不管 (C_i) 是多少,(C_o=0)
- Generate 产生进位
- 用 P、G、K 表达加法器:
如果我们知道每一位是 Generate / Propagate / Kill,就可以提前推导高位进位,形成后面的:
- Carry Lookahead Adder
- Carry Skip Adder
- Carry Select Adder
- Prefix Adder
Mirror Adder

核心公式
电路实现
红色网络实际先生成:
- 上拉网络:负责让
- 对应 Kill 和 “0”-Propagate
- 下拉网络:负责让
- 对应 Generate 和 “1”-Propagate
优点
- 不显式生成
- 直接把 Kill / Propagate / Generate 写进晶体管导通路径
- 晶体管数少:24T
- Carry 路径更直接,适合 ripple-carry adder
Mirror Adder 是按进位行为设计晶体管网络:消进位、传进位、产生进位。
Transmission Gate Full Adder
采用传输门的方式来进行全加器的设计

Complementary Pass Transistor Logic | 互补传输晶体管逻辑

速度更快是因为级连数目比较少 但是会占用比较大的面积
Multi-bit Addition
Ripple-Carry Adder 串行进位加法器
把多个 Full Adder,全加器 串起来:

关键路径,延迟随位数线性增加.
具体延迟计算
其中是单个 full adder 中,进位从输入传到输出的延迟,即Ci→Co的延迟,则是最后一级 full adder 中,进位到达后产生 Sum 的延迟。
Inversion Property | 全加器的反向特性

全加器有这样的反相特性——如果把全加器的所有输入都取反,那么输出也会整体取反
真实 CMOS 全加器的 carry 输出往往天然是反相的,如果每一级都加反相器恢复极性,会拖慢 carry critical path;所以让 even / odd 全加器交替使用反相 carry,省掉 carry 路径上的反相器

具体实施操作如下图所示(从右往左看):

A2,B2 需要以反相信号形式进入 odd cell,这样输出的S2才是正值
注意:在符号上的圆圈表示反相输入,并不代表有反相器存在!!
Manchester Carry Chain | 曼彻斯特加法链

此页左边电路就是在实现这个逻辑:
- :传输门打开,直接把 传到 ;
- :上拉到 ,强制 ;
- :下拉到 GND,强制 。
右边本质上是在动态逻辑里实现:

对于第二页,把前面一位 cell 复制 4 次,形成 4-bit carry chain
普通 ripple-carry adder 每一位都要经过一个完整 FA 的 carry 逻辑:
而Manchester Carry Chain 的思路是:先把 提前变成控制信号
这些都先预计算好(在 carry 到来之前就可以算好),然后再来计算carry链
但是如果所有位都是 propagate,那 carry 还是要穿过很多 pass transistor。链太长时,RC 延迟会变大,信号也可能变弱,所以 Manchester carry chain 通常适合做一小段高速 carry 链。 长位宽还要配合分段、buffer、carry-bypass、carry-lookahead 等结构。
Carry-Bypass Adder | 进位旁路/跳过加法器

这个核心思想就是,如果P=1,那进位的输入就等于输出,如果有连续的一个block都是P=1的话,那么实际上就可以直接旁路一开始的,直接传输过来,节省了四个FA的运算时间(以上图作为例子)
如果整个 block(比如选取四个FA作为一个Block) 都是 propagate,就直接跳过;否则说明 block 内部某一位会产生或杀死进位,就走普通 ripple 结果。

那么这个延迟时间计算:
这里:
- :总位数,比如 16 bit;
- :每个 block 的位数,比如 4 bit;
- :提前算 的时间;
- :carry 经过一位 FA 的时间;
- :carry 经过一个 bypass MUX 的时间;
- :最后生成 sum 的时间。
这个公式怎么得出来的(为什么上面的这个式子是最坏情况):
, ,
如果P=1,那么G=0一定成立,所以这个时候Cin = Cout,但如果P=0,那么Co=G,此时就和这一级之前的加法器电路完全无关了,前面的延时不会被加进来
所以说,如果考虑Carry Bypass最坏情况下,应该是,第一个FA电路是P=0,无跳过的;剩下中间N/M-2个FA加法器都走Bypass路径(最后一个加法器不用管进位输出了),那么这样时间就好算了: 是第一个FA的时间,是中间N/M-2个FA加法器 的时间,是对于最后一个加法器,实际上只需要计算剩余的M-1 个位就可以了,第M位是用来计算输出的进位的,但这个不在我们考虑范围内(我们只考虑sum的结果,不考虑sum的进位),所以是,最后再加上sum的计算时间,结果就是
Carry Ripple vs Carry Bypass 对比图

Carry-bypass adder 也会随 (N) 增长,但斜率小一些,因为中间有些 block 可以 bypass;但是 carry-bypass 有额外开销:
所以在位数很小时,它不一定比 ripple 快。图上标的 :通常位数大到一定程度后,carry-bypass 才开始明显优于 ripple。
Carry-Select Adder | 进位选择加法器
核心思想:不等 carry 到了以后再算;先假设 carry-in=0 和 carry-in=1,把两种结果都提前算好。等真实 carry 到达时,用 MUX 选正确的结果——用面积换时间。
|
|
Critical Path 分析 | 关键路径分析
图里把 16-bit 分成 4 个 4-bit block,,每个 block 都提前算两套结果, 所以除了第一个 block 以外,后面 block 的内部 carry 结果其实都已经准备好了,关键路径实际上转换为:
从而有
其中:
- :总位数;
- :每个 block 的位数;
- :计算 的时间;
- :第一个 block 内部产生 carry 的时间;
- :一共有 个 block,所以真实 carry 要经过这么多个 MUX;
- :最后生成 sum 的时间。
这次注意,实际上会经过N/M个mux
细节查看下图蓝线

Square Root Carry Select Adder | 平方根进位选择加法器

前面提到的是等分的block,如果block不等分,而是呈等差数列 逐级递增+1的话,最终计算式子如下:
后面一项在N很大的时候可以忽略
延迟就变成了
当 近似为 时,延迟写成:
因此叫做平方根进位选择加法器
对比关键路径
这个就是把时间和N的关系画了一个图来对比一下,没啥好说的 后面这俩性能比较好

1’s & 0’s Detectors | 全 1 / 全 0 检测器
功能:判断一个多 bit 信号是不是全 1 或全 0
比如 8-bit 输入:,只有当所有位都是 1 时,全 1 检测器输出才是 1:

大 fan-in 门不好做,直接做一个 8 输入 AND,晶体管串并联会很复杂,延迟和面积都不好。
所以课件给了几种实现方式:
- balanced tree:平衡树结构,层数少,比较规整;
- skewed chain:偏斜链式结构,适合某些输入更关键的情况;
- transistor-level detector:直接用晶体管拉高/拉低节点,比如全 0 检测常可以做成 NOR 型结构。
Equality Comparator | 相等比较器
顾名思义。

有意思的一个点是——equality comparator 本质是bitwise XNOR +allones detector,即先采用异或非/同或逻辑,然后去判断这几个位是否全是1,如果不全是1,就说明不相等,那实际上就是全 1 检测器
Magnitude Comparator | 大小比较器

实际上是计算B-A 然后再看符号位和sum值来判断
Counters | 计数器

binary counter|二进制计数器
N-bit binary counter 会按二进制顺序计数:
一个 N-bit counter 有个状态(使用有限状态机来实现——数电内容,时序逻辑电路)

图里的 synchronous counter 是同步计数器,所有寄存器都由同一个 clock 触发,不是一位一位异步翻转。
TC 是 terminal count,终端计数信号;比如向上计数时:Q=1111,再加 1 就溢出回到 0000,这时可以产生 TC。

这张图是一个带功能选择的同步计数器:
- up/down:控制加 1 还是减 1;
- load:允许直接装载外部数据 (D);
- reset:复位;
- enable:允许计数;
- TC:终端计数输出。
LFSR linear-feedback shift register | 线性反馈移位寄存器
LFSR,linear-feedback shift register,线性反馈移位寄存器 也是一个 N-bit 寄存器,但它不是简单加 1,而是:每个时钟把寄存器整体移位,然后把某几位 XOR 的结果反馈到最高位或最低位。
N 位 LFSR 最多可以遍历除全 0 外的所有 个状态,但顺序不是正常二进制递增,而是看起来像随机的伪随机顺序。
Multiplier | 乘法器设计
The Binary Multiplication | 二进制乘法
- 二进制数的按位展开
设 是 位二进制数, 是 位二进制数,则:
,。
其中, 和 都是单个 bit,只能取 或 。 - 乘法的数学展开
乘积为 。
把 和 的按位展开代入:
根据乘法分配律展开:
。
这个式子说明:二进制乘法可以分解成很多个 的部分积相加。

- Partial Product:部分积
每一个 叫做一个 partial product,部分积。
因为 和 都是二进制位,所以 在硬件中可以直接用 AND 门 生成。
也就是:
由于 ,所以部分积 的权重是 。因此, 应该放在第 列
二进制乘法本质上就是:根据乘数的每一位,决定是否加入一行被乘数,并把这一行左移对应位数。
如果某一位 ,就加入一行左移 位的 ;如果 ,这一行就是全
所以乘法可以看成很多行 partial product 的加法

实际上部分积的生成也是很简单——只需要做与运算就可以了
The Array Multiplier | 乘法器阵列


全加器与半加器的应用
实际上每一行的第一个都会用半加器HA,因为不需要进位;
Critical Path | 关键路径

对于一个MxN的阵列乘法器,关键路径(上图是4*4)
其中:
- :生成部分积 的 AND 门延迟;
- :FA / HA 的 carry 输出延迟
- 关键路径信号进入某个 HA / FA 之后,从该输入传播到这个 HA / FA 的 carry 输出的延迟;
- :FA / HA 的 sum 输出延迟;
- 关键路径信号进入某个 HA / FA 之后,从该输入传播到这个 HA / FA 的 sum 输出的延迟;
- :被乘数位数;
- :乘数位数。
关键路径分析
关键路径从某个 partial product 开始,先经过一个 AND 门, 然后信号在阵列里传播,信号会经过很多 FA / HA,"横向"走 是, "竖向"走是;
其实无论走哪一条路径,都是竖向走N-1个加法器,即; 同时对于横向方向,都是走(M+N-1) -1 -1 = (M+N-3)个carry,即
这里的解释是这样的:
对于横向方向,总长度实际上就是M+N-1,即输出位宽是M+N-1,那么横向之间的间隔就有(输出位宽-1)=N+M-2个宽度,然后实际上我们只关系最后一位的sum结果,因此最后一个加法器它的carry时间就不计算在内了,所以再减一,结果就是
因此最终计算得出
Carry-Save Multiplier | 进位保存乘法器
普通 array multiplier 里,每一行加法器内部 carry 会横向 ripple:,所以延迟里会出现很多横向 carry delay 和竖向 sum delay;
Carry-save multiplier 的核心思想是中间累加 partial products 时,不把 carry 立刻横向传播完,每个 FA 做好sum和carry的输出之后,作为一个“carry vector”的一部分保存下来,送到下一层/下一列去处理进位
|
|
(左右对比)
CSA-based Array Multiplier | 基于保留进位加法器的乘法器
这个小节是讲一种具体的实现方案,上面那个Carry-Save Multiplier是一个大类的乘法器结构
CPA指的是进位传播加法器,实际上就是前面的串行加法器的大类
CSA指的是Carry-Save Adder,注意不是前面的进位选择加法器
下图左就是CPA计算过程,每一次计算都会把进位考虑上;右就是CSA计算过程,每次先算出sum和进位 然后再把进位和sum加起来 rnh is my(scy) good son
>
Critical Path
关键路径这里就是 最多累加的地方 当然是x0y3 + x1y2 + x2y1 + x3y0这个累加是最长的路径 然后再加上CPA计算的时间,就是关键路径延迟了
这里假设
Rectangular Array
把斜着的CSA-based Array Multiplier阵列“压扁 / 拉正”,排成一个规整的矩形,方便芯片版图实现
Wallace-Tree Multiplier
这个其实就是作业的那个题,对于4x4的乘法阵列,定制一个Wallace-Tree Multiplier ,如右图所示
Build From CSA-Based Multipler
事实上Wallace-Tree Multiplier 就是一种CSA based 的阵列乘法器,因为全加器就是一种CSA加法器
CSA vs conventional Adder
实际上也没什么区别 只是说全加器的进位在CSA这里也是作为输出,而不是作为下一级全加器的输入
Wallace-Tree Multiplier 的优势与劣势
这张图说明了Wallace-Tree乘法器的速度为什么比普通的CSA链快,是因为普通CSA链也还是有很多的串行逻辑,但是Wallace-Tree节省了一些不必要的串行等待——能把串行CSA的O(N)复杂度压缩到O(logN)的复杂度。在乘法器中使用 Wallace Tree 的目的,是减少加法操作的数量,或者更准确地说,是减少 CSA 链的深度。
但是也有缺点,缺点是连线更复杂,但是也也可以构造 Booth 编码的 Wallace Tree 乘法器。
Shifter | 移位器
移位器 shifter 的几种硬件实现方式
The Binary Shifter
有三个控制信号:
- Right:右移 1 位
- nop:no operation,不移位
- Left:左移 1 位
可以把它理解成一个由传输门/传输晶体管组成的 3 选 1 mux。
A programmable Binary Shifter
表中 、、 是控制信号,通常是 one-hot,也就是三者只能有一个为 1。
注意这里右移的时候高位补0
The Barrel Shifter
Barrel shifter 的思想是:每个输出 都可以从多个输入 中直接选择一个。(任意移动多少个位置,算术移动)
本质上是一个很大的交叉开关阵列。
例如 4-bit barrel shifter 中,每个输出都可能从 中选择,因此会有很多横向数据线、纵向控制线、交叉点开关。
这个结构的面积主要不是被晶体管占掉的,而是被大量连线占掉的。对于 位 barrel shifter,交叉连接规模大约是 ,所以位宽变大以后,布线压力很明显。
Logarithmic Shifter
用多级小移位实现任意移位,不再用一个巨大的全交叉阵列,而是分成若干级,每一级只负责移 位。
ALU | Arithmetic Logic Unit 运算器
ALU 需要根据 opcode 执行不同功能,比如:、、、、、
其中 opcode 决定当前做什么操作,carry-in 也会参与决定具体算术功能
Function blocks and ALUs
ALU
- 可以提供两个变量的完整逻辑函数集合,也可以只提供其中一个子集。
- ALU 通常围绕加法器构建,因为加法是典型的算术运算,而且进位链 carry chain 往往决定整体延迟。
- Function block 可以用来计算全功能 ALU 所需的中间信号。
- 所需面积较小。
- 可以使用传输门实现,但传输门可能会引入额外延迟。
这个公式的意思是: 分别对应 的四种输入情况。
输入 输出由谁决定 用 opcode 控制 function block,就可以灵活生成不同逻辑函数
ALU Structure
把 ALU 分成几个功能块:、、、
在普通加法器中,常见定义是: 进位关系为:
其中 表示 generate,产生进位; 表示 propagate,传播进位。
但是在 ALU 中,对于非加法操作, 和 不一定是真正的 carry-lookahead 中的 propagate 和 generate。它们可能只是由 opcode 控制生成的中间信号。
Carry unit 只负责进位逻辑,Sum unit 负责产生最终 result。这样可以复用加法器结构,同时支持多种逻辑和算术功能
Summary




























评论区