Chapter 12:算术运算电路 Arithmetic

加法器、比较器与计数器等基本算术电路的结构与延迟分析。

基本的计算机组成 | Major Components of a Computer

本节概述

  1. 处理器的核心结构可以概括为: Processor = Control + Datapath + Memory + Interconnect
  2. 后续 Arithmetic 章节主要关注: Datapath 中的执行单元
  3. 重点对象包括:
    • 加法器
    • 乘法器
    • 除法器
    • 移位器
    • ALU

img

计算机与数字处理器基本结构

  1. 计算机系统组成Computer = Processor + Memory + Devices
    • Processor 处理器
      • 负责执行程序,是计算机系统的核心。
      • 主要包括:
        • Control 控制单元:产生控制信号,决定指令如何执行、数据如何流动。
        • Datapath 数据通路:负责数据运算、暂存和传输,是算术逻辑单元所在位置。
    • Memory 存储器
      • 保存程序和数据。
      • 供处理器读取指令、读取数据、写回结果。
    • Devices 输入输出设备
      • Input 输入设备:键盘、传感器、摄像头等。
      • Output 输出设备:显示器、通信接口等。

通用数字处理器抽象

  1. 基本数据流 Input / Output ↔ Datapath ↔ Memory
    • Input / Output:负责与外部设备交换数据。
    • Datapath:执行运算、暂存数据、传输数据。
    • Memory:存放指令和数据。
    • Control:根据指令控制 Datapath 和 Memory 的工作。

Basic Building Blocks

  1. Datapath 数据通路
    • Execution units 执行单元
      • Adder 加法器
      • Multiplier 乘法器
      • Divider 除法器
      • Shifter 移位器
      • ALU 算术逻辑单元
    • Register file 寄存器堆
      • 存放处理器内部临时数据。
    • Pipeline registers 流水线寄存器
      • 在流水线各阶段之间暂存数据。
    • Multiplexers 多路选择器
      • 在多个输入数据中选择一个输出。
    • Decoders 译码器
      • 将编码信息转换为控制信号或选择信号。
  2. Control 控制单元
    • 负责产生控制信号。
    • 常见实现方式:
      • FSM 有限状态机
      • PLA 可编程逻辑阵列
      • ROM
      • Random logic 随机逻辑
  3. Interconnect 互连结构
    • 负责模块之间的数据连接与传输。
    • 包括:
      • Switches 开关
      • Arbiters 仲裁器
      • Buses 总线
  4. Memory 存储结构
    • 包括:
      • Cache 高速缓存
      • TLB 地址转换缓存
      • DRAM 主存
      • Buffers 缓冲器

现代处理器结构风格

  1. Pipelined, single issue
    • 流水线单发射。
    • 每个周期通常发射一条指令。
  2. Superscalar
    • 超标量结构。
    • 由硬件控制多发射,每周期可发射多条指令。
  3. VLIW
    • Very Long Instruction Word,超长指令字。
    • 由软件 / 编译器安排多发射。
  4. Multithreaded
    • 多线程结构。
    • 从多个线程中取指令执行,提高硬件利用率。

Datapath Bit-Sliced Organization

多位数据通路 = 重复的一位处理单元 + 统一控制信号。

img

Adder | 加法器设计

Single-Bit Addition

Half adder & Full Adder

img

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

img

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

img

  • 先计算进位,然后再利用公式S=ABC+(A+B+Ci)CoS = ABC + (A+B+C_i)\overline{C_o}计算出求和
  • 此种方法会比串行进位加法器速度快,因为串行操作需要三次异或操作

进位加法器设计

进位行为分析

img

img

  • Carry status—— 进位状态 只看当前位的 A,BA,B,判断它对输入进位 CiC_i 做什么:
    1. Generate 产生进位
      • (A=1,B=1)
      • 不管 (C_i) 是多少,(C_o=1)
      • G=ABG=A\cdot B
    2. Propagate 传播进位
      • (ABA\neq B)
      • 输出进位等于输入进位
      • P=ABP=A\oplus B
    3. Kill / Delete 删除进位
      • (A=0,B=0)
      • 不管 (C_i) 是多少,(C_o=0)
      • K=ABK=\overline A\cdot \overline B
  • 用 P、G、K 表达加法器:
    • Co=G+PCiC_o = G + P C_i

如果我们知道每一位是 Generate / Propagate / Kill,就可以提前推导高位进位,形成后面的:

  • Carry Lookahead Adder
  • Carry Skip Adder
  • Carry Select Adder
  • Prefix Adder

