进行 A B 计算,例如 3 2 的和,3 的二进制是 11 (A1A0),2 的二进制是 10 (B1B0),
先算 A0 B0,输出 C1 = 0,S0 = 1,再计算 A1 B1 C1,输出 S1 = 0,C2 = 1,最终的结果由C2、S1、S0 拼成 1012 = 5。
要几位加法就用几个加法器串联,如四位(15 15):
现在我们就有了一个 4 位加法器,已经达到了小学 2 年级的水平,是不是特别给力?
五、减法器减法器其实是本质还是通过加法器实现的,比如 5 - 3,其实就是 5 (-3)。
十进制 | 原码 | 反码 | 补码 |
5 | 0000 0101 | 0000 0101 | 0000 0101 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
先将十进制转为补码,再将补码输入全加器,这样就做到了减法计算。
六、乘法器做完加法器我们再做个乘法器吧,当然乘任意10进制数是有点麻烦的,我们先做个乘2的吧。
乘2就很简单了,对于一个2进制数数我们在后面加个 0 就算是乘 2 了,比如
5 = 101(2)
10 = 1010(2)
所以我们只要把输入都往前移动一位,再在最低位上补个零就算是乘2了。
那乘 3 呢?简单,先位移一次(乘 2)再加一次。乘 5 呢?先位移两次(乘 4)再加一次。
所以一般简单的 CPU 是没有乘法的,而乘法则是通过位移和加算的组合来通过软件来实现的。
现在假设我们有加法器了,也有一个位移1位的模块了。把这两个模块串联起来你就能算 (A B ) * 2 了!激动人心,已经差不多到了小学 3 年级水平。
那我要是想算 A * 2 B 呢?
简单,把加法器模块和位移模块的接线改一下就行了,改成 A 先过位移模块,再进加法器就可以了。
改个程序还得重新接线?
所以你以为呢?编程就是把线来回插啊。
早期的计算机就是这样编程的,几分钟就算完了但插线好几天。而且插线是个细致且需要耐心的工作,所以那个时候的程序员都是清一色的漂亮女孩子,穿制服的那种。
七、选择器虽然和美女作伴是个快乐的事,但插线也是个累死人的工作。所以我们需要改进一下,让 CPU 可以根据指令来相加或者乘2。
这个就简单了,sel 输入 0 则输出 i0 的数据,i0 是什么就输出什么。同理 sel 如果输入 1 则输出 i1 的数据。
有这个东西我们就可以给加法器和乘2模块(位移)设计一个激活针脚。
这个激活针脚输入 1 则激活这个模块,输入 0 则不激活。这样我们就可以控制数据是流入加法器还是位移模块了。
八、触发器现在我们终于可以做 A × B C 了,这就需要先保存 A×B 的结果,在与 C 相加,等等...保存?话说在计算机内部是用什么方式保存数据的呢?
由于保存数据的重要性,电路中使用何种方式可以保存数据。比如使某个器件一直输出高电平,那不就是 1 了吗?一直输入低电平,那不就是 0 了吗?这里再引入一个触发器。