算術邏輯單元

算术逻辑单元(,縮寫:ALU)是一种可对二进制整数执行算术运算或位运算的组合逻辑数字电路。ALU 与浮点数运算单元(FPU)不同,后者仅对浮点数进行操作。ALU 是许多类型的计算电路的基本部件,这些计算电路包括计算机的中央处理单元(CPU)、浮点处理单元(FPU)和图形处理单元(GPU)。单个CPU、FPU 或 GPU 可能包含多个 ALU。

ALU 的输入包括需要运算的数据(也称为运算数)和表明了运算操作类型的指令码。ALU 的输出是其执行运算的结果。在许多的设计中,ALU 还带有状态输入或输出,可将其之前操作或当前操作的信息在 ALU 和外部状态寄存器间传递。

信号
一个 ALU 具有各种输入和输出网络,它们用于在 ALU 和外部电路之间传送数字信号。当 ALU 工作时,外部电路在 ALU 的输入端输入信号,而 ALU 将产生运算结果,并将信号通过其输出端输出至外部电路。

数据
一个基本的 ALU 具有三个并行的数据总线,包括两个输入操作数(A、B)和结果输出(Y)。每个数据总线都是一组传递了一个二进制整数的信号。通常,A、B和Y的总线宽度(每个总线包含的信号数)是相同的,并且与外部电路(例如,封装 CPU 或其他处理器)的原生字长相同。

操作码
操作码通过并行总线输入,它向 ALU 传递选择的操作的信息,该操作选择码是对 ALU 要执行的算术或逻辑运算的枚举。操作码的长度(其总线宽度)决定了 ALU 可以执行的操作的最大数量。例如,一个4位操作码可最多为 ALU 指定不同的 16 个操作(16=24)。通常,ALU 的操作码与机器语言的操作码不同,尽管在某些情况下,它可以直接编码为机器语言操作码内的位字段。

状态
输出
ALU 的状态输出是各类单独的信号,补充表示了有关当前 ALU 操作结果的信息。通用 ALU 通常具有以下状态信号:

  • Carry-out,表示由加法运算产生的进位、由减法运算产生的借位或由二进制移位运算产生的溢出位。
  • Zero,表示运算结果的所有位均为逻辑零。
  • Negative,表示算术运算结果为负。
  • Overflow,表示算术运算的结果溢出,超出了 Y 的数值范围。
  • Parity,表示输出数 Y 的奇偶校验结果,说明 Y 中的含有逻辑 1 的数量的奇偶性。

在 ALU 的操作结束后,状态输出信号通常会被存储在外部寄存器中,以使其可用于之后的 ALU 操作(例如实现多倍精度运算,或用于控制条件分支)。存储了状态输出的集合的位寄存器通常被视为一整个多位寄存器,称为“状态寄存器”或“条件代码寄存器”。

输入
状态输入使 ALU 在执行操作时可接收其他信息。通常,这是单个“低位进位”,传递了来自上一级 ALU 操作的进位。

电路操作
集成电路内部的组合逻辑电路,它是一个简单的四位 ALU ]]
ALU 是组合逻辑电路。这意味着当输入变化时,其输出也将随之变化。在正常的情况下输入到 ALU 的信号是稳定的,并且当经过足够的时间(称为“传播延迟”)信号通过 ALU 中的电路传播后,ALU 操作的结果就会出现在ALU上输出。连接到 ALU 的外部电路负责确保 ALU 的输入信号在整个操作过程中是稳定的,并在对 ALU 的输出进行采样之前为信号传播预留足够的时间。

通常,外部电路通过将信号施加到其输入端来控制 ALU。外部电路往往采用顺序逻辑来控制 ALU 的运作,该操作由足够低频率的时钟信号调整,以确保 ALU 的输出在最坏情况下也有足够的时间达到稳定。

例如,在用 ALU 执行加法操作时,CPU 会将操作数(通常是从寄存器)路由到 ALU 的输入,而控制单元会同时将一个值传送至 ALU 的操作码输入,使其执行加法操作。同时,CPU 还将把 ALU 的计算结果输出路由到用于接收该结果的目标寄存器。在 CPU 等待下一个时钟期间,ALU 的输入信号需一直保持稳定,已使其通过 ALU 并到达目标寄存器。当下一个时钟到达时,目标寄存器将存储 ALU 结果,并且由于 ALU 操作已完成,因此此时可以为下一次 ALU 操作设置 ALU 输入。

功能
ALU 通常支持许多基本算术和按位逻辑函数。基本的通用 ALU 通常支持以下操作

在整个信息时代的初期,电子电路的成本,尺寸和功耗都相对较高。因此,尽管所有串行计算机和许多早期计算机(例如 PDP-8)都具有一个简单的 ALU,但它一次只能处理一个数据位,而程序员们使用更长的字长。最早的具有多个分立单位 ALU 电路的计算机是1948年的 Whirlwind I,它使用了16个这样的“数学单元”,以使其能够对16位数据进行操作。

1967年,仙童半导体推出了第一款用集成电路实现的 ALU,名为 Fairchild 3800,由一个带累加器的八位 ALU 构成。随后,其他集成电路 ALU 也相继出现,包括4位 ALU,如 Am2901 和 74181。这些设备通常具有“位片”功能,这意味着它们可以输出“超前进位”的信号,从而有助于使用多个 ALU 芯片相互连接以构成字长更宽的 ALU。这些设备迅速流行起来,并广泛用于位片微型计算机。

1970年代初,微处理器开始出现。虽然晶体管变得越来越小,但裸晶的尺寸并不足以放下全字宽的 ALU。因此,一些早期的微处理器采用了位数更少的 ALU,每条指令因而需要多个周期来执行。比如当时流行的Zilog Z80,它使用4位 ALU 执行8位加法运算。后来,正如摩尔定律预测的那样,晶体管的尺寸进一步缩小,在微处理器上构建更宽的 ALU 从而也变得可行。

现代的集成电路中晶体管的尺寸比早期微处理器的小-{}-几个数量级,从而可以配备高度复杂的 ALU。如今,许多现代ALU的字宽更宽,体系结构的提升(如使用了桶形移位器和二进制乘法器)能使它们能够在单个时钟周期内执行需要早期 ALU 进行多次运算才能完成的操作。

参见

  • 加法器
  • 乘法器
  • 地址生成单元

*

  • 执行单元

参考资料
延伸阅读
*
*

评论 (0)

  • 还没有评论,来抢沙发吧。