# 加法器

既然“只读存储器ROM”能够制作“十六进制数码管”，那么我们能不能利用它的映射功能再制作点其它的元件呢？本节我们来制作一个“加法器”，用于我们即将制作的计算机系统里。加法器是一种什么样的元件呢？Logisim里就有内置的加法器，它有两个输入端，一个输出端，输出端的结果就是两个输入端二进制数的求和。我现在用内置的加法器给你演示一下，如下图所示。

![](https://3964505959-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FW1K2pamBzK76kBfmyyQw%2Fuploads%2Fgit-blob-fe513ff5dc432cf1056d370ac47163eaa4022300%2F4-12.gif?alt=media)

了解了加法器的功能，现在我们用“只读存储器”来制作一个“加法器”。先举个例子，如果想计算0110+0011的话，我们可以使用一个8位输入端，4位输出端的ROM，然后把两个二进制数字连接到一起，形成一个新的地址01100011，在地址01100011位置提前存储好它们两个相加的值即可。当我们把所有从0000到1111的各种排列组合的加法都提前存储到对应的地址中，加法器就制作完成了。虽然看上去是个很笨拙的办法，但是当加法器数据位数不多的时候，是不成问题的。下面我们看一下4位的加法器所使用的ROM里面是如何存放数据的？如下图所示，我们随机挑选几个地址的值验证下，地址0x00里数据为0x0（以0x开头的数字，代表是十六进制数字），因为0+0=0，所以值也是0。地址0x43里数据为0x7，0x43的二进制为01000011，0100+0011等于0111，即0x7。

![](https://3964505959-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FW1K2pamBzK76kBfmyyQw%2Fuploads%2Fgit-blob-3dd4ecfcd8ddb32ca0226af2fa1fdba1876bffd9%2F4-13.gif?alt=media)

## 带进位的加法器（拓展内容）

通过上述方式制作的加法器虽然可以正常工作，但非常耗费ROM的存储空间。下面我介绍另外一种实现加法器的方法，它仅仅使用少量的ROM存储空间即可。首先我们制作出如下图所示的加法器，注意看，它有3个输入端。它完成的功能是把3个1位数进行求和，因为3个1位数相加结果最大的时候就是1+1+1=11（二进制），所以输出端设计为2位。

![](https://3964505959-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FW1K2pamBzK76kBfmyyQw%2Fuploads%2Fgit-blob-054a7a62a9bddb6a35c6db43f59e7b72a442a0a7%2F4-15.gif?alt=media)

还记得2个十进制多位数字是如何计算加法的么？当2个对应位相加大于9的时候，就向左进一位。2个二进制数字相加原理也是相同的，比如我想计算二进制111+101等于几，可以按照如下图所示方式计算。

![](https://3964505959-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FW1K2pamBzK76kBfmyyQw%2Fuploads%2Fgit-blob-a35ea39409a8ffb79de32e027cdaf364ed30de45%2F4-18.gif?alt=media)

现在我们把刚才的3输入端1位加法器分别拿出一个输入输出端当作进位使用，然后使用4个这种加法器，把它们的进位端串联在一起，如下图所示，就完成了一个4位加法器的功能。从图中右下角处，我们可以看到，我们舍弃了输出端最高的进位，这样就保持了输入输出端的数据位数相同，都是4位。通过这种方式，即使我们制作一个64位的加法器，也不会消耗太多的ROM存储空间。

![](https://3964505959-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FW1K2pamBzK76kBfmyyQw%2Fuploads%2Fgit-blob-fa13ab78748ec977c6791f44149677ce589f9abb%2F4-16.gif?alt=media)