Mirror Adder

img

核心公式Co=AB+Ci(A+B)C_o = AB + C_i(A+B)

电路实现

红色网络实际先生成:

Co\overline{C_o}
  • 上拉网络:负责让 Co=1\overline{C_o}=1
    • 对应 Kill 和 “0”-Propagate
  • 下拉网络:负责让 Co=0\overline{C_o}=0
    • 对应 Generate 和 “1”-Propagate
优点
  • 不显式生成 P=ABP=A\oplus B
  • 直接把 Kill / Propagate / Generate 写进晶体管导通路径
  • 晶体管数少:24T
  • Carry 路径更直接,适合 ripple-carry adder

Mirror Adder 是按进位行为设计晶体管网络:消进位、传进位、产生进位。

Transmission Gate Full Adder

采用传输门的方式来进行全加器的设计

img

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

img

速度更快是因为级连数目比较少 但是会占用比较大的面积

Multi-bit Addition

Ripple-Carry Adder 串行进位加法器

把多个 Full Adder,全加器 串起来:

img

关键路径CiCoCoC_i \rightarrow C_o \rightarrow C_o \rightarrow \cdots,延迟随位数线性增加.

具体延迟计算

tadder=(N1)tcarry+tsumt_{adder}=(N-1)t_{carry}+t_{sum}

其中tcarryt_{carry}是单个 full adder 中,进位从输入传到输出的延迟,即Ci→Co的延迟,tsumt_{sum}则是最后一级 full adder 中,进位到达后产生 Sum 的延迟。

Inversion Property | 全加器的反向特性

img

全加器有这样的反相特性——如果把全加器的所有输入都取反,那么输出也会整体取反

S(A,B,Ci)=S(A,B,Ci)\overline{S}(A,B,C_i)=S(\overline A,\overline B,\overline {C_i})Co(A,B,Ci)=Co(A,B,Ci)\overline{C_o}(A,B,C_i)=C_o(\overline A,\overline B,\overline {C_i})

真实 CMOS 全加器的 carry 输出往往天然是反相的,如果每一级都加反相器恢复极性,会拖慢 carry critical path;所以让 even / odd 全加器交替使用反相 carry,省掉 carry 路径上的反相器

img

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

img

A2,B2 需要以反相信号形式进入 odd cell,这样输出的S2才是正值

注意:\oplus符号上的圆圈表示反相输入,并不代表有反相器存在!!

Manchester Carry Chain | 曼彻斯特加法链

img

此页左边电路就是在实现这个逻辑:

  • Pi=1P_i=1:传输门打开,直接把 CiC_i 传到 CoC_o
  • Gi=1G_i=1:上拉到 VDDV_{DD},强制 Co=1C_o=1
  • Di=1D_i=1:下拉到 GND,强制 Co=0C_o=0

右边本质上是在动态逻辑里实现:Co=Di+PiCi\overline{C_o}=D_i+P_i\overline{C_i}

img

对于第二页,把前面一位 cell 复制 4 次,形成 4-bit carry chain

Ci,0C0C1C2C3\overline{C_{i,0}} \rightarrow \overline{C_0} \rightarrow \overline{C_1} \rightarrow \overline{C_2} \rightarrow \overline{C_3}

普通 ripple-carry adder 每一位都要经过一个完整 FA 的 carry 逻辑:

CiFACi+1CiFACi+1CiFACi+1C_i→FA→C_{i+1} \\ C_i \rightarrow FA \rightarrow C_{i+1}C_i \\ →FA→Ci+1

而Manchester Carry Chain 的思路是:先把 Ai,BiA_i,B_i 提前变成控制信号

Gi=AiBiG_i=A_iB_iPi=AiBiP_i=A_i\oplus B_iDi=AiBiD_i=\overline{A_i}\overline{B_i}

这些都先预计算好(在 carry 到来之前就可以算好),然后再来计算carry链

但是如果所有位都是 propagate,那 carry 还是要穿过很多 pass transistor。链太长时,RC 延迟会变大,信号也可能变弱,所以 Manchester carry chain 通常适合做一小段高速 carry 链。 长位宽还要配合分段、buffer、carry-bypass、carry-lookahead 等结构。

Carry-Bypass Adder | 进位旁路/跳过加法器

img

这个核心思想就是,如果P=1,那进位的输入就等于输出,如果有连续的一个block都是P=1的话,那么实际上就可以直接旁路一开始的Cin0Cin_0,直接传输过来,节省了四个FA的运算时间(以上图作为例子)

