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

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

和前一节相比,我们改动比较简单,只增加了一个“随机存取存储器”,并给“只读存储器”增加了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,把总线数据传送给“十六进制数码管”显示出来

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

Last updated