工作中涉及处理器设计的,对ALU接触比较多,但很多是对它抽象的了解,今天学习记录一下内部组成。
ALU即算术逻辑单元,用来执行算数和逻辑运算,比如对两个数据进行加/减/乘/除/布尔操作,是CPU的重要组成部分,我们拿到的是一个独立组件,内部最小单元其实是晶体管,通过一层层封装连接组成。
逻辑门
先介绍怎么用晶体管做逻辑门,以以下几种基本布尔运算举例
- 非门
非门可以通过一个三极管实现,当输入高电平时,三极管导通,输出低电平;当输入是低电平时,三极管截止,输出高电平。最后将逻辑电路抽象为一个单独组件:非门
2. 与门
与门可以通过两个三极管串联实现,当两个输入都为高电平时,三极管都导通,输出高电平;当输入有一个是低电平时,三极管截止,输出低电平。最后将逻辑电路抽象为一个单独组件:与门
- 或门
或门可以通过两个三极管并联实现,当其中一个输入都为高电平时,对应三极管导通,输出高电平;当两个输入都为低电平时,三极管均截止,输出低电平。最后将逻辑电路抽象为单独组件:或门
4. 异或门
异或门和或门有点像,只是当两个输入都为高电平时,输出为低电平,可以用一个或门另外与上一个与非门实现。最后将逻辑电路抽象为单独组件:一个异或门
算数运算
到这一层,直接用逻辑门的高级抽象来实现。
- 半加器
累加和的结果和异或门结果一致,累加会产生进位,通过与门输出进位。最后将逻辑图抽象为单独的组件:半加器
2. 全加器
要处理超过1+1的运算,就需要用到全加器,利用半加器输出的进位。先用半加器将A和B累加,再把进位输入到第二个半加器,最后用一个或门检查进位是不是true。最后将逻辑抽象为单独组件:全加器。这样输入就是3位(A和B以及地位输出的进位),输出两位(依然是进位和总和)
- 8位加法器
以上是1位数字相加,现在试着将两个8位数A(A0-A7)和B(B0-B7)相加,也就是1byte.
输出也为8位,最大值为255,当最后的CARRY为1时,表示产生了溢出。
可以根据需要设计出16位/32位的加法器。
【补充】
1.随着位数的增多,就需要更多的逻辑门,而且每次的进位都需要时间,对超量计算很影响效率,现在的加法器电路基本用超前进位加法器,这里只用来说明ALU的最小组成单元,也就是如何用晶体管实现的运算。
2.ALU没有专门的乘法器和除法器,乘法是通过多次加法,除法是通过多次减法实现,现在很多处理器会做专门的乘法或除法运算单元,电路更复杂,价格也更高