如果整个 block(比如选取四个FA作为一个Block) 都是 propagate,就直接跳过;否则说明 block 内部某一位会产生或杀死进位,就走普通 ripple 结果。

img

那么这个延迟时间计算:

tadder=tsetup+Mtcarry+(NM2)tbypass+(M1)tcarry+tsumt_{adder}=t_{setup}+Mt_{carry}+\left(\frac{N}{M}-2\right)t_{bypass}+(M-1)t_{carry}+t_{sum}

这里:

  • NN:总位数,比如 16 bit;
  • MM:每个 block 的位数,比如 4 bit;
  • tsetupt_{setup}:提前算 Pi,Gi,BPP_i,G_i,BP 的时间;
  • tcarryt_{carry}:carry 经过一位 FA 的时间;
  • tbypasst_{bypass}:carry 经过一个 bypass MUX 的时间;
  • tsumt_{sum}:最后生成 sum 的时间。
提醒

这个公式怎么得出来的(为什么上面的这个式子是最坏情况):

P=ABP=A\oplus B, G=ABG=A\cdot BCo=G+PCiC_o = G + P C_i

如果P=1,那么G=0一定成立,所以这个时候Cin = Cout,但如果P=0,那么Co=G,此时就和这一级之前的加法器电路完全无关了,前面的延时不会被加进来

所以说,如果考虑Carry Bypass最坏情况下,应该是,第一个FA电路是P=0,无跳过的;剩下中间N/M-2个FA加法器都走Bypass路径(最后一个加法器不用管进位输出了),那么这样时间就好算了: tsetup+Mtcarryt_{setup}+Mt_{carry} 是第一个FA的时间,(NM2)tbypass\left(\frac{N}{M}-2\right)t_{bypass}是中间N/M-2个FA加法器 的时间,(M1)tcarry(M-1)t_{carry}是对于最后一个加法器,实际上只需要计算剩余的M-1 个位就可以了,第M位是用来计算输出的进位的,但这个不在我们考虑范围内(我们只考虑sum的结果,不考虑sum的进位),所以是(M1)tcarry(M-1)t_{carry},最后再加上sum的计算时间tsumt_{sum},结果就是

tadder=tsetup+Mtcarry+(NM2)tbypass+(M1)tcarry+tsumt_{adder}=t_{setup}+Mt_{carry}+\left(\frac{N}{M}-2\right)t_{bypass}+(M-1)t_{carry}+t_{sum}
Carry Ripple vs Carry Bypass 对比图

img

Carry-bypass adder 也会随 (N) 增长,但斜率小一些,因为中间有些 block 可以 bypass;但是 carry-bypass 有额外开销:tsetup, BP 逻辑, MUXt_{setup},\ BP\text{ 逻辑},\ MUX

所以在位数很小时,它不一定比 ripple 快。图上标的 484\sim8通常位数大到一定程度后,carry-bypass 才开始明显优于 ripple。

Carry-Select Adder | 进位选择加法器

核心思想:不等 carry 到了以后再算;先假设 carry-in=0 和 carry-in=1,把两种结果都提前算好。等真实 carry 到达时,用 MUX 选正确的结果——用面积换时间。

img

img

Critical Path 分析 | 关键路径分析

图里把 16-bit 分成 4 个 4-bit block,Bit 0–3,Bit 4–7,Bit 8–11,Bit 12–15\text{Bit 0–3},\quad \text{Bit 4–7},\quad \text{Bit 8–11},\quad \text{Bit 12–15},每个 block 都提前算两套结果, 所以除了第一个 block 以外,后面 block 的内部 carry 结果其实都已经准备好了,关键路径实际上转换为:

第一个 block 内部 carry 传播MUXMUXMUXMUX最高位 sum\text{第一个 block 内部 carry 传播} \rightarrow \text{MUX} \rightarrow \text{MUX} \rightarrow \text{MUX} \rightarrow \text{MUX} \rightarrow \text{最高位 sum}

从而有

Tadd=tsetup+Mtcarry+NMtmux+tsumT_{add}=t_{setup}+Mt_{carry}+\frac{N}{M}t_{mux}+t_{sum}

其中:

  • NN:总位数;
  • MM:每个 block 的位数;
  • tsetupt_{setup}:计算 P,GP,G 的时间;
  • MtcarryMt_{carry}:第一个 block 内部产生 carry 的时间;
  • NMtmux\frac{N}{M}t_{mux}:一共有 NM\frac{N}{M} 个 block,所以真实 carry 要经过这么多个 MUX;
  • tsumt_{sum}:最后生成 sum 的时间。

