逻辑运算的实现

ALU也就是算术逻辑单元,它能够提供基本的算术运算和逻辑运算的功能。那从硬件层面上,它是如何实现的呢?就让我们先从相对简单的逻辑运算开始分析。

屏幕快照 2018-07-04 08.52.37

现在我们已经掌握了门单元的功能,可以提供基本的逻辑运算。例如这个与门就可以对两个二进制的输入进行与操作,并输出结果。但这和计算机当中与运算指令所需的功能还是有差距的。例如,and rd, rs, rt,这条and指令,它的两个源操作数都是32位的寄存器,它的目的操作数也是一个32位的寄存器。也就是说它要同时对两个32位的二进制数进行与操作运算,并得到一个32位的运算结果。那么怎么用与门来完成呢?

屏幕快照 2018-07-04 08.52.47

其实也很简单,我们就把32个与门并排连起来,将32位的输入分别连接到A0......A31A0......A31这32个与门上。可以标记为A0,A1一直到A31,这代表第一个操作数rs,而从B0,B1一直到B31,这代表第二个操作数rt。这32个 与门的输出,分别记为Y0,Y1直到Y31。它们就组成了一个32位的数。在这条与运算的指令控制下,rs所指定的寄存器的内容会被传送到这个端口,而rt所指向的内容会被传送到另一个端口。经过这些与门之后,得到的运算结果,会被传送到rd所指定的寄存器当中。这样就完成了这条指令所要求的与运算。

屏幕快照 2018-07-04 08.52.56

与之类似,如果我们要完成这条或运算指令,则需要32个或门,这样就构成一个可以完成32位或运算的单元。

屏幕快照 2018-07-04 08.53.07

那在ALU当中,实际上是包含了多种不同的功能部件。包括我们刚才提到的32位的与运算,32位的或运算,还会有其它的逻辑运算以及算术运算单元。那它们是怎样合成一个整体的呢?对于这个整体的运算单元,它需要有一个32位的输入,然后在运算单元的内部,分别连接到各个不同的运算功能部件的A输入端口。然后将另一个32位的输入也在运算单元的内部分别连接到各个不同功能单元的B输入端口。这样每个功能部件都按照各自的功能完成对应的与操作、或操作,以及其它的操作,并产生对应的运算结果。

那现在的问题是,我们到底需要哪个运算结果作为输出呢?这就还需要增加一个部件就是多选器。这里我们假定这个运算单元当中包含四种功能,所以我们会有四个运算的结果,要经过一个四选一的多选器。那样从四个选择当中选出一个来,我们就需要一个两位的选择信号,当这个选择信号为00时,在这个图中就会选择与运算功能部件输出的结果。如果它是01时,就会选择这个或运算功能部件输出的结果。这个多选器实际上也是由若干个门组成的。当然如果这个运算单元中也可能包含着更多数量功能单元,比如说8个,那么就要使用一个8选1的多选器,而运算类型的选择信号也要扩大为3个bit。那好经过这个多选器之后,我们就可以产生一个32位的输出。那对于这一个完整运算单元来说,当我们通过运算类型选择信号选择了对应的运算类型之后,从运算单元的输出端口,我们就可以看到经过指定运算之后产生的输出。

屏幕快照 2018-07-04 08.53.17

扫描二维码关注公众号,回复: 10150165 查看本文章

回到之前提到过的在模型机上进行逻辑运算的这个例子,如果我们要执行 and $8, $9, $10 这条指令,实际上是在控制电路的控制下,将9号和10号寄存器的内容分别连接到ALU的两个输入端,这里我们需要进行的与运算。如果按照上一页给出的例子,这时候控制电路给出的选择信号应该是00。最后控制电路还会将ALU的输出与8号寄存器的输入相连,这就相当于左边这张图所显示的电路的连接,最上面是由32个D触发器组成的8号寄存器,中间是9号寄存器,然后是10号寄存器。9号、10号寄存器的Q端的输出会被连接到ALU的两个输入,同时ALU的功能选择信号输入了与运算所对应的编码。然后ALU的输出会被连接到8号寄存器的输入D端, 所以在某一个时钟周期内,ALU会按照输入的要求完成相关的运算,并将运算结果送到输出信号上,输出结果经过连线的传送,会送到8号寄存器的输入端,等到下一个时钟上升沿来临的时候,8号寄存器就会将输入端的信号采样,存入到寄存器内部,并会在输出端表现出来,之后的运算如果使用8号寄存器作为输入的话,就会使用这个新的值。

发布了2 篇原创文章 · 获赞 0 · 访问量 641

猜你喜欢

转载自blog.csdn.net/gsllz/article/details/104067908