【计算机科学速成课】[40集全/文字版] - 5.算术逻辑单元

嗨,欢迎阅读计算机科学速成课

上集,我们谈了如何用二进制表示数字,比如二进制00101010是十进制的42,表示和存储数字是计算机的重要功能,但真正的目标是计算,有意义的处理数字。比如把两个数字相加,这些操作由计算机的"算术逻辑单元"处理,但大家会简称:ALU,ALU是计算机的数学大脑。等你理解了ALU的设计和功能之后,你就理解了现代计算机的基石。

ALU*就是*计算机里负责运算的组件,基本其他所有部件都用到了它,先来看看这个美人,这可能是最著名的ALU,英特尔74181,1970年发布时,它是第一个封装在单个芯片内的完整ALU,这在当时是惊人的工程壮举。今天我们用上周学的布尔逻辑门,做一个简单的ALU电路,功能和74181一样。然后接下来几集,用它从头做出一台电脑,所以会有点复杂,但我觉得你们搞的定。

ALU有2个单元,1个算术单元和1个逻辑单元,我们先讲"算术单元",它负责计算机里的所有数字操作,比如加减法。它还做很多其他事情,比如给某个数字+1,这叫增量运算,我们之后会说,今天的重点是一切的根本-"把两个数字相加",我们可以用单个晶体管一个个拼,把这个电路做出来,但很快就会复杂的难以理解,所以与其用晶体管,我们会像第3集,-用更高层的抽象,用逻辑门来做,我们会用到AND,OR,NOT和XOR逻辑门,最简单的加法电路,是拿2个bit加在一起(bit是0或1)有2个输入:A和B,1个输出:就是两个数字的和。

需要注意的是:A,B,输出,这3个都是单个Bit(0或1)输入只有四种可能,前三个是0+0=0,1+0=1,0+1=1,记住二进制里,1与true相同,0与false相同。这组输入和输出,和XOR门的逻辑完全一样,所以我们可以把XOR用作1位加法器(adder)但第四个输入组合,1+1,是个特例1+1=2(显然)但二进制里没有2,上集说过,二进制1+1的结果是0,1进到下一位,和是10(二进制)。

 XOR门的输出,只对了一部分,1+1输出0,但我们需要一根额外的线代表"进位",只有输入是1和1时,进位才是"true",因为算出来的结果用1个bit存不下,方便的是,我们刚好有个逻辑门能做这个事!没那么复杂-就两个逻辑门而已,让我们抽象化。把"半加器"封装成一个单独组件,两个输入A和B都是1位两个输出"总和"与"进位",这进入了另一层抽象,我好像说了很多次,说不定会变成一个梗。如果想处理超过1+1的运算,我们需要"全加器",半加器输出了进位,意味着,我们算下一列的时候,还有之后的每一列,我们得加3个位在一起,并不是2个。

 全加器复杂了一点点,有3个输入:A,B,C(都是1个bit)所以最大的可能是1+1+1。"总和"1"进位"1所以要两条输出线:"总和"和"进位",我们可以用半加器做全加器,我们先用半加器将A和B相加。然后把C输入到第二个半加器,最后用一个OR门检查进位是不是true,这样就做出了一个全加器!

我们可以再提升一层抽象,把全加器作为独立组件,全加器会把A,B,C三个输入加起来输出"总和"和"进位"。现在有了新组件,我们可以相加两个8位数字,叫两个数字叫A和B好了,我们从A和B的第一位开始,叫A0和B0好了。现在不用处理任何进位,因为是第一次加法,所以我们可以用半加器,来加这2个数字,输出叫sum0,现在加A1和B1,因为A0和B0的结果有可能进位,所以这次要用全加器,除了A1和B1,还要连上进位。输出叫sum1,然后,把这个全加器的进位连到下个全加器的输入,处理A2和B2,以此类推,把8个bit都搞定。

 注意每个进位是怎么连到下一个全加器的, 所以叫"8位行波进位加法器",注意最后一个全加器有"进位"的输出,如果第9位有进位,代表着2个数字的和太大了,超过了8位,这叫"溢出"(overflow)。一般来说"溢出"的意思是,两个数字的和太大了,超过了用来表示的位数,这会导致错误和不可预期的结果,著名的例子是,吃豆人用8位存当前关卡数,如果你玩到了第256关(8位bit最大表示255)ALU会溢出。造成一连串错误和乱码,使得该关卡无法进行,这个bug成了厉害吃豆人玩家的代表。