这次注意,实际上会经过N/M个mux

细节查看下图蓝线

img

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

img

前面提到的是等分的block,如果block不等分,而是呈等差数列 逐级递增+1的话,最终计算式子如下:

N=M+(M+1)+(M+2)++(M+P1)=P22+P(M12)N=M+(M+1)+(M+2)+\cdots+(M+P-1) = \frac{P^2}{2}+P\left(M-\frac{1}{2}\right)

后面一项在N很大的时候可以忽略

N=P22N= \frac{P^2}{2}

延迟就变成了

Tadd=tsetup+Mtcarry+Ptmux+tsumT_{add}=t_{setup}+Mt_{carry}+Pt_{mux}+t_{sum}

PP 近似为 2N\sqrt{2N} 时,延迟写成:

Tadd=tsetup+Mtcarry+2Ntmux+tsumT_{add}=t_{setup}+Mt_{carry}+\sqrt{2N} t_{mux}+t_{sum}

因此叫做平方根进位选择加法器

对比关键路径

这个就是把时间和N的关系画了一个图来对比一下,没啥好说的 后面这俩性能比较好

img

1’s & 0’s Detectors | 全 1 / 全 0 检测器

功能:判断一个多 bit 信号是不是全 1 或全 0

比如 8-bit 输入:A7A6A5A4A3A2A1A0A_7A_6A_5A_4A_3A_2A_1A_0,只有当所有位都是 1 时,全 1 检测器输出才是 1:

img

大 fan-in 门不好做,直接做一个 8 输入 AND,晶体管串并联会很复杂,延迟和面积都不好。

所以课件给了几种实现方式:

  1. balanced tree:平衡树结构,层数少,比较规整;
  2. skewed chain:偏斜链式结构,适合某些输入更关键的情况;
  3. transistor-level detector:直接用晶体管拉高/拉低节点,比如全 0 检测常可以做成 NOR 型结构。

Equality Comparator | 相等比较器

顾名思义。

img

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

Magnitude Comparator | 大小比较器

img

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

Counters | 计数器

img

binary counter|二进制计数器

N-bit binary counter 会按二进制顺序计数:00000001001000110000 \rightarrow 0001 \rightarrow 0010 \rightarrow 0011 \rightarrow \cdots

一个 N-bit counter 有2N2^N个状态(使用有限状态机来实现——数电内容,时序逻辑电路)

img

图里的 synchronous counter 是同步计数器,所有寄存器都由同一个 clock 触发,不是一位一位异步翻转。

TC 是 terminal count,终端计数信号;比如向上计数时:Q=1111,再加 1 就溢出回到 0000,这时可以产生 TC。

img

这张图是一个带功能选择的同步计数器:

  • 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 外的所有 2N12^N-1 个状态,但顺序不是正常二进制递增,而是看起来像随机的伪随机顺序

Multiplier | 乘法器设计

The Binary Multiplication | 二进制乘法

  1. 二进制数的按位展开 设 XXMM 位二进制数,YYNN 位二进制数,则:
    X=i=0M1Xi2iX=\sum_{i=0}^{M-1}X_i2^iY=j=0N1Yj2jY=\sum_{j=0}^{N-1}Y_j2^j
    其中,XiX_iYjY_j 都是单个 bit,只能取 0011
  2. 乘法的数学展开 乘积为 Z=X×YZ=X\times Y
    XXYY 的按位展开代入:Z=(i=0M1Xi2i)(j=0N1Yj2j)Z=\left(\sum_{i=0}^{M-1}X_i2^i\right)\left(\sum_{j=0}^{N-1}Y_j2^j\right)

根据乘法分配律展开:

Z=i=0M1j=0N1XiYj2i+jZ=\sum_{i=0}^{M-1}\sum_{j=0}^{N-1}X_iY_j2^{i+j}

这个式子说明:二进制乘法可以分解成很多个 XiYjX_iY_j 的部分积相加。

img

  1. Partial Product:部分积 每一个 XiYjX_iY_j 叫做一个 partial product,部分积
    因为 XiX_iYjY_j 都是二进制位,所以 XiYjX_iY_j 在硬件中可以直接用 AND 门 生成。
    也就是:Pij=XiYj=XiYjP_{ij}=X_iY_j=X_i\land Y_j
    img

