304-逻辑运算的实现
# 304-逻辑运算的实现
ALU 也就是算术逻辑单元,它能够提供基本的算术运算和逻辑运算的功能。 那从硬件层面上,它是如何实现的呢? 就让我们先从相对简单的逻辑运算开始分析。 现在我们已经掌握了门单元的功能,可以提供基本的逻辑运算。 例如这个与门就可以对两个二进制的输入进行与操作,并输出结果。 但这和计算机当中与运算指令所需的功能还是有差距的。 例如这条and指令,它的两个源操作数都是32位的寄存器, 它的目的操作数也是一个32位的寄存器。 也就是说它要同时对两个32位的二进制数进行与操作运算, 并得到一个32位的运算结果。那么怎么用与门来完成呢? 其实也很简单,我们就把32个与门并排 连起来,将32位的输入分别连接到这32个与门上。 可以标记为A0,A1一直到A31,这代表第一个操作数,而从B0,B1 一直到B31,这代表第二个操作数。这32个 与门的输出,分别记为Y0,Y1直到Y31。 它们就组成了一个32位的数。在这条与运算的指令控制下, rs所指定的寄存器的内容会被传送到这个端口。 而rt所指向的内容会被传送到另一个端口。 经过这些与门之后,得到的运算结果,会被传送到rd所指定的寄存器当中。 这样就完成了这条指令所要求的与运算。
与之类似,如果我们要完成这条或运算指令,则需要32个或门, 这样就构成一个可以完成32位或运算的单元。
那在ALU当中,实际上是包含了多钟不同的功能部件。 包括我们刚才提到的32位的与运算, 32位的或运算,还会有其它的逻辑运算以及算术运算单元。 那它们是怎样合成一个整体的呢? 对于这个整体的运算单元,它需要有一个32位的输入,然后在运算单元的内部, 分别连接到各个不同的运算功能部件的A输入端口,然后将另一个32位的 输入也在运算单元的内部分别连接到各个不同功能单元的B输入端口。 这样每个功能部件都按照各自的功能完成对应的与操作,或操作, 以及其他的操作,并产生对应的运算结果。 那现在的问题是,我们到底需要哪个运算结果作为输出呢? 这就还需要增加一个部件就是多选器。
这里我们假定这个运算单元当中包含四种功能,所以我们会有四个运算的结果,要经过一个四选一的多选器。 那样从四个选择当中选出一个来, 我们就需要一个两位的选择信号,当这个选择信号为00时, 在这个图中就会选择与运算功能部件输出的结果。 如果它是01时,就会选择这个或运算功能部件输出的结果。 这个多选器实际上也是由若干个门组成的。当然如果这个运算单元中包含着更多数量功能单元,比如说8个,那么就要使用一个8选1的多选器, 而运算类型的选择信号也要扩大为3个bit。 那好经过这个多选器之后,我们就可以产生一个32位的输出。 那对于这一个完整运算单元来说, 当我们通过这个选择信号选择了对应的运算类型之后, 从运算单元的输出端口,我们就可以看到经过指定运算之后产生的输出。
回到之前提到过的在模型机上进行逻辑运算的这个例子, 如果我们要执行这条指令,实际上是在控制电路的控制下将9号和10号寄存器的内容分别连接到ALU的两个输入端, 这里我们需要进行的与运算。如果按照上一页给出的例子, 这时候控制电路给出的选择信号应该是00。 最后控制电路还会将ALU的输出与8号寄存器的输入相连, 这就相当于左边这张图所显示的电路的连接。 最上面是由32个D触发器组成的8号寄存器,中间是9号寄存器, 然后是10号寄存器。9号,10号寄存器的Q端的输出会被链接到ALU的两个输入, 同时ALU的功能选择信号输入了与运算所对应的编码。 然后ALU的输出会被连接到8号寄存器的输入D端, 所以在某一个时钟周期内,ALU会按照输入的要求完成相关的运算,并将运算结果送到输出信号上。 输入结果经过连线的传送, 会送到8号寄存器的输入端, 等到下一个时钟上升沿来临的时候, 8号寄存器就会将输入端的信号采样,存入到寄存器内部,并会在输出端表现出来。 之后的运算如果使用8号寄存器作为输入的话,就会使用这个新的值
这一节我们讲解了 如何通过简单的门电路构造出不同的逻辑运算单元, 而且我们还知道了如何将不同的运算单元整合成一个完整的ALU。 但是ALU当中的算术运算单元又是如何实现的呢? 我们从下一节开始分析。