计算机组成学习笔记(三)
目录
摘要
计算机组成学习笔记(三)。
4 乘法器和除法器
4.1 乘法的运算过程

- 个例子的特殊情况我们发现实际上它展示了一种更为简洁的过程。
- 原则其实可以很简单,我们不用再去关心九九乘法表是怎么样的,也不用再去关心每一位产生的进位是不是要加起来,我们只需要观察当前进行运算的乘数的位,如果这一位是一,那我们就直接将被乘数放置在与它对齐的位置上就可以了。如果当前参与运算的乘数位为零,那我们则直接将零放置在与它对齐的位置上, 这就是我们经过简化后的运算方法,针对这样的特殊情况每一个中间结果的产生都不需要去查找乘法表,都不需要进行加法的运算,要么是被乘数本身,要么是全零,根据当前参与运算的乘数位 做一个非常简单的二选一的操作就可以了。
- 关键在于,如果乘数为1,被乘数左移一位,进行相加;乘数为0,左移一位都是0,也就是再左移一位,再将结果相加。





4.2 乘法器的实现

- 要实现一个四位的乘法器, 首先我们需要一个寄存器来保存被乘数,被乘数寄存器是一个八位的寄存器。而且带有左移的功能。 它有一个左移的控制信号输入,当外部的控制逻辑将这个信号视为有效时,在下一个时钟顺延到来的时候,被乘数寄存器当中的内容就会向左移动一位。
- 第二个寄存器是乘积寄存器,这也是一个八位的寄存器。用来保存运算的结果。
- 被乘数寄存器当中的内容和乘积寄存器当中的内容需要进行加法运算, 这里我们就需要进行一个八位的加法器。它会将被乘数寄存器当中的内容和乘积寄存器当中的内容进行相加,并将结果再送到乘积寄存器当中。
- 另外,我们还需要一个寄存器来保存乘数。这个寄存器只要四位就可以了。
- 但有一点比较特殊,乘数寄存器的最低位被连到了控制逻辑,也就说控制逻辑可以观察当前乘数寄存器的最低位,并据此来生成相关的控制信号,这些控制信号就包括是否要让加法器进行加法运算,以及是否要让乘积寄存器保存当前的运算结果。
- 另外,这个乘数寄存器还需要有向右移位的功能, 同样也是由控制逻辑发出的信号来进行控制的。












4.3 乘法器的优化1

- 优化:加法和移位的操作能否并行操作?

- 假设现在时钟上升沿还没有来临,那“被乘数寄存器”的输出就是它当前所保存的内容00001000,这八位信号会被送到加法器的输入端,而加法器的另一个输入端连接的是“乘积寄存器”的输出端,因此,现在的信号值是全0。而当前“乘积寄存器”的最低位为1,控制逻辑会据此 产生相关的控制信号,包括让加法器进行加法运算这样加法器就会产生对应的运算结果。与此同时,控制逻辑还会给出写输入信号 但是现在时钟上升沿还没有来,所以“乘积寄存器”其实什么也不会做。
- 在这个时候,控制逻辑实际上可以同时给出“被乘数寄存器”的移位信号还可以给出“乘数寄存器”的移位信号。那现在,控制逻辑就将刚才流程图当中的第1a步第2步和第3步所对应的控制信号都置为有效了。但是因为时钟上升沿还没有来,所以这些寄存器的内容都不会发生变化。

- 当时钟上升沿到来的时候,这些寄存器就会根据输入改变其内容。“乘积寄存器”会将输入端的数保存起来,“被乘数寄存器” 会向左移动一位,“乘数寄存器“会向右移动一位。而这些操作都是在同一个时钟上升沿到来的时候完成的。
- 这3个寄存器 它们是同时发生变化的。而且根据我们对寄存器的了解,我们已经知道,在时钟上升沿之后很短的一个时间寄存器所改变的内容就会传送到输出端。因此我们可以注意到,”被乘数寄存器“的内容现在已经改变,因此很快,它的输出也会变成00010000,并传递到加法器。
- 但是我们可以放心的是,即使这个信号经过了加法器,并产生了新的运算结果 这个运算结果也不会改变”乘积寄存器“的内容。因为等这个信号传递到了”乘积寄存器“的输入端时 已经过去了一段时间,这时候”乘积寄存器“对输入端的采样工作已经完成其输入端信号的改变不会影响这个寄存器的内容了。这样我们就在同一个时刻完成了所有的加法和移位的操作。

4.4 乘法器的优化2

- 用八位的寄存器来保存了一个四位的被乘数,这就是浪费。

- 这个乘数寄存器当中虽然一开始是没有浪费的, 但是在运算的过程中每个周期有效的数字会减少一位,所以逐渐就会出现浪费的位数,而且越来越多。