由于 2i2j=2i+j2^i\cdot2^j=2^{i+j},所以部分积 XiYjX_iY_j 的权重是 2i+j2^{i+j}。因此,XiYjX_iY_j 应该放在第 i+ji+j

二进制乘法本质上就是:根据乘数的每一位,决定是否加入一行被乘数,并把这一行左移对应位数。

如果某一位 Yj=1Y_j=1,就加入一行左移 jj 位的 XX;如果 Yj=0Y_j=0,这一行就是全 00

所以乘法可以看成很多行 partial product 的加法

img

实际上部分积的生成也是很简单——只需要做与运算就可以了

The Array Multiplier | 乘法器阵列

img

img

全加器与半加器的应用

实际上每一行的第一个都会用半加器HA,因为不需要进位;

Critical Path | 关键路径

img

对于一个MxN的阵列乘法器,关键路径(上图是4*4)

tmult=[(M1)+(N2)]tcarry+(N1)tsum+tandt_{mult}=\left[(M-1)+(N-2)\right]t_{carry}+(N-1)t_{sum}+t_{and}

其中:

  • tandt_{and}:生成部分积 XiYjX_iY_j 的 AND 门延迟;
  • tcarryt_{carry}:FA / HA 的 carry 输出延迟
    • 关键路径信号进入某个 HA / FA 之后,从该输入传播到这个 HA / FA 的 carry 输出的延迟;
  • tsumt_{sum}:FA / HA 的 sum 输出延迟;
    • 关键路径信号进入某个 HA / FA 之后,从该输入传播到这个 HA / FA 的 sum 输出的延迟;
  • MM:被乘数位数;
  • NN:乘数位数。
提醒

关键路径分析

关键路径从某个 partial product 开始,先经过一个 AND 门tandt_{and}, 然后信号在阵列里传播,信号会经过很多 FA / HA,"横向"走 是tcarryt_{carry}, "竖向"走是tsumt_{sum};

其实无论走哪一条路径,都是竖向走N-1个加法器,即(N1)tsum(N-1)t_{sum}同时对于横向方向,都是走(M+N-1) -1 -1 = (M+N-3)个carry,即[(M1)+(N2)]tcarry\left[(M-1)+(N-2)\right]t_{carry}

这里的解释是这样的:

对于横向方向,总长度实际上就是M+N-1,即输出位宽是M+N-1,那么横向之间的间隔就有(输出位宽-1)=N+M-2个宽度,然后实际上我们只关系最后一位的sum结果,因此最后一个加法器它的carry时间就不计算在内了,所以再减一,结果就是(M+N3)tcarry(M + N - 3)t_{carry}

因此最终计算得出tmult=[(M1)+(N2)]tcarry+(N1)tsum+tandt_{mult}=\left[(M-1)+(N-2)\right]t_{carry}+(N-1)t_{sum}+t_{and}

Carry-Save Multiplier | 进位保存乘法器

普通 array multiplier 里,每一行加法器内部 carry 会横向 ripple:carrycarry...carry→carry→...,所以延迟里会出现很多横向 carry delay 和竖向 sum delay;

Carry-save multiplier 的核心思想是中间累加 partial products 时,不把 carry 立刻横向传播完,每个 FA 做好sum和carry的输出之后,作为一个“carry vector”的一部分保存下来,送到下一层/下一列去处理进位

img

img

(左右对比)

CSA-based Array Multiplier | 基于保留进位加法器的乘法器

这个小节是讲一种具体的实现方案,上面那个Carry-Save Multiplier是一个大类的乘法器结构

CPA指的是进位传播加法器,实际上就是前面的串行加法器的大类

img

CSA指的是Carry-Save Adder,注意不是前面的进位选择加法器

下图左就是CPA计算过程,每一次计算都会把进位考虑上;右就是CSA计算过程,每次先算出sum和进位 然后再把进位和sum加起来 rnh is my(scy) good son

>

img

img

img

Critical Path

关键路径这里就是 最多累加的地方 当然是x0y3 + x1y2 + x2y1 + x3y0这个累加是最长的路径 然后再加上CPA计算的时间,就是关键路径延迟了

这里假设tsum>tcarryt_{sum}>t_{carry}

Rectangular Array

把斜着的CSA-based Array Multiplier阵列“压扁 / 拉正”,排成一个规整的矩形,方便芯片版图实现

img

Wallace-Tree Multiplier

这个其实就是作业的那个题,对于4x4的乘法阵列,定制一个Wallace-Tree Multiplier ,如右图所示

img

img

Build From CSA-Based Multipler

