计算机工具的普及极大的推动了科技领域的发展以及提高人们生活的便捷性,那么在其中有哪些举足轻重的发明呢?本节我们来了解一下计算机中第一个伟大的发明:指令寄存器和指令地址寄存器
回顾在步进器加持下的两数两加
前面提到两个数相加的执行流程,那么在时钟和步进器的控制下,工作流程到底是怎样的呢?假设需要将寄存器R1值添加到R0寄存器,即R0=R0+R1。将在步进器的第四、五、六步完成:
- 在第四步期间,R1的enable打开,TMP的set打开。R1的内容穿过总线并由TMP捕获
- 在第五步期间, R0的enable打开,ACC的set打开。ALU打开ADD的操作代码。
- 在第六步期间,ACC的enable打开,R0的set打开。R1+R0的值就传递到了R0寄存器上。
下面是一个步骤图,显示了每个寄存器何时启用和设置。
在第七步中,步进器被重置为第一步,在此过程重复。如果我们计算机中的时钟每秒滴答十亿次,也就是我们所说的千兆赫兹,即使我们使用多个时钟周期来“做一些有用的事情”,这意味着计算机可以在一秒钟内做几亿次这样的事情。但我们不想一次又一次地只做将R1加到R0上的事情。
现在我们已经将R1添加到了R0,我们想将这个新的数字存储到RAM中的一个特定地址,而R2恰好有这个地址。同样,我们的处理器拥有完成此操作所需的所有连接,并且需要一个以上的时钟周期。在步骤四,我们可以将R2跨总线移动到MAR。在步骤五,我们可以跨总线将R0移动到RAM。只需要两个时钟周期,我们就完成了。
我们可以用RAM、六个寄存器和ALU做很多事情的组合。我们可以从RAM中获取一个字节,并将其移动到四个寄存器中的任何一个,我们可以通过ALU移动寄存器中的任意一个或两个,并将它们相加、与它们、或它们、异或它们等等。
我们需要一种方法让我们的CPU一次做一件事,下一次做另一件事。控制部分需要一些东西来告诉它在每个序列中要做什么。
计算机的第一个伟大发明
我们需要计算机从一个步进序列到下一步步进序列进行不同操作的方法。我们怎么能让它以一种方式连接到一个序列,然后以另一种方式用于下一个序列?当然,答案是使用更多的门。一个操作的接线可以与AND门连接或断开,另一个操作接线可以与更多的AND门相连或断开。还有第三种和第四种可能性,甚至更多。只要一次只连接其中一个操作,就可以正常工作。现在我们有几种不同的操作可以完成,但如何选择要执行的操作?
这个伟大的发明是指令集:在RAM中存放一系列指令,这些指令将告诉CPU要做什么。我们需要三件事来完成这项工作。
第一件事是,向CPU添加一个寄存器。该寄存器将被称为“指令寄存器”或简称“IR”。来自该寄存器的位将“指示”CPU做什么。IR从总线获得其输入,其输出进入CPU的控制部分,在那里位选择几个可能的操作之一。
第二件事是,向CPU添加另一个寄存器,称为“指令地址寄存器”,简称“IAR”。与通用寄存器一样,该寄存器的输入和输出连接到总线,但该寄存器只有一个目的,那就是存储下一条要移动到IR中的指令的RAM地址。如果IAR包含0000 1010,则将移动到IR的下一条指令是位于RAM地址10的字节。
第三件事是,控制部分中的一些布线,它使用步进器将所需的“指令”从RAM移动到IR,在IAR中的地址上加1,并执行已放入IR中的指令所要求的操作。当该指令完成时,步进器再次启动,但现在IAR中已加1,因此,当它从RAM获得该指令时,它将是来自RAM地址的不同指令。
这三件事在一起组成了一项伟大的发明。这就是为什么我们可以让计算机做很多不同的事情。我们的总线、ALU、RAM和寄存器使多种组合成为可能。IR的内容将决定哪些寄存器被发送到何处,以及对它们执行何种算术或逻辑。我们所要做的就是在RAM中放置一系列字节,这些字节表示我们想做的一系列事情,一个接一个。
CPU将要使用的RAM中的这一系列字节称为“程序”。
这里发生的基本事情是CPU从RAM“获取”一条指令,然后“执行”该指令。然后它获取下一个并执行它。这种情况一次又一次地发生,每秒几百万或几十亿次。这就是计算机工作的简单性。人们把一个程序放在RAM中,如果这个程序设计得很聪明,它会让计算机做一些人们认为有用的事情。
这台计算机中的步进器有七个步骤。第七步的目的只是将步进器复位到第一步。因此,在这六个步骤中,CPU会做一些小事情。每个步骤持续一个时钟周期。作为一个整体采取的六个步骤被称为“指令周期”。CPU需要六个步骤来完成获取和执行一条指令所需的所有操作。如果我们假设我们的时钟以1千兆赫的频率滴答作响,那么我们的计算机将能够每秒执行166666666条指令
下面是添加了IR和IAR新寄存器的CPU的图片。它们位于控制部分之下,连接到总线。IAR有“设置”和“启用”,IR只有“设置”,就像TMP和MAR一样,因为它们的输出没有连接到总线,所以我们永远不需要关闭它们。
下面是控制部分中执行指令周期“获取”部分的连线。它使用步进器的前三个步骤,对于所有类型的指令都是相同的。步进器前三个步骤从RAM中获取“指令”,其余步骤“执行”“指令”,步骤4、5、6中的具体操作取决于所获取的指令的内容。第7步步进器重新开始,获取下一条指令并执行它。
此图的底部包括指令寄存器。请注意,我们已经为IR的各个比特给出了数字,从左边的0到右边的7,他们分别代表不同的编码命令,稍后描述。
下面是步骤1、2、3在计算机中获取指令的具体细节:
- 步骤1是最复杂的,需要同时完成两件事:1)将IAR中的地址传递到MAR。2)将IAR中的值加1,存在ACC上。
- 步骤2将RAM中当前选定的字节启用到总线上,并将其设置为IR。图中可以看到步骤2的导线连接到RAM的“启用”和IR的“设置”。
- 在步骤3中,完成IAR的更新。我们在步骤1中为其添加了1(即拿取下一条指令的MAR),但答案仍在ACC中。它需要在下一个指令周期开始之前移动到IAR。因此,您可以看到从步骤3出来的导线连接到ACC的“启用”和IAR的“设置”。
- 当我们进入步骤4时,指令已经从RAM移动到IR,现在步骤4、5和6可以执行IR内容所要求的任何操作。当该操作完成且步进器复位时,序列将重新开始,但现在IAR已添加1,因此将获取并执行下一个RAM地址的指令。
将一系列指令放入RAM并由CPU执行的想法是一项伟大的发明。