多位加法器

在之前, 我们曾经实现了一个简易加法器, 费了不少的篇幅, 但最终, 它的功能却并不令人印象深刻, 毕竟它仅能做一位的加法, 这使得它的用处非常有限.

人们发明计算的机器, 如果仅是做如此简陋的几条加法, 显然是没有什么意义的, 甚至在拨动开关的同时, 我们口算或者心算都比它更快.

自然, 万事开头难, 前面之所以用了这么多篇幅, 有的是为熟悉 Circuitjs 模拟器, 有的是为介绍数字电路设计的一些基础知识, 还有不少的精力用在了显示的译码上.

尽管从某些方面讲, 关于显示方面的并非是核心的功能, 但为了打好基础, 这些付出也是值得了. 现在有了这些基础, 也为后续设计更复杂的功能提供了便利. 现在让我们开始考虑更多位的加法器.

两位加法器初步

不妨就从两位的考虑起. 设想有这样两个两位的二进制数的加法:

10 + 01

显然, 对应于十进制也就是 2 + 1, 结果是 3, 相应二进制为 11.

也即 10 + 01 = 11. 所谓两位数加法, 仍旧应用前面一直使用的 分而治之 的方式, 无非也就是做了两次一位数的加法:

  • 高位: 1 + 0 = 1;
  • 低位: 0 + 1 = 1.

合起来, 结果是 11. 模拟器已经内置了半加器, 直接添加两个半加器, 让它们分别做高位和低位的加法, 再把结果整合起来:

两位加法器 10+01

看上去似乎就解决了问题.

进位问题

但只要情况稍有不同, 比如要做:

11 + 01

按照上述加法器的做法, 结果是 10, 显然是不对的.

两位加法器, 错误情况, 11+01

问题首先出在低位上: 1 + 1 = 10, 产生了进位, 但进位被丢弃, 只留下了 0, 加完后结果反而变小了, 肯定是不行的.

应该说, 把多位数的加法拆分成多个一位数的加法, 这个大的思路是没有问题的, 问题出在一位数的加法上, 因为存在进位的问题, 这迫使我们重新审视一位数加法的执行过程, 乃至重新审视我们的一位加法器原型.

results matching ""

    No results matching ""