一、回顾上一节的存储器

为了后续课程能够简单一点,我们就把怎么样往存储器里面放数字过程的电路省略了。
看下图,这是我们在《存储器》里面那节课抽象出来的存储器符号。

下图为该存储器的内部结构:

  1. A0 - A3: 4个开关来形成地址
  2. D0 - D4: 5个开关拼成要写入的二进制数,
  3. W:用来向存储器下达写入命令

从地址0000开始,每当一个地址和一个二进制数准备好后,按一下W开关,就这样操作,直到把所有的数都按照顺序写入存储器。

即使中途写错了,但是存储器的好处就是你可以反复修改一个地址里的内容。

地址无论是从下往下,还是从上往下,对于我们来说都没有区别。
16个存储单位,只有前5个被填充了数字,其他一律为00000。
也就是说地址0101 -1111 的存储单位,我们并没有使用

正常情况下,要把前面写进去的数一个一个地读出来,同样需要给出地址,然后使R=1。

有什么办法能够用最省事的方法连续操作,把它们按顺序一个一个地取出来? 毕竟最终的目标是将他们按顺序相加。

二、有什么办法连续读取存储器数据?

观察下图,假设“存储器”里已经存放了我们要加起来的5个二进制数

  1. AC:是一个计数器,用来提供访问存储器的地址,所以我们称它为“地址计数器”
    一开始它的内容是0000,每按一次KAC,它就在原来的基础上自动加一,以得到访问下一个存储单元所需要的地址。
  2. AR:是一个寄存器,用来临时存放存储器地址,称为地址寄存器。
  3. KRD:给存储器发出命令,要求它将数据送出。
  4. DR:用来暂存读出的数据,除了名字上的不同之外,它和普通的寄存器没有什么两样。
    存储器有自己的事情,它只负责把客人送到门外,所以数据应当在DR中稍事休息,等待进一步的指示,以决定自己应当动身前往何处。

注意存储器的W端没有使用,因为我们已经说过(假设数据都已经放进存储器了,为了省事),所以将它悬空,让它一直为0。

介绍完这个电路的每个环节之后,现在可以接二连三往外取数了,再开始之前,先想办法把地址计数器AC清零,以指向地址0000。
然后执行以下操作。

  1. 按一下KAR,地址计数器AC当前的值0000被AR锁存,并提供给存储器。
  2. 先按住KRD,不要松开,再按一下KDR,这时,数据输出,并被DR保存,最后,松开KRD。
  3. 按一下KAC,地址计数器加一以指向下一个地址,为再次从存储器里读数据做准备。

至此,存储器的第一个数就被取出来了。如果要接着取第二个数,第三个数等等,重复按上面的三个步骤操作即可。

三、简化取数过程

在《控制器》那节课,我们学会了如何只用一个按键开关,一个循环移位寄存器和一个逻辑电路简单地操控、把一堆数加起来。
道理是一样的,按照这种思路,我们同样可以发明出一个控制器,用它来简化取数的过程。

图中RR就是我们所说的循环移位存储器。
它有三个开关t0,t1,t2,我们刚才把一个数取出来需要经历三个不同的步骤。
为了制造控制器,我们发明了一个新的逻辑电脑,它其实就是一个译码器,把一种形式的输入转换翻译成另外一种形式的输出。
在我们现在的这个控制电路里,同样需要一种类似的译码器,因为发明它的目的是从存储器里取数,所以称之为“取数译码器”

注意:控制器就是译码器

电路刚刚启动的时候,t0=1而t1和t2都为0,此时,只有IAR’= 1


一旦开关K按下,则IAR’和K来的“1”一起,通过与门使得IAR 从0翻转到1.
于是地址寄存器AR将地址计数器的地址保存,并提供给存储器。

对于循环移位寄存器RR来说,从非门得到的是一个下降沿,它所能做的,就是无动于衷,不予理睬。

当K松开时,RR得到了一个上升沿脉冲,于是t0=0,t1=1,t2=0,并因为使IRD=IDR’=1
此时,存储器开始向外送出数据,但还不能被DR寄存器保存。


当K第二次按下时,RR依然无动于衷,但是IDR 却立即从原来的0翻转到1,于是寄存器DR将寄存器送出的数字保存起来。


K再次松开时,t0=t1=0,而t2=1,于是IAC’=1


现在,我们第三次将K按下,这将使得IAC 从0翻转到1,于是地址计数器自动加一,以指向下一个存储单元的地址。


一旦K第三次公开,RR将再次循环移位一次,使用t0=而t1=t2=0,这又回到了一开始。
换句话说,如果再连续按三次K,将会把下一个存储单元里的数骑出来。