我目前正在使用Logisim构建一个16位ALU(即仅限逻辑门),并且我被困在一个除法过程中。我目前只使用简单的标准“除法算法循环”(如下所示):
- 读取输入值;
- 比较输入值。等到比较过程结束;
- 如果A< B转到步骤10.如果A≥B,转到下一步;
- 从A中减去B;
- 等到减法过程结束;
- 添加一个来计算;
- 等到计数过程结束;
- 从减法过程写入值到输入;
- 转到第1步;
- 答案是数余数A
醇>
然而,这对于具有大答案的过程需要很长时间(重复300个刻度循环65,000次并不好玩)。 我只是想知道是否有类似的算法可以使用逻辑门实现更快(专门使用加法和/或减法和/或乘法以及任何布尔逻辑)。 任何帮助或想法将不胜感激! 弗雷泽
答案 0 :(得分:3)
使用long-division。在二进制中,没有乘法,因为每个位位置的商只能是1或0.所以它可以实现为条件减法(如果结果非负则减去)和移位。
当然,这只是一个粗略的轮廓。
答案 1 :(得分:2)
32/16:16 + 16除法的典型方法是将被除数存储在一对16位寄存器中(在运算期间得到更新)和除数存储在自己的寄存器中(不是)。十六次,从除数中减去被除数的高17位;如果借用结果,丢弃结果并将除数移到一个位置,将0放入lsb。如果没有借位结果,将结果存储到除数中,同时向左移动,但将1放入lsb。在十六个这样的步骤之后,被除数寄存器的低16位将保持商,高16位将保持余数。请注意,只有当商可以16位表示时,此操作才有效。还要注意,在以这种方式实现32/16:16 + 16除法的处理器上,可以方便地将任意大数除以16位数,因为每一步的被除数的高16位应该是来自上一步。