24年的期末考试居然出现了设计除法器的题目,但是书上只有加法器、减法器、乘法器,就是没有最难的除法器。
于是打算写一个文档,深入解析除法器的工作原理。
参考视频:https://www.bilibili.com/video/BV1uY411J7Vs/?spm_id_from=333.337.search-card.all.click&vd_source=00459eee98eeb9a9bbb2fb584f0693e8
我们在小学二年级就学过如何做二进制除法。拿一个被除数,拿一个除数,然后让被除数依次减去除数。如果够减就商1,如果不够减就商0。如果商1,还需要把除数右移一位。然后进行下一轮减法。

于是我们有以下流程图(以32位除法器为例)

下面举一个具体例子:7(00000111)/2(0010)。(简化的4bit除法器)

- 初始状态:余数寄存器为00000111,除数寄存器为00000010,商寄存器为xxxx,计数器为4。
- 第一次循环:0000-0010=1110(实际上运算00000111-00100000,从上帝视角看可以简化为0000-0010)。发现结果是负数(最高位为1)。此时余数寄存器中是减法的结果11100111,但从上帝视角来看,因为0000-0010不够减,所以这次减法本不该做,但是正因为做了减法,我们才知道不够减。因此,要把余数寄存器还原为减法之前的内容。于是进行加法操作11100111+00100000=00000111(高位截断)。然后商左移1位,最低位商0(因为不够减)。最后计数器减1,等于3。
- 第二次循环:上帝视角0000-0010不够减,计算机视角00000111-00010000不够减。同样需要复原寄存器操作。然后商0,左移商,计数器减1,等于3。
- 第三次循环:同样不够减,左移,商0,计数器减1,等于2。
- 第四次循环:够减了,00000111-00000100=00000011。于是余数寄存器变为00000011,商寄存器左移1位,最低位商1。计数器减1,等于1。
- 第五次循环,够减了,00000011-00000010=00000001。于是余数寄存器变为00000001,商寄存器左移1位,最低位商1。计数器减1,等于0。
- 此时计数器等于0,计算结束。最终,余数寄存器为00000001,商寄存器为0011,除数寄存器为00000010。
因此,对于32位除法器,我们需要以下部件:
- 一个64位余数寄存器。这个寄存器一开始储存被除数,经过33次迭代后留下了余数。
- 一个64位除数寄存器。这个寄存器需要有右移功能,因为要不断右移和当前余数寄存器中的值做差。
- 一个32位商寄存器。这个寄存器需需要有左移功能,每次左移1位后商1或0。
- 一个64位ALU,支持加法和减法运算。
- 一个计数器。
电路如下:

计数器包含在控制单元中。