- 乘积寄存器,最后的乘积确实需要8位才能保存, 但是问题在于这个乘积寄存器在不断的保存中间结果,而中间结果一开始并不是8位的。 对于乘积寄存器,虽然最终它没有浪费, 但是在最开始,它的高四位是浪费的。而且其中的有效数字每个周期也是增加一位。

- 加法器,实际上每一次在将被乘数和当前的乘积进行相加的时候,无论被乘数左移到什么程度,实际上只有真正有效的那四位的被乘数需要和乘积寄存器当中对应的位进行相加,被乘数寄存器当中从右边补入的那些0实际上 是不用参加运算的。

- 被乘数寄存器缩减为4位,而且取消了左移的功能,
- 用乘积寄存器的右移,代替被乘数的左移,那么乘积寄存器初始值的放置位置也发生了一点变化,我们把它放置在高四位的地方。
- 因为乘积寄存器已经被削减到了四位,而乘积寄存器,初始值放在了高四位的地方,所以我们就将加法运算改成被乘数寄存器的这四位和乘积寄存器的高四位进行运算。
- 把乘数放在乘积寄存器的第四位,从而可以取消乘积寄存器这个部件。

4.5 除法的运算过程


- 关键在于,被除数减去除数,得到余数,即新的被除数。然后除数右移一位,再与新的被除数,即余数相减。商根据正负判断,负数表示不够减,左移一位补0,然后回退之前的相减步骤(通过相加实现),得到旧的被除数,再与新的除数,进行计算。
4.6 除法器的实现


















4.7 除法器的优化



- 将除数寄存器缩小为32位,这个除数寄存器也就不用再支持移位。
- 原来有一个32位的商寄存器,它一开始是空的,在运算的过程中逐位填满,那既然它一开始没有用,所以我们干脆先取消这个寄存器。
- 原来有一个64位的ALU,而我们知道,实际参与运算的其中一个操作数是除数, 另一个操作数,则是余数寄存器当中和除数对应的一些位,实际上只有32位,所以我们就将这个64位的ALU缩小为32位。
- 余数寄存器只有高32位参与这个加减法运算,我们也在这个余数寄存器当中,画一条半透明的线作为标记,而整个余数寄存器仍然保留为- 64位,它其中的高32位被连接到ALU的一个输入, 而ALU的输出也连接到了余数寄存器的高32位。
- 除数寄存器已经不能右移了,与之相对,余数寄存器那就得支持一个左移的功能。余数,或者说被除数的高位一旦退出了运算,就不再会有机会重新参与运算了。所以把余数寄存器的高位向左移位,并将移出的位丢弃,是不会对运算的过程造成影响的。这个余数寄存器不仅支持左移,还支持右移的功能(不够除的回退情况)。
- 商在运算的一开始是不需要占据任何空间的,只需要每一轮采用左移的方式,给它多分配一个比特就可以了。那就正好是余数寄存器现在所浪费的情况,那我们就可以很自然地将商寄存器合并到余数寄存器当中,让每一轮产生的商,从余数寄存器的右端,逐个移入。

- 乘法的每一个中间结果,都是独立的,每一个中间结果,要么和被乘数相等,要么是0,而且它究竟是哪一种,只有乘数当中固定的一位决定,不受其他位的影响。
- 当我们有了被乘数和乘数之后,可以交给很多人来协作运算,这样就可以通过并行的计算,大幅度地提高性能。

- 仔细分析就会发现,这个分支实际上是不存在的。
- 因为当最低位为1时,会执行将被乘数寄存器和乘积寄存器相加,这样一个操作。那么我们不妨可以理解为,将被乘数寄存器的内容和乘数寄存器的最低位进行一个“与操作”,然后再和乘积寄存器相加。
- 因为现在乘数寄存器的最低位是1, 任何数和1进行”与操作“,结果还是这个数本身,所以这样的改动并不会影响这里的操作。而当最低位为0时,因为任何数和0进行”与操作“,结果都是0,0再和乘积寄存器相加,那就相当于没有执行加法操作,乘积寄存器的内容并没有改变。
- 所以实际上,我们可以将这个分支取消,在每轮的最开始,都直接将乘数寄存器的最低位和被 乘数寄存器进行”与操作”,然后和乘积寄存器相加,这样无论最低位是1,还是0,都能完成这个工作流程图所表达的工作。

- 然而对于除法的这个工作流程, 这一次减法的运算结果是事先无法预知的,因此无法预知下一步将执行哪一个分支,而且其中一种分支还需要将这个减法操作进行回退,所以也没有办法将两个分支进行合并。因此,在这个除法运算流程的大框架之下, 是很难进行进一步的性能优化了。