上篇文章我们已经介绍了使用异或电路可实现一位的二进制加法,但是输出没有考虑到进位的情况,也就是说如果输入都是1,那么输出是0,同时需要进一位。考虑到只有输入都是1的时候才会进位,我们可以想到刚好与门符合这个特性,于是我们在异或电路的基础上再加一个与门电路,得到如下图:
上图叫半加器,其中A,B是输入,S为输出,C是进位输出。之所以叫半加器,是因为输入没有考虑进位输入。如果考虑进位输入,其真值表如下:
A | B | Cin | S | Cout |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
上面的表格就是全加电路的真值表了,那么全加电路该怎么设计呢?
输出电路设计很简单,只要将A,B经过半加器后的输出S0和进位输入Cin作为另一个半加器的二个输入就能得到全加器的输出S,但进位输出就没那么一目了然了,这个时候我们可以观察一下上面的真值表,可以发现一个规律:
- 当A和B都是1的时候,Cout等于1
- 或当A和B一个是0,另一个是1的时候,Cout等于1
第一条很明显可以使用与门实现,第二条使用异或门可以实现,而最终的输出应该是这两条当中的任意一个等于1的时候,输出就是1。所以最终全加器的电路如下:
到这一步我们才真正意义上实现了二进制一位的加法运算了,有了上面的全加器电路,那么实现8位的加法器就很简单了,只需要8个全加器,从最低位全加器开始,把它的进位输出Cout作为下一个全加器的Cin就可以了,最终的加法器电路像下面这样的:
上面只画了4位,其余的类似。看完这个电路图你可能有疑问,第一位的进位输入呢,第一位的进位我没画出来,实际上第一位的进位输入是固定的0,另一个问题最后一个全加器输出的进位怎么处理?试想一下假如我们CPU的数据线是8位的,但是计算加法的时候发现结果是9位的,这个情况实际上就是计算结果溢出了,表现为最后一个全加器的进位输出是1,这个输出CPU中会用一个专门的寄存器保存。
到这里我们终于知道了CPU是如何实现计算的了,我们文章中用二级管举例的,实际上我们的计算机发展大致经历了4个阶段:
- 电子管计算机
- 晶体管计算机
- 集成电路计算机
- 大规模集成电路计算机
每个阶段所使用的电子元器件不太一样,但原理是相通的。关于CPU主要介绍到这里,后面文章大致介绍一下CPU与其他组件如内存,硬盘等如何交互的。