Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

除法器

复习

  • 累加器:把寄存器输出接回运算器,构成能连续累加的累加器
  • 状态机:时序逻辑用状态和输入决定下一步动作
  • 乘法器:乘法拆成移位和多次加法,并用状态机推动

TL;DR

  • 除法可以拆成移位、比较与多次减法
  • 每一轮只回答“这一次够不够减”
  • 商记录每轮的答案,最后没有分完的部分就是余数

正文

  乘法是在问“要加几份”,除法则是在问“最多能拿走几份”。

  比如 13 ÷ 3。在十进制里,我们知道能拿走 4 份,还剩 1。可电路不会凭感觉就猜出 4——它不会感觉,但它会减法,也会判断一个数够不够减。只要把这两个本事用对,除法就能一步步试出来。

一位一位试

  把 13 写成二进制 1101,3 写成 0011。我们从高位开始,把被除数逐位“带下来”,就像做十进制长除法:

  1. 当前只有 1,比 3 小,商这一位写 0
  2. 再带下一位,得到 11,刚好够减 3,商写 1,余数变 0
  3. 带下 0,仍然不够减,商写 0
  4. 带下最后的 1,仍然不够减,商写 0,余数留下 1

  得到的商是 0100,也就是 4;余数是 1。验证一下:3 × 4 + 1 = 13。

  竖式里的每一步,电路都可以用同一个问题概括:

当前部分够不够减去除数?

  够,就减并在商里写 1;不够,就保留原数并写 0。然后移一位,继续问下一轮。

除法器需要什么

  于是,一个最简单的除法器只要会做这些事:

  • 用减法器试减
  • 根据结果决定保留原数还是减后的数
  • 把商左移并补进新的 0 或 1
  • 重复固定次数

  你可能已经发现:乘法器和除法器长得非常像。它们都没有发明新的基本运算,只是让加减法器配合移位,一轮一轮地工作。机器做复杂运算的秘诀,多半是把一个难题拆成一串它已经会做的小动作。

一个不能算的数

  除数如果是 0,“够不够减”就永远没有意义。因为任何有限的商乘 0 都得不到原来的被除数,试下去也永远不会有结果。所以控制电路必须在运算开始前检测并报告除零,而不是让状态机无休止地试下去。

  这其实是除法比乘法更麻烦的地方:它多了一种“合法输入却无法计算”的情况。处理它的方式,是提前检查、提前报错——这个思路以后还会反复出现。

  乘法器和除法器已经证明,ALU、寄存器、时钟与状态机可以合作完成多步任务。下一章,我们把少量寄存器扩展成能按地址保存许多数据的存储器。

思考题 1

  计算 1110 ÷ 0011。商和余数分别是多少?如何用“除数 × 商 + 余数”检查答案?

思考题 2

  为什么除法器必须在开始前检查除数是不是 0,而乘法器却不需要类似的操作?

小结

知识点

  • 二进制长除法
  • 移位减法除法器
  • 商与余数的来源
  • 除零必须单独处理

参考资料

  1. Wikipedia(zh):除法器:数字除法器的实现方式
  2. Wikipedia(zh):带余除法:商与余数的关系

思考题答案(仅供参考)

思考题 1

  1110₂ 是 14,0011₂ 是 3,所以商为 0100(4),余数为 0010(2)。检查:3 × 4 + 2 = 14。

思考题 2

  因为乘法对任何除数都不会出现“无法计算”的情况,任意两个数相乘都有有限的结果;而除法的除数为 0 时,根本不存在满足条件的商。所以乘法器不必做额外检查,除法器则必须提前拦截这种输入。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