十七、半自动操作 - 指令
一、存储器和加法器的结合
在《控制器》那节课中,我们所有参与相加的数都是用开关得到的,如下图:
在《连续读取存储器》那节课,我们实现了,连续不断取数,如下图:在《连续读取存储器》那节课,我们实现了,连续不断取数,如下图:
把“存储器”和“加法器”可以合在一起,以实现“从存储器里不断取数”、然后相加的功能,如下图:
上面的电路,可以看到3个重要组成:译码器(控制器),存储器,加法器
现在,取数和做加法已经被合二为一,这就是为什么循环移位寄存器RR现在有5个输出 t0, t1, t2, t3, t4 的原因。
两个功能的合并意味着需要重新设计一个新的逻辑电路来产出各种输出,这就是图中所示的“译码器”。
t0~t3阶段:
- 将完成从存储器里取数到寄存器DR,并将AC计数器加1(存取地址加1),并从存储器里取数到寄存器DR。
这个阶段的功能永远是固定的,与K装载和K相加无关,不受它们的影响,这一点在设计译码器时需要注意。
在t3和t4阶段:
- 如果K装载=1,而K相加=0,则将DR中的数装载到寄存器RA中;
- 如果K装载=0,而K相加=1,则将DR中的数与RA中的数相加,并将结果保存到RA中。
所以很显然,要想把一大堆数相加起来,只需要在存储器里准备好它们,并将地址计数器AC清零,然后坐下来,以5次为单位,不停地按动开关即可。
合上K装载,断开K相加,“啪啪啪啪啪”地将K按5次;再断开K装载,合上K相加,接着啪啪……
这个过程中有自动的成分,毕竟,我们只是用手动动开关,其他事情都由机器做了。
当然,在这个过程中,唯一的麻烦就是K装载和K相加这两个开关,你要在适当的时候切换一下它们的状态。
如果可以想个办法,把K装载和K相加这两个开关也省掉,那该多好啊。
二、如何去除“K装载”和“K相加”开关
目前为止,我们的存储器里全都是一些等待被加起来的数字。
但是冯.诺依曼认为,存储器里不但要有这些纯粹的数字,还应当有一些指示如何加工这些数字的指令。
在《计算机和人脑》这本书里,他写到:“一条指令,在物理意义上和一个数是相同的。”换句话说,它们躺在存储器里,很像普通的二进制数,但实际上不是。
如下图所示:所有的指令都以一个操作码开始,它指示出该指令的功能。
比如,可以用10001表示“装载”,用10010表示“相加”。
除此之外,操作码还隐含了一些别的意思。
比如装载指令,往哪里装载呢?装载给谁呢?这个数字在哪里呢?
所以操作码10001还意味着,被装载的数位于下一个存储单元里,目标是寄存器RA MOV RA,10
而操作码10010意味着,要相加的数位于下一个存储单元,并且把相加的结果再次保存到RA寄存器里ADD RA,5
因此,一条完整的指令总是以操作码开始,后面跟着操作数,但有一些指令可能不需要任何操作数,只有操作码就行了,而有的指令则很复杂,可能需要不止一个操作数。
既然设计规范已经有了,现在我们就知道了,一个存储器里面“二进制数”可能是一个指令,也可能是一个纯数字。
我们必须正确的解码,不能把“指令”当成了“纯数字”解码,也不能把“纯数字”当成了“指令”解码。
接下来的问题就是考虑,怎么样翻译这些操作码,并用来代替那两个开关K装载和K相加。
这好像不难,考虑到逻辑电路的输出不是0就是1,等效于开关的K装载和K相加的闭合和断开。
那么, 使用我们非常熟悉的译码器来模拟传统的开关,也是非常不错的。
那如何让机器取出这些指令,并执行它们呢?我不想再跟你绕弯子,逐步推导,然后得出结论那一套了。
学习到这节课,该有的基础你都有了,所以我直接给出你结果。
如上图,用一个开关K就可完成所有的数从存储器里依次取出并逐个相加的过程。
运行流程:
- t0-t2阶段:
第一个存储单元(地址0000)里的操作码被取出,地址计算器AC自动加一。这个阶段,称为取指令阶段。
现在,第一条指令的操作码已经位于寄存器DR中。 - t3阶段:
IIR产生了一个上升沿,使得寄存器IR将该操作码保存起来。
IR是一个普通的寄存器,但专门用来临时保存指令,所以称为指令寄存器。
IR的输出直接通过译码电路EC,EC的任务是翻译当前指令,看它到底想做什么。当它的输入为10001时,I装载=1,I相加=0.
相反,如果输入为10010,则I装载=0,I相加=1.
而对于其余任何输入,I装载和I相加都为0.
所以,t3阶段称为指令译码阶段。
注意,I装载和I相加对t0-t3阶段没有影响,不管它们俩输入的是什么,机器所执行的都是取指令和翻译指令。
因为第一条指令是装载指令,所以I装载=1 而I相加 =0. - t4-t8:
从下一个存储单元里取数,地址计数器AC加一,把取出的数装载到寄存器RA中。至此,第一条指令执行完毕,循环移位寄存器RR已经经历了一次完整的循环移位。
在第二个t0-t3阶段,将取出第二条指令(相加指令)并进行译码,使得I装载=0,I相加=1。
于是,在第二个t4-t8阶段,将再次取数,并与RA中的数相加。(结果依然返回RA中)
基本上,这台机器的工作过程就是这样,你可以持续按动开关K,直到所有的指令都执行完毕。