# 制作一个带有内存的计算机

上一节我们制作的计算机能够计算2+3了，但我又想到了个新问题：如果我现在想先计算2+3，再计算1+2，然后再把它们的结果进行相加，最后的计算结果显示到“十六进制数码管”上，该怎么设计“只读存储器”的指令呢？这时，我们就需要一个临时存储中间计算结果的地方了，我们可以再给前面章节的计算机增加一个内存，即“随机存取存储器”，其逻辑电路图如下图所示。

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

和前一节相比，我们改动比较简单，只增加了一个“随机存取存储器”，并给“只读存储器”增加了3个输出端用于控制“随机存取存储器”的数据读写。我们先来看下“只读存储器”多出来的输出端都是做什么的。

* D12\~D0和前一节功能相同，不再赘述
* D13控制内存的输出端是否连接到总线上
* D14控制总线数据是否传输到内存的地址输入端
* D15控制总线数据是否传输到内存的数据输入端

现在我们开始编写指令来实现这样一个功能，把2+3的运算结果保存到内存的地址0x7处，并把内存地址0x7处保存的数据通过总线显示在“十六进制数码管”上。我把编写好的指令绘制在如下的表格中。

| 地址   | D3\~D0 | D7\~D4 | D8 | D9 | D10 | D11 | D12 | D13 | D14 | D15 | 十六进制   |
| ---- | ------ | ------ | -- | -- | --- | --- | --- | --- | --- | --- | ------ |
| 0000 | 0001   | 0010   | 1  | 0  | 0   | 0   | 0   | 0   | 0   | 0   | 0x121  |
| 0001 | 0010   | 0010   | 1  | 0  | 0   | 1   | 0   | 0   | 0   | 0   | 0x922  |
| 0010 | 0011   | 0011   | 1  | 0  | 0   | 0   | 0   | 0   | 0   | 0   | 0x133  |
| 0011 | 0100   | 0011   | 1  | 0  | 0   | 0   | 1   | 0   | 0   | 0   | 0x1134 |
| 0100 | 0101   | 0111   | 1  | 0  | 0   | 0   | 0   | 0   | 0   | 0   | 0x175  |
| 0101 | 0110   | 0111   | 1  | 0  | 0   | 0   | 0   | 0   | 1   | 0   | 0x4176 |
| 0110 | 0111   | 0000   | 0  | 0  | 1   | 0   | 0   | 0   | 0   | 0   | 0x407  |
| 0111 | 1000   | 0000   | 0  | 0  | 1   | 0   | 0   | 0   | 0   | 1   | 0x8408 |
| 1000 | 1001   | 0000   | 0  | 0  | 0   | 0   | 0   | 1   | 0   | 0   | 0x2009 |
| 1001 | 1001   | 0000   | 0  | 1  | 0   | 0   | 0   | 1   | 0   | 0   | 0x2209 |

我们来逐条分析下这些指令是如何工作的。

```
地址0000：设置D8=1，使D7~D4的数据0010传送到总线
地址0001：设置D11=1使加法器的“输入端1”由0变成1，总线数据0010被保存到加法器的寄存器1里
地址0010：设置D8=1，使D7~D4的数据0011传送到总线
地址0011：设置D12=1使加法器的“输入端2”由0变成1，总线数据0011被传送到加法器的寄存器2里
地址0100：设置D8=1，使D7~D4的数据0111传送到总线
地址0101：设置D14=1，把总线数据传送给内存的地址输入端
地址0110：设置D10=1，使加法器输出的计算结果传送到总线
地址0111：设置D15=1，把总线数据传送给内存的数据输入端完成保存
地址1000：设置D13=1，把内存数据传输到总线上
地址1001：设置D9=1，把总线数据传送给“十六进制数码管”显示出来
```

它的演示动画如下图所示。

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