PDF 物理页索引 230
文件中的第 231 页 · 印刷页码:214
下面这幅是控制面板与64K×8良AM阵列的逻辑结构框图。
当控制端开关闭合时,通过操作16个地址开关,可以选择65,536个地址中的任何-个,灯泡的状态将表示该地址中所保存的8位数据。我们可以使用8个数据开关表示出一个新数,然后把写操作端置1,从而将数据写入存储器。
64K×8的RAM阵列和控制面板这一组合的确很实用,它可以帮助我们存储65,536个8位数据并且读取其中的任意一个。与此同时,我们也给其他部件提供了接入系统的机会-——需要接入系统的通常是-些电路部件-这些部件可以轻易地读取并利用存储器中存放的数据,还可以把数据写入存储器。
关于存储器有一个问题尤其值得我们注意,而且需要特别注意。在学习第11章的时候,我们曾介绍过逻辑门的概念及原理,但是没有画出组成逻辑门的单个继电器的结构图。特别是,当时没有指明每个继电器都与某个电源连接在起。只要继电器连通,申流就会流过电磁线圈并产生磁场,继而吸下金属片。
-个辛辛苦苦装满65,536字节珍贵数据的64K×8RAM阵列,如果断掉电源,会发生什么事情呢?首先所有的电磁铁都将因为没有电流而失去磁性,随着“梆”的一声,金属片将弹回原位,所有继电器将还原到未触发状态。RAM中存储的数据呢?它们将如风中残烛般消失在黑暗中。
正因为如此,随机访问存储器也被称为易失性(volatile)存储器。为了保证存储的数据不丢失,易失性存储器需要恒定的电流。
编码——隱匿在计算机软硬件背后的语言
214
PDF 物理页索引 231
文件中的第 232 页 · 印刷页码:未识别
自动操作
我们人类的创造能力与勤奋精神常常令我感叹不已,但人类的本性却是相当懒情的。举个简单而又常见的例子,我们总是不情愿工作。我们对工作的反感是如此的强烈一…当然人类也很聪明一以至于情愿花费大量的时间去设计并制造一些设备,哪怕这些设备只能将工作时间缩减几分钟。悠闲地躺在吊床上,看着自己刚发明的新奇工具自动修剪草坪,没有什么事情能比这更让我们快乐的神经为之一动了。
很可惜,我并不打算在本章中介绍自动割草机的设计。在这里我们将学会设计更加先进的机器,目标就是要使加减法的过程自动化,这听起来有些难以置信。但是,本章最终设计出的机器用途将十分广泛,因为它可以解决所有能用加、减法处理的问题,而事实上现实中的很多问题都是可以用加法与减法来解决的。
当然,随着机器变得越来越精密,其复杂程度也越来越高,因此对其构造的某些部分理解起来比较困难。因此如果你略去了某些复杂的细节,这也是在情理之中,没有人会为此责怪你。有时,我们会感到焦躁不安,甚至厌倦,发暂再也不会为了解决一个复杂的数学难题而去求助于某些电子或机械设备。但是请保持耐心,在本章的末尾我们将会设计出一种机器,我们可以称它为计算机(Computer)。
回忆我们曾在第14章讨论过的一个加法器。这个版本的加法器包括一个8位的锁存
PDF 物理页索引 232
文件中的第 233 页 · 印刷页码:216
器,用于对8个开关的输入数据进行迭代求和。下面是其结构图。
从图中可以看出,8位锁存器利用触发器来保存8位数据。使用这个设备时,首先需要按下清零开关使锁存器中的内容全部都变为0,然后通过开关输入第一个数。加法器只是简单地将这个数字和锁存器输出的0进行求和,因此相加的结果与原先输入的数字是一样的。按下相加开关可以把这个数保存在锁存器中,最后会点亮某些灯泡以显示它。现在通过开关输入第二个数,加法器把它与已经存放在锁存器中的第一个数相加。再次按下相加开关,就可以把相加的结果存入锁存器中,并通过灯泡显示这个结果。通过这种方式,可以把一串数相加并显示运行结果。显然,这种设计方案存在一个缺陷:8个灯泡无法显示大于255的数。
对于第14章所介绍的这种电路,目前为止只讲到了一种锁存器,它是电平触发(leveltriggered)的。在电平触发的锁存器中,为了保存数据必须将时钟输入端首先置1,然后回置为 $\scriptstyle \mathbf { 0 } _ { \circ }$ 当时钟输入端为1时,锁存器的数据输入端可以改变,而这些变化将会影响到数据输出。在第14章的后半部分还介绍了边沿触发(edge-triggered)的锁存器,这种锁存器在时钟输入从0跳变为1的瞬间保存数据。边沿触发器在很多方面更加易于使用,因此假定本章用到的所有触发器都是边沿触发的。
用来累加多个数的锁存器称做累加器(accumulator)。在本章的后面将会看到累加器不仅仅做简单的累加,它还充当着锁存器的角色,保存第一个数,并且和下一个数做加法或减法运算。
编码—隐匿在计算机软硬件背后的语言
216
PDF 物理页索引 233
文件中的第 234 页 · 印刷页码:217
很显然,上面的加法器存在着一个很大的缺陷:假如要把100个二进制数加起来,你必须端坐于加法器前,并且耐心地输入所有的数并累加起来。但是当你终于完成时,却发现其中有两个数输错了,而你只能重复一遍所有的工作。
但是,也许并非如此。在前一章我们使用了大约500万个继电器构造了一个64KB的RAM阵列。除此之外,我们还把一个控制面板连接到电路帮助我们工作,闭合它的控制(Takeover,有些书中也称“接管”)端开关后,就可以使用其他开关来控制RAM阵列的读写。下面是 64 KB RAM阵列结构图。
如果把这100个二进制数输入到RAM阵列中而不是直接输入到加法器中,一旦需要修改一些数据,我们的工作将会变得容易得多。
因此我们所现在面临的挑战就是如何把RAM阵列和累加器连接起来。很显然,RAM阵列的输出信号可以替代加法器的开关。而你也许想不到,用一个16位的计数器(比如我们在14章构造的那种)就可以控制RAM阵列的地址信号。在这个电路中,RAM阵列的数据输入信号和写操作端信号可以省去。修改后的电路结构如下图所示。
17 自动操作
217
PDF 物理页索引 234
文件中的第 235 页 · 印刷页码:218
当然,这并不是迄今发明的最易于使用的计算设备。要使用它,首先要闭合清零开关,这样做的目的是,清除锁存器中的内容并把16位计数器的输出置为0000h.然后合RAM控制面板的控制端开关。现在你可以从地址0000h开始输入一组你想要相加的18位数。如果有100个数,那么它什们将被存放在0000h\~0063h的地址空间中(也应该把RAM阵列中未使用的单元设置为 00h)。然后闭合RAM控制面板的控制端开关(这样控制面板就不再控制RAM阵列了),同时断开清零开关。做完了这些,我们可以静静地坐下来,观察灯泡显示运算结果。
让我们来看一下它是怎样工作的:当清零开关第一次断开时,RAM阵列的地址输入是0000h。RAM阵列的该地址中存放的8位数值是加法器的输入数据。加法器的另一个输入数据为00h,因为此时锁存器也已经清零了振荡器提供的时钟信号个可以在0,1之间快速切换的信号。清零开关断开后,当时钟信号由0跳变为1时,将有两件事同时发生:锁存器保存加法器的计算结果,同时16位计数器增1,指向RAM阵列的下一个地址单元。清零开关断开之后,时钟信号第一次从0跳变为1时,锁存器就将第一个数值保存下来,同时计数器增加为0001h;当时钟发生第二次跳变时,锁存器保存之前两个数的求和结果,同时计数器增加
编码——隱匿在计算机软硬件背后的语言
218
PDF 物理页索引 235
文件中的第 236 页 · 印刷页码:219
为0002h;按这种方式往复操作。
要注意的是,这里首先做了一些假设。最主要的一点就是,振荡器要足够慢以使电路的其他部分可以工作。每次时钟振荡的过程中,在加法器输出有效的结果之前,一些继电器必须去触发其他继电器。
这个电路存在的一个缺陷是:我们没有办法使它停下来。在某个时刻,所有灯泡会停止发光,因为RAM阵列的剩余部分存放的数都是00h。这时,你可以读取进制的运算结果。但是当计数器达到FFFFh时,它会重新回滚(roll ovor)到0000h(这就好像汽车的里程表样),这时自动加法器会再次把所有的数累加到记经计算出来的结果中
这↑加法器迁存在另一个问题:官只能做加法运算,日只能做8位数的加法。在这RAM阵列中,不但每个数要小157,日仕意主数相加的结果也要11255此外,该加法器也能处理减法运算,尽管可以用的补数表于负数,但在心种情况加法器能处理的数字的范围被限制在128到1/之间。要如理更人自数(例如,16位数)的品,金简单的方法是:把RAM降列加法器锁存器的位宽于都加倍,同时增加归泡,但些投资自找们看来是吕算前
当然,总里提到逗问题的原因星最终我们要解决下。但首先\*大注另间题.如卑你需要把100个数加在 起呢?如果你想做的是用自动加法器把50对数分别相加,得出50个不同的结果呢?或者你需要一种力能机,它可以万便地对两个数,10个数甚至100数求机,并H所有的计算结果都可以很万便地使用。
先前提到的自动加法器都是用连接在锁存器上的灯泡来显示运行结果的,但是如果你想对50对数分别求和的时候,这就不是个好的方法了。你可能会想到把运算结果存回到RAM阵列中去,这样的话,就可以在适当的时候用RAM阵列的控制面板来检省算结果。为了实现这个目的,控制面板上专门设计了灯泡。
这意味着我们可以去掉与锁存器连接的灯泡,取而代之的是把锁存器的输出端连接到RAM阵列的数据输入端,这样就可以把计算结果写回到RAM阵列中去,如下图所示。
17自动操作
219
PDF 物理页索引 236
文件中的第 237 页 · 印刷页码:220
上图中略去了自动加法器的其他部分,其中包括振荡器和清零开关,这是因为我们不再需要特别标注计数器和锁存器的清零及时钟输入。此外,既然我们现在已经开始利用RAM的数据输入,因此需要一种用来控制RAM写入信号的方法。
现在我们不需要担心电路能否工作,而要把注意力集中到急需解决的问题上来。目前的当务之急是如何配置一个自动加法器,使它不仅仅可以对一组数字做累加运算,还希望它能够自主地确定要累加多少个数字,而且还能记住在RAM中存放了多少个计算结果,这样就可以简化查询工作。
例如,假设我们先要对三个数进行求和,然后对两个数进行求和,最后再对三个数进行求和。想象一下,我们可以把这些数保存在RAM阵列中以0000h开始的一组空间中,这些数存储在RAM阵列中的具体形式如下图所示。
编码隐匿在计算机软硬件背后的语言
220
PDF 物理页索引 237
文件中的第 238 页 · 印刷页码:221
本书中将用这样的形式表示一小段存储器。方格表示的是存储器的内容。存储器的每一个字节写在一个方格里。地址标记在方格的左边,并不是每一个地址都需要标记,因为地址是线性的,所以总是可以通过计算确定某个方格对应的地址。方格右边是关于该存储单元内容的注释,这些标记的单元就是我们想要自动加法器保存三个计算结果的位置(尽管这些方格画出来是空的,但是存储单元内并不是空的,它们总是保存着一些东西,就算只是一些随机数,但此时存放的是一些没有用的数)。
或许大家都有一种冲动,想亲自去做十六进制计算,并把结果填到那些小格子中去,但这并不是实验的目的,我们想要自动加法器为我们做这些加法。
我们并不希望自动加法器成为单任务系统—在它的第一个版本中,只是把RAM地址中的内容加到称为累加器的8位锁存器中实际上我们希望它能做四件事:进行加法操作,首先它要把一个字节从存储器中传送到累加器中,这个操作称为加载(Load)。第二个操作把存储器中的一个字节加(Add)到累加器的内容中去。第三个操作把累加器中的计算结果取出并存放到存储器中。另外我们需要用一个方法令自动加法器停(Halt)下来。
我们借助具体的例子详细介绍这一过程,以上文提到的自动加法器所做的运算为例来说明。
17 自动操作
221
PDF 物理页索引 238
文件中的第 239 页 · 印刷页码:222
(1)把0000h地址处的内容加载到累加器。
(2)把0001h地址处的内容加到累加器中。
(3)把0002h地址处的内容加到累加器中。
(4)把累加器中的内容存储到0003h地址处。
(5)把0004h地址处的内容加载到累加器。
(6)把0005h地址处的内容加到累加器。
(7)把累加器中的内容存储到0006h地址处。
(8)把0007h地址处的内容加载到累加器。
(9)把0008h地址处的内容加到累加器。
(10)把0009h地址处的内容加到累加器。
(11)把累加器中的内容存储到000Ah地址处
(12)令自动加法器停止工作。
这里要注意,同最初的目动加法器样,存储器中的每一个学节的地址仍然是以00001为起点线性排列的、最初的加法器只是简单地把存储器指定地圳的内容和累加器的内容相加,在某些情况卜需要这样做,但是有时我们需要把存储器中的某个值直接加载到累加器,或者把累加器中的值直接保存到存储器。做完了这些工作,算得上方事俱备只欠东风了,我们还希望自动加法器能方便地停卜来,以便于查看RAM阵列中存放的值。
该如何来完成这些工作呢?能不能仅仅简单地向RAM阵列中输入一组数,然后期待自动加法器正确地完成所有工作呢?答案是否定的。对于RAM阵列中的每个数,我们还需要用些数字代码来标识加法器要做的每-一项工作:加载、相加、保存和终止。
也许存放这些代码的最简单的方法(但肯定不是代价最小的)是把它们存放在一个独立的RAM阵列中。这个RAM应该和第-个RAM同时被访间。但是这个RAM中存放的是不需要求和的数,而是一些数字代码,用来标记自动加法器对第一个RAM中指定地址要做的一种操作。这两个RAM可以分别被标记为“数据”(第一个RAM阵列)和“代码”(第二个RAM阵列)。其结构如下图所示。
编码—隐匿在计算机软硬件背后的语言
222
PDF 物理页索引 239
文件中的第 240 页 · 印刷页码:223
我们已经清楚地认识到新的自动加法器能够把数据求和的结果写入到第一个RAM阵列(标记为“数据”),而新的RAM阵列(标记为“代码”)则只能通过控制面板写入。
我们需要四个代码来标记新的自动加法器需要做的四个操作,这些代码可以任意指定。如下所示的是一种方案。
为了使上面讨论的三组加法得以正常执行,你需要通过控制面板把如下值存入代码RAM阵列。
比较一下该RAM阵列与存放累加数据的RAM阵列中的内容,你会发现,代码RAM阵列中存放的每一个代码都对应着数据RAM中要被加载或者加到累加器中的数,或者对应需要存回到数据 RAM中的某个数。以这种方式使用的数字代码常常被称为指令码(instruction code)或操作码(operation code,opcode)。它们指示电路要执行的某种操作。
17 自动操作
223