目录:
一、ALU
二、算术单元(使用逻辑门)
三、半加器
四、全加器
五、8位加法器
六、逻辑单元
一、ALU
上一节介绍了如何用二进制来表示数字,表示和存储数字是计算机的重要功能,但真正的目标是计算、有意义地处理数字,这些操作由计算机的算术逻辑单元(Arithmetic and Logic Unit,ALU)处理。
ALU是计算机的数学大脑,是计算机里负责所有运算的组件,所以基本其他所有部件都会用到它。
1970年发布时,它是第一个封装在单个芯片内的完整ALU,能够处理4位输入,使用了70个逻辑门,但不能执行乘除法。
ALU有两个单元,一个算术单元(Arithmetic Unit),一个逻辑单元(Logic Unit)。
二、算术单元(使用逻辑门)
算术单元:负责计算机里的所有数字操作,比如加减法、增量运算(给某个数字+1)等等。
首先关注一个最基本的问题——将两个数相加。这里使用逻辑门进行实现,包括AND门、OR门、NOT门和XOR门。
三、半加器
最简单的加法电路,就是拿2个bit加在一起。这里有两个输入A和B,以及一个输出就是这两个数字的和。注意:A、B和输出都是单个bit的。将这个结果用真值表表示
可以发现和XOR操作的真值表相同,所以可以把XOR门用作1位加法器(1-bit adder)。
前三个加法:0 + 0;0 + 1;1 + 0 这三个加法的真值表:
但其中一个特殊的结果是
由于半加器是比较基础的部件,所以可以将其抽象成一个单独部件,其中有两个输入,并且输出相加后的总和和进位。
四、全加器
全加器与半加器的区别:包含前一位的进位相加。
如果想要处理多位二进制数加法时,就需要全加器(Full Adder),因为半加器计算完当前位的结果后,会输出进位,意味着计算下一位的结果时,要将两个输入以及前一位的进位相加。
用门电路实现两个二进数相加并求出和的组合线路,称为一个全加器。
例如:111 +110 时 ,第三位的 1+1还需要加上第二位进位的1,所以最后此位的结果为1,进位为0。
全加器是能够计算低位进位的二进制加法电路。
全加器真值表:
我们这里可以使用半加器来实现全加器。我们可以将一个半加器结果当做是INPUT A 和INPUT B相加后的结果,然后将SUM当做是新的INPUT A,而PRE CARRY(前一位的进位)当做是新的INPUT B输入到新的半加器中,可以发现其半加器的SUM(此位的结果)结果和全加器SUM(此位的结果)结果相同。而全加器的CARRY(此位的进位)只要对这两个半加器的CARRY(前一位的进位)进行OR运算就可以了。(注意:这两个半加器不会同时出现进位)
同样我们也可以对全加器进行抽象,得到一个包含三个输入和两个输出的独立部件。
五、8位加法器
由此我们可以进行两个8位数字相加,表示为A和B:A0A1A2A3A4A5A6A7+B0B1B2B3B4B5B6B7
- 对A和B的第一位进行相加时,由于不存在进位,所以值使用一个半加器就能实现,这个半加器的SUM就为该位的结果,CARRY就为进位。
- 后续的7位二进制相加,由于每一个都涉及了上一位的进位,所以后续需要7个全加器,并且每个全加器的CARRY要连接到下一个全加器的输入,而每个全加器的SUM就为该位的结果。
- 最后一个全加器有CARRY的输出,如果该CARRY为1,就表示相加结果太大了,超出了8位,所以出现了溢出(overflow)。
溢出:一般来说 "溢出" 的意思是, 两个数字的和太大了,超过了用来表示的位数,这会导致 错误和不可预期的结果。
由此,我们就构建出了一个8位加法器(8-bit adder)
通过连接1个半加器和n-1个全加器,就能构建n位加法器。
通过叠加更多的加法器,能够避免溢出的出现,但是会出现更多的逻辑门,而且每次进位都要一些时间,而计算是串行的,所以消耗的时间也越长,到如今的每秒几十亿次运算时就会造成影响.所以现代计算机用的加法电路有所不同,称为超前进位加法器(Carry-Look-Ahead Adder)。
ALU通常支持以下操作:加法、带进位的加法、减法、带借位的减法、取反、增1、减1、数字无改变通过。这些操作也是由逻辑门构成的。
注意:简单的ALU并不支持乘法,而是把乘法用多次加法来实现,而更好的处理器有专门做乘法的算数单元。
六、逻辑单元
逻辑单元:执行逻辑操作,比如AND、OR和NOT操作,也能做简单的数值测试。
比如:数字是不是负数。
比如:只有输入的数字全为0,输出才为1.
对整个8位ALU进行抽象,用一个特殊的V形符号进行表示。
其中有两个8位输入,并且有一个4位操作码(Operation Code)来告诉ALU对输入执行什么操作,比如1000表示加法命令,1100表示减法命令,然后有一个8位输出。
同时ALU会输出一系列1位标志(FLAG),来表示特定状态,比如我们可以计算A-B,然后通过ZERO来判断结果是否为零来判断A与B是否相等,通过NEGATIVE来判断A是否小于B;然后OVERFLOW连接到加法器的进位,来判断是否出现溢出。
右下角的电路为全加器中对应的输出标志位的电路:
已获授权:
感谢原创作者: @深度人工智障
笔记属于二次更改,并增添了一些内容。
原创出处:
原创作者: @深度人工智障
原创出处:知乎文章
原创链接:https://zhuanlan.zhihu.com/p/103505660
帮忙点个赞,谢谢!
整理不易,给点鼓励,谢谢!
更多的《计算机科学速成课》,关注专栏~
PS:请关注专栏,不要关注我!