在下图中,“a”和“b”是来自左侧的输入。它们都连接到NOT门。NOT门产生与其输入相反的输入。页面上有四条垂直线,分别来自“a”和“b”以及“a”与“b”的反数,因此,对于每个“a”和“b”,页面上都有两条导线,如果输入打开,其中一条将打开,如果输入关闭,另一条将开启。现在我们在右侧放置四个and门,并将每一条连接到不同的垂直线对,如对于“a”和“b”四种可能组合中的不同组合。输入可以以任何组合打开:两位都关闭,一个打开,另一个打开或两个都打开。但是,输出总是有一个且只有一个打开而另外三个关闭。打开的一个由“a”和“b”的当前状态决定。
这种组合称为解码器。这个名称意味着,如果您将两个输入的四种可能状态视为一个代码,那么输出会告诉您当前输入的是哪种代码。该解码器有两个输入,这意味着输入状态可以有四种组合,并且有四种输出,一种对应于每个可能的输入组合。
如果我们添加第三个输入,那么会有八个可能的输入组合,如果我们使用八个三输入and门,我们可以构建一个3输入8输出解码器。类似地,我们可以构建一个4输入、16输出的解码器。解码器由输入数量“X”和输出数量命名。如2X4、3X8、4X16、5X32、6X64等。
如下是简化的图纸,不显示任何内部部件或接线,只会有一个带有名称以及我们感兴趣的输入和输出的框。我们已经了解了NAND门如何生成NOT门和and门,然后NOT门与and门生成解码器。它是一个装满NAND门的盒子,连接起来可以做一些有用的事情。我们知道它是做什么的,只有一个输出总是开着,它是哪一个,取决于三个输入的状态。这就是解码器所做的一切。
首先,让我们举一个生活的例子来说明计算机存储器的构建。你知道,在一家酒店,在前台,在店员后面的墙上,有一系列的小木屋,每个房间都有一个。这是他们为客人保存额外房间钥匙和留言或邮件的地方。或者你可能看过一部老电影,在老邮局里有人在分拣邮件。他坐在一张桌子旁边,桌子后面有一系列的小隔间。他桌上有一堆未分类的邮件,一次捡起一封,读地址,然后把信放在适当的小隔间里。
所以我们要建造一些小隔间。我们的房间将是三英寸见方,有十六个小隔间高,十六个小房间宽。它的总尺寸为4英尺乘4英尺,总共有256个小房间。
现在我们将添加一些他们在邮局或酒店没有的东西。我们将在小隔间的正前方放置一块大木板,它的宽度是整个小隔间的两倍,在中间有一个垂直的槽,刚好够露出一根16英寸的柱子小房间。面板底部将有轮子,这样它可以左右滑动,一次露出16个隔间中的任何一个垂直柱,并覆盖所有其他柱。
让我们拿另一块木板,就像第一块一样,但把它翻到一边,这样它的高度是我们小隔间的两倍,中间的槽是并排的。第二个面板将安装在第一个面板的正前方,类似于窗框,因此它可以上下滑动,一次只露出一排16个小隔间。
现在我们有了一系列256个小隔间,在它们前面有两块开槽的木板,一次只能看到一个小隔。在每个小房间里,我们将放一张纸条,在纸条上写下8个0和1的可能组合之一。这个小隔间有256个地方可以存放东西。在任何给定的时间,我们可以通过左右或上下滑动木板来选择其中一个位置。在选定的小隔间里,我们可以伸手拿纸条读一读,或者换一张。
现在我们将使用我们描述的门、寄存器和解码器,并利用它们制作出与我们的小隔间设备几乎相同的东西。这个东西将有256个地方用来存储东西,我们将能够在任何给定的时间从这些地方中选择一个并且只选择一个。
参考下图,我们从一个寄存器开始。它的输入“a”是一条来自计算机中其他地方的总线。位的组合被放置在总线上,“sa”(set A)位变为1,然后变为0。该模式现在存储在该寄存器中,该寄存器是其输出始终为on的寄存器之一。前四个输出位连接到一个4X16解码器,其他四个输出比特连接到另一个4X16解码器。两个解码器的输出以网格模式布置。电线彼此不接触,但是这里有16乘16,或者256个十字路口。如前所述,解码器在任何时候都有一个且只有一个输出打开,其余的输出关闭。由于这里有两个解码器,因此将有一个水平网格线打开,一个垂直网格线打开。因此,在这256个交点中,只有一个交点同时接通水平和垂直导线,每次R中的值发生变化时,那个交点都会发生变化,但始终会有一个交点同时两条导线都接通,而其它255个交点接通一条或都不接通。
在这个图的底部是一条总线和一个“s”和“e”位,与连接到寄存器的连接相同。如你所见,它们向上进入网格。这个图上没有显示,但它们在网格下一直上升到顶部,所以256个十字路口中的每一个都有一辆公交车和一个“s”和“e”位。
上图上有一个圆,围绕着网格的一个交点。下图放大了这个圆中的内容, 256个交叉点中的每一个都有三个与门和一个寄存器。如我们所见,有一个与门“x”,连接到该交叉点的一条垂直网格线和一条水平网格线。这些“x”门是唯一与电网相连的东西。其余的连接向下到总线,在图的底部有“s”和“e”位。请记住,只有一个交点是两条网格线都打开的。因此,这些“x”门中有256个,但在任何给定的时间,只有其中一个输出打开。“x”门的输出分别通向另两个“与”门的一侧。这两个门控制对集合的访问,并在该交叉点启用寄存器的输入。因此,当“x”门关闭时,该寄存器的“s”和“e”位将无法打开。同一时刻会有255个寄存器的“x”门关闭,一个交叉点的“x”门打开,其寄存器可以从总线设置,或者可以使用图表底部的“s”和“e”位将其内容启用到总线上并发送到其他地方。
上面就是计算机的主存储器。这是建造一台计算机所需的一半东西。请注意:您可以一次选择256个字节中的任何一个,然后可以立即选择256字节中的其他任何一个。无论最后一个字节是在哪里,还是下一个字节在哪里,选择字节的顺序都没有速度优势或劣势。由于这种设置,如果您想以随机顺序访问内存的字节,这是一种很好的内存类型。因此,这种类型的存储器被称为“随机存取存储器”,简称“RAM”。
这就是RAM。它使用257个寄存器。256个寄存器是内存存储位置,一个寄存器用于选择其中一个存储位置,简称为“内存地址寄存器”或“MAR”。现在我们知道了其中的主要内容,我们可以制作这样的简化图,以及更简单的总线版本:
有一个问题,256字节对于计算机的RAM来说是非常小的,如果你想要一台真正的计算机,它将需要一个有更多字节可供选择的RAM。而我们为了方便理解就以256字节作为RAM的示例。
但是可以通过提供用于选择存储器存储位置的两个寄存器来构建更大的RAM,那么会有8X256的解码器,并产生一个具有65536个交点的网格,从而形成一个具有65536个不同存储位置的RAM。这里有一个关于它实现的想法(页面限制,网格线只展示了一半):
总线一次连接一个字节,因此选择该RAM的65536个内存位置中的一个将是一个两步过程。首先,必须将一个字节放置在“a”总线上并设置为R0,然后将第二个字节放置到“a”总线上并设置成R1。现在,您可以使用总线以及图形底部的“s”和“e”位访问所需的内存位置。再简单一点,如下图,我们有一个看起来很像256字节RAM的东西,它只是多一个输入位。