如果想避免溢出,我们可以加更多全加器,可以操作16或32位数字。让溢出更难发生,但代价是更多逻辑门。另外一个缺点是,每次进位都要一点时间,当然时间不久,因为电子移动的很快,但如今的量级是每秒几十亿次运算,所以会造成影响,所以,现代计算机用的加法电路有点不同。叫"超前进位加法器",它更快,做的事情是一样的-把二进制数相加,ALU的算术单元,也能做一些其他数学运算,一般支持这8个操作。

就像加法器一样,这些操作也是由逻辑门构成的,有趣的是,你可能注意到没有乘法和除法。因为简单的ALU没有专门的电路来处理,而是把乘法用多次加法来实现。假设想算12x5,这和把"12"加5次是一样的,所以要5次ALU操作来实现这个乘法,很多简单处理器都是这样做的,比如恒温器,电视遥控器和微波炉。慢是慢,但是搞的定,然而笔记本和手机有更好的处理器,有专门做乘法的算术单元,你可能猜到了,乘法电路比加法复杂。-没什么魔法,只是更多逻辑门,所以便宜的处理器没有。

好了,我们现在讲ALU的另一半:逻辑单元,逻辑单元执行逻辑操作,比如之前讨论过的AND,OR和NOT操作,它也能做简单的数值测试,比如一个数字是不是负数。例如,这是检查ALU输出是否为0的电路,它用一堆OR门检查其中一位是否为1,哪怕只有一个Bit(位)是1,我们就知道那个数字肯定不是0,然后用一个NOT门取反。所以只有输入的数字是0,输出才为1,以上就是ALU的一个高层次概括,我们甚至从零做了几个主要组件,比如行波进位加法器,它们只是一大堆逻辑门巧妙的连在一起而已。

 让我们回到视频开始时的ALU,英特尔74181,和我们刚刚做的8位ALU不同,74181只能处理4位输入。也就是说,你刚做了一个比英特尔74181还好的ALU!其实差不多啦..我们虽然没有全部造出来,但你理解了整体概念。74181用了大概70个逻辑门,但不能执行乘除.,但它向小型化迈出了一大步,让计算机可以更强大更便宜,4位ALU已经要很多逻辑门了。但我们的8位ALU会需要数百个逻辑门,工程师不想在用ALU时去想那些事情,所以想了一个特殊符号来代表它,看起来像一个大"V",又一层抽象!

我们的8位ALU有两个输入,A和B,都是8位(bits),我们还需要告诉ALU执行什么操作,例如加法或减法,所以我们用4位的操作代码。我之后的文章会再细说,简言之,"1000"可能代表加法命令"1100"代表减法命令,操作代码告诉ALU执行什么操作,输出结果是8位的。

ALU还会输出一堆标志(Flag)"标志"是1位的,代表特定状态。比如相减两个数字,结果为0,我们的零测试电路(前面做的)会将零标志设为True(1)如果想知道两个数字是否相等,这个非常有用,如果想知道:A是否小于B,可以用ALU来算A减B,看负标志是否为true,如果是true,我们就知道A小于B。最后,还有一条线连到加法器的进位,如果有溢出,我们就知道。

这叫溢出标志,高级ALU有更多标志,但这3个标志是ALU普遍用的。其实,我们之后的文章会用到它们,现在你知道了计算机是怎样在没有齿轮或杠杆的情况下进行运算,接下来两集我们会用ALU做CPU,但在此之前,计算机需要一些"记忆"!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值