之前我们了解并实现了全加器,又通过全加器改造的到了减法器,将这两个电路合并到一起,就构成了ALU的加减法计算部分。
在之前我们有介绍过,ALU其实就是用来做一些运算的,我们把各种运算模块组合到一起,就变成了ALU。
加法和减法
在很久以前的从零开始的手搓CPU(3)——从逻辑门到全加器一章中,我们使用逻辑门建造了一个4位的全加器。全加器是我们CPU计算功能,同时也是ALU的重要组成基础。
如果我们使用两个4位全加器相连,便可以实现一个8位的加法器,也就是我们ALU中负责运算的模块,为了节省空间,我们会使用到74LS283芯片,这是一个4位全加器芯片,我们使用两块74LS283便可以组成8位全加器。这个芯片的资料可以在文章底部找到。
关于其他加法的相关内容,在之前制作全加器时已经介绍的比较多了,这里就不再重复说明了。这里说一下减法器。
减法器,顾名思义是用来做减法运算的。在之前的从零开始的手搓CPU(6)——负数及CPU的减法运算一章中,我们也详细介绍了CPU中是如何进行减法运算的。减法运算本质上也使用了加法器,只是需要做一些简单的修改。所以实际上我们可以使用一个加法器+模式切换的方式来为ALU同时实现加法和减法的功能。
根据从零开始的手搓CPU(6)——负数及CPU的减法运算一章的介绍,减法计算只需要将减数的绝对值取相反数,然后与被减数相加即可,所以我们需要先将减数处理成绝对值的相反数,也即是正数按位取反后+1,不过实际上,减数(加数2)存在两个状态,在加法时该数不用进行操作,但是在减法时需要取反,所以我们需要设计一种电路,达到可控按位取反的目的。
实际上,我们观察各种门电路的真值表可以得知,XOR可以满足我们的需求。在从零开始的手搓CPU(2)——从开关到逻辑门一章中我们有介绍到XOR,它的输出只会在两个输入信号不同时为1。我们将该门的一个引脚接入减法运算控制线,另一个引脚接入减数(加数2)。
正如上图所示,当最上方的控制线激活时,输入与输出相反,反之输入与输出相同。同时我们再将这条控制线连接到减数(加数2)的加法器的低位进位引脚,在控制线激活时,即同时完成了数字取反并+1的操作,以此作为第二个加数,即是进行减法运算。
ALU数据流
在完成ALU加减法计算模块后,我们需要再考虑数据的流向,也就是数据从哪儿来,要到哪儿去,什么时候来,什么时候放出去。
为了控制数据的流动,我们需要用到之前在从零开始的手搓CPU(8)——总线与三态门一章中介绍到的三态门。
我们将计算结果数据通过三态门连接到总线中,以此我们可以控制计算结果是否向总线中释放。两个待运算的数据从A、B两个寄存器中引入,在入口处我们不需要设置三态门控制输入,因为内存输出已经有三态门进行控制了,而且两个输入固定连接到两个寄存器,不会出现数据混乱的情况,如果我们需要需要扩展寄存器或ALU的功能时,再考虑入口数据的处理。
如上图,我们将时钟、寄存器、ALU、总线连接到一起,并将第二个寄存器值固定为1,第一个寄存器值从1开始,并从始终总线中读取数据,然后激活频闪时钟模块,就可以实现ALU不断自增1的运算,如下图(为了方便观察,我将时钟模块的速度调到了特别慢):
总结及参考资料
这一章描述的比较简单,因为ALU加减法部分里涉及到的内容在之前的各章节中都有详细的介绍,所以这一章主要是使用之前学习到的内容将ALU具体实现出来。下一章我们将开始进行内存模块的搭建,内存模块搭建的过程比较复杂,但只要理清逻辑应该就没有什么太大的问题。