事实上Wallace-Tree Multiplier 就是一种CSA based 的阵列乘法器,因为全加器就是一种CSA加法器

img

CSA vs conventional Adder

img

实际上也没什么区别 只是说全加器的进位在CSA这里也是作为输出,而不是作为下一级全加器的输入

Wallace-Tree Multiplier 的优势与劣势

img

这张图说明了Wallace-Tree乘法器的速度为什么比普通的CSA链快,是因为普通CSA链也还是有很多的串行逻辑,但是Wallace-Tree节省了一些不必要的串行等待——能把串行CSA的O(N)复杂度压缩到O(logN)的复杂度。在乘法器中使用 Wallace Tree 的目的,是减少加法操作的数量,或者更准确地说,是减少 CSA 链的深度。

但是也有缺点,缺点是连线更复杂,但是也也可以构造 Booth 编码的 Wallace Tree 乘法器。

img

img

Shifter | 移位器

移位器 shifter 的几种硬件实现方式

The Binary Shifter

img

有三个控制信号:

  • Right:右移 1 位
  • nop:no operation,不移位
  • Left:左移 1 位

可以把它理解成一个由传输门/传输晶体管组成的 3 选 1 mux

A programmable Binary Shifter

表中 rgtrgtnopnopleftleft 是控制信号,通常是 one-hot,也就是三者只能有一个为 1。

img

注意这里右移的时候高位补0

The Barrel Shifter

Barrel shifter 的思想是:每个输出 BjB_j 都可以从多个输入 AkA_k 中直接选择一个。(任意移动多少个位置,算术移动)

img

img

本质上是一个很大的交叉开关阵列。

例如 4-bit barrel shifter 中,每个输出都可能从 A3,A2,A1,A0A_3,A_2,A_1,A_0 中选择,因此会有很多横向数据线、纵向控制线、交叉点开关。

这个结构的面积主要不是被晶体管占掉的,而是被大量连线占掉的。对于 NN 位 barrel shifter,交叉连接规模大约是 O(N2)O(N^2),所以位宽变大以后,布线压力很明显。

Logarithmic Shifter

用多级小移位实现任意移位,不再用一个巨大的全交叉阵列,而是分成若干级,每一级只负责移 1,2,4,8,1,2,4,8,\dots 位。

img

img

ALU | Arithmetic Logic Unit 运算器

ALU 需要根据 opcode 执行不同功能,比如:A+BA+BA+B+1A+B+1ABA-BA&BA\&BABA|BABA\oplus B

其中 opcode 决定当前做什么操作,carry-in 也会参与决定具体算术功能

img

Function blocks and ALUs

ALU

  • 可以提供两个变量的完整逻辑函数集合,也可以只提供其中一个子集。
  • ALU 通常围绕加法器构建,因为加法是典型的算术运算,而且进位链 carry chain 往往决定整体延迟。
  • Function block 可以用来计算全功能 ALU 所需的中间信号。
  • 所需面积较小。
  • 可以使用传输门实现,但传输门可能会引入额外延迟。

img

output=abop0+abop1+abop2+abop3output=\overline{a}\overline{b}op_0+a\overline{b}op_1+\overline{a}bop_2+abop_3

这个公式的意思是:op0,op1,op2,op3op_0,op_1,op_2,op_3 分别对应 a,ba,b 的四种输入情况。

输入输出由谁决定
a=0,b=0a=0,b=0op0op_0
a=1,b=0a=1,b=0op1op_1
a=0,b=1a=0,b=1op2op_2
a=1,b=1a=1,b=1op3op_3

用 opcode 控制 function block,就可以灵活生成不同逻辑函数

ALU Structure

img

把 ALU 分成几个功能块:G blockG\ blockP blockP\ blockCarry blockCarry\ blockSum blockSum\ block

在普通加法器中,常见定义是:Gi=aibiG_i=a_ib_i Pi=aibiP_i=a_i\oplus b_i进位关系为:Ci+1=Gi+PiCiC_{i+1}=G_i+P_iC_i

其中 GiG_i 表示 generate,产生进位;PiP_i 表示 propagate,传播进位。

但是在 ALU 中,对于非加法操作,PP GG 不一定是真正的 carry-lookahead 中的 propagate 和 generate。它们可能只是由 opcode 控制生成的中间信号。

Carry unit 只负责进位逻辑,Sum unit 负责产生最终 result。这样可以复用加法器结构,同时支持多种逻辑和算术功能

Summary

img

Chapter 11:时序 Timing
Chapter 13:存储器 Memory

评论区