「计算机在没有齿轮的时候是如何负责运算的呢?」
「ALU就是计算机里负责运算的组件,这篇文章就是教你自己做一个ALU」
第一个ALU
「1970年,第一个封装在单个芯片内的完整ALU——英特尔74181诞生」,这在当时是惊人的工程壮举!

算术单元
二进制中,1=true,0=false
两个数字相加
加法电路半加器(不可处理进位)
「两个bit(bit是0或1)相加。」
两个输入A B,一个输出为AB的和。这三个值都是单个比特(0或1)
0+0=0
转换为逻辑门就是两个输入都为false,输出也是false。和XOR逻辑门一致
1+0=1,0+1 =1
转为逻辑门就是一个输入true,一个输入false,输出为true。这个也和XOR的逻辑门一致
(特殊)1+1=0 需要进位
1+1的结果是0,1进到下一位。可以看到XOR的逻辑门并不支持这个(输入都为true输出为false只对了一部分)还「需要一个输出线用于表示进位」,所以我们需要稍加修改
根据上面的情况,新加一个输出线表示进位数字。这个进位的「输出只有在1+1的时候才会输出1(」 输入都为true的时候他才会为true)这个是不是很像AND的逻辑门。
「把输入的两个线接到专门用于处理进位的AND逻辑门中,这样一个一位的加法器(此时不能处理进位的输入,也叫做半加器)就做好了」

抽象封装为独立组件
将其封装为一个单独的组件。
两个输入AB,两个输出SUM表示总和,CARRY表示进位(「下一位计算的时候要把上一位的进位加上」)

全加器(可处理进位的加法器)
刚刚提起到进位:下一位计算的时候要把上一位的进位加上,上面只是完成了一个比特的加法(不需要处理进位输入的加法),「如果有多位需要进行运算这时候就需要多一个输入进位了。这种需要进行三个输入的加法器叫做全加器用于计算进位的。」
看下全加器的运算表格:
两个输入AB还有一个是上一个的进位C
两个输出一个「代表进位用于给下一个加法器作为下一个加法器的C」,SUM代表这一位的计算结果

实现思路
输出SUM
先来看看我们人是怎么做计算的:「先对两个输入AB相加然后在和进位相加」。第一步的计算是单个比特进行相加,第二步的结果和进位相加也是单个比特进行相加,所以我们组装两个半加器。
「第一个半加器用于计算结果(前两个输入:AB)」 ;
第二个「半加器接受上一个半加器的结果和进位作为输入(上一个半加器的SUM和进位【第三个输入】)」
输出CARRY
首先来看下需要进位的两个case:
1.「两个输入本身就需要进位」(AB都为1的情况,1+1本身就需要进位)。这种情况不就是第一个加法器的进位嘛~~
2.「两个AB的计算结果是1进位也是1也需要进位」。这种情况不就是第二个加法器(AB的输出和进位相加)输出的进位嘛~~
可以看到两个条件有一个成立,这时候就需要进位。因此使用OR门连接到两个半加器的进位相连输出到全加器的CARRY输出中
「解释:」
「注意这仍然是一个一位的加法器只不过是比半加器支持多输入一个进位,这种加法器叫做全加器。」
验证的时候是这么个流程:左边的AB是输入,右边的CS是进位和总和。第二个加法器的输入AB(其实不是输入的AB代表的是第一个加法器的SUM和输入的C)不要搞混了
读者可以配合上面的全加器表格输入ABC,进行验证最后对应的SUM和CARRY是否正确

抽象封装为独立组件
比半加器多了一个输入进位

原文始发于微信公众号(北洋洋洋):教你自己制作一个ALU(上)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76001.html