China°deoM 下载 第17章自动操作 人类是非常富于创造性而且是十分勤勉的,但是,人类在本质上也是十分懒惰的。非常 明显,人类并不愿意去工作,这种对工作的反感导致人们用大量的时间来设计和制造可以把 工作日缩短到几分钟的设备。幻想使人感到兴奋,甚至远比我们所看到新奇的事物更令人兴 奋得多。 当然不会在这里介绍自动割草机的设计。本章将通过设计更精密的机器,使加减法运算 更加自动化,这听起来也许有些不可思议。本章最后设计出的机器将具有广泛的用途,它实 际上可以解决任何利用加减法的问题,这些问题的范围太大了 当然,由于精密机器越来越复杂,因此有些部分可能会很粗糙。不过如果你略过了某些 困难的细节,没有人会责备你。有时,你可能会不耐烦并且发誓再也不会因为一个数学问题 而去寻求电或机械的帮助。不过请耐心坚持到底,因为本章最后将发明一个叫作计算机的机 我们曾在第14章见过一个加法器。它有一个8位锁存器,累加由8个开关输入的数的和 开关 8位加法器 ck8位锁存器c 灯泡 前面曾讲过,8位锁存器用触发器来保存8位数据。使用这个设备时,必须首先按下清零 开关使锁存器的存储内容清零,然后用开关来输入第一个数字。加法器简单地把这个数字与 锁存器输出的零相加,因此其结果就是你刚输入的数字。按下相加开关可在锁存器中保存该 数并且通过灯泡显示出来。现在从开关上输入第二个数,加法器把这个数与存储在锁存器中 的数相加,再按下相加开关把总和存储在锁存器中并通过灯泡显示出来。通过这种方法,你 可以加上一串数字并显示出运算总和。当然,其中存在的一个局限是8个灯泡不能显示总和超 过255的数。 第14章介绍该电路的时候,只讲到一种锁存器,它是电平触发的。在电平触发的锁存器 中,时钟输入端必须先置1然后回到0,才能使锁存器保存数据。当时钟信号等于1时,锁存器 的数据输入可以改变,这种改变将会影响所保存的数据输出。第14章的后面又介绍了边沿触 发的锁存器,这种锁存器在时钟输入从0变化到1的瞬间保存数据。由于边沿触发的锁存器易
下载 第17章 自 动 操 作 人类是非常富于创造性而且是十分勤勉的,但是,人类在本质上也是十分懒惰的。非常 明显,人类并不愿意去工作,这种对工作的反感导致人们用大量的时间来设计和制造可以把 工作日缩短到几分钟的设备。幻想使人感到兴奋,甚至远比我们所看到新奇的事物更令人兴 奋得多。 当然不会在这里介绍自动割草机的设计。本章将通过设计更精密的机器,使加减法运算 更加自动化,这听起来也许有些不可思议。本章最后设计出的机器将具有广泛的用途,它实 际上可以解决任何利用加减法的问题,这些问题的范围太大了。 当然,由于精密机器越来越复杂,因此有些部分可能会很粗糙。不过如果你略过了某些 困难的细节,没有人会责备你。有时,你可能会不耐烦并且发誓再也不会因为一个数学问题 而去寻求电或机械的帮助。不过请耐心坚持到底,因为本章最后将发明一个叫作计算机的机 器。 我们曾在第1 4章见过一个加法器。它有一个 8位锁存器,累加由8个开关输入的数的和: 前面曾讲过, 8位锁存器用触发器来保存 8位数据。使用这个设备时,必须首先按下清零 开关使锁存器的存储内容清零,然后用开关来输入第一个数字。加法器简单地把这个数字与 锁存器输出的零相加,因此其结果就是你刚输入的数字。按下相加开关可在锁存器中保存该 数并且通过灯泡显示出来。现在从开关上输入第二个数,加法器把这个数与存储在锁存器中 的数相加,再按下相加开关把总和存储在锁存器中并通过灯泡显示出来。通过这种方法,你 可以加上一串数字并显示出运算总和。当然,其中存在的一个局限是 8个灯泡不能显示总和超 过2 5 5的数。 第1 4章介绍该电路的时候,只讲到一种锁存器,它是电平触发的。在电平触发的锁存器 中,时钟输入端必须先置 1然后回到0,才能使锁存器保存数据。当时钟信号等于 1时,锁存器 的数据输入可以改变,这种改变将会影响所保存的数据输出。第 1 4章的后面又介绍了边沿触 发的锁存器,这种锁存器在时钟输入从 0变化到1的瞬间保存数据。由于边沿触发的锁存器易 开关 8位加法器 8位锁存器 清零 灯泡 相加
Chinapub.com 第7章自动操作 151 下载 使用,所以假定本章用到的锁存器为边沿触发的锁存器 用于累加数字的锁存器叫作累加器,本章后面将会看到累加器并非仅仅进行简单的累加 累加器通常是一个锁存器,保存第一个数字,然后该数字又加上或减去另一个数字 上面这个加法机存在的最大问题已经相当明显:如果想把100个二进制数加起来,你就得 坐在加法机前耐着性子输入每一个数字并累加起来。当你完成时,却发现有两个数字是错误 的,你只好又重复全部的工作 不过,也可能并非如此。上一章用了差不多500万个继电器来构造一个64KB的RAM阵列。 另外,我们还连接了一个控制面板,用来闭合接管开关接通线路,并使用开关进行RAM阵列 的写入和读出。 控制面板 地址 数据输入D 46Do数据输出 如果你向RAM阵列中输入100个二进制数字,而不是直接输入到加法机中,那么进行数 据修改会容易得多。 现在我们面临着一个挑战,即如何将RAM阵列连到累加器上。显而易见,RAM的数据输出 信号应该代替累加器的开关组。但是,用一个16位的计数器(正如在第14章构造的)就可以控 制RAM阵列的地址信号。在下面这个电路中,连到RAM的数据输入信号和写入信号可以不要 控制面板 振荡器 6位计数器5 8位加法器 清零 k8位锁存器 当然这并非已经发明的最容易操作的计算装置。在使用之前,必须先闭合清零开关,以 清除锁存器的内容并把16位计数器的输出置为0000h,接着闭合RAM控制面板上的接管开关。 你可以从RAM地址的0000h处开始输入一组想要加的8位数,如果有100个数,则它们保存在 从0000h~0063h的地址中(也可以把RAM阵列中没有用到的单元都设置为00h)。然后断开
第17章 自 动 操 作 151 下载 于使用,所以假定本章用到的锁存器为边沿触发的锁存器。 用于累加数字的锁存器叫作累加器,本章后面将会看到累加器并非仅仅进行简单的累加。 累加器通常是一个锁存器,保存第一个数字,然后该数字又加上或减去另一个数字。 上面这个加法机存在的最大问题已经相当明显:如果想把 1 0 0个二进制数加起来,你就得 坐在加法机前耐着性子输入每一个数字并累加起来。当你完成时,却发现有两个数字是错误 的,你只好又重复全部的工作。 不过,也可能并非如此。上一章用了差不多 5 0 0万个继电器来构造一个6 4 K B的R A M阵列。 另外,我们还连接了一个控制面板,用来闭合接管开关接通线路,并使用开关进行 R A M阵列 的写入和读出。 如果你向R A M阵列中输入 1 0 0个二进制数字,而不是直接输入到加法机中,那么进行数 据修改会容易得多。 现在我们面临着一个挑战,即如何将R A M阵列连到累加器上。显而易见,R A M的数据输出 信号应该代替累加器的开关组。但是,用一个 1 6位的计数器(正如在第1 4章构造的)就可以控 制R A M阵列的地址信号。在下面这个电路中,连到RAM 的数据输入信号和写入信号可以不要: 当然这并非已经发明的最容易操作的计算装置。在使用之前,必须先闭合清零开关,以 清除锁存器的内容并把 1 6位计数器的输出置为 0 0 0 0 h,接着闭合R A M控制面板上的接管开关。 你可以从R A M地址的0 0 0 0 h处开始输入一组想要加的 8位数,如果有 1 0 0个数,则它们保存在 从0 0 0 0 h~0 0 6 3 h的地址中(也可以把 R A M阵列中没有用到的单元都设置为 0 0 h)。然后断开 控制面板 数据输出 写入 数据输入 地址 振荡器 控制面板 清零 16位计数器 8位加法器 8位锁存器 灯泡
152 编码的奥秘 C na.PUB. COM 下载 RAM控制面板上的接管开关(这样控制面板不会再对RAM阵列起控制作用了),并断开清零 开关。这时,你就只需坐着看灯泡的亮灭变化了 其工作情况为:当清零开关第一次断开时,RAM阵列的地址输入为0000h,保存在RAM 阵列当前地址的8位数是加法器的输入。由于锁存器也清零,所以加法器的另8位输入为00h 振荡器提供时钟信号一—一个在0和1之间迅速交替变化的信号。在清零开关断开后,当时 钟由0变为1时,将同时发生两个事件:锁存器保存来自加法器的结果:同时,16位计数器加1 指向RAM阵列的下一个地址。在清零开关断开后,当时钟第一次由0变为1时,锁存器保存第 个数,同时,计数器增加到0o0lh;当时钟第二次由0变为1时,锁存器保存第一个数与第 个数之和,同时计数器增加到0002h:依此类推 当然,这里先做了一些假设,首要一点,振荡器需慢到允许电路的其余部分可以工作 对于每次时钟振荡,在加法器输出端显示有效和之前,许多继电器必须触发其他继电器 这种电路有一个问题,即没有办法让它停止。到一定时候,灯泡会停止闪动,因为RAM 阵列中的其余数都为00h。这时,你可以看到二进制和。但当计数器最终到达 FFFFh时,它又 会翻到000oh(就像汽车里程表),这时自动加法器又会开始把这些数加到已经计算过的和中 这种加法机还有一个问题:它只能用于加法,并且只能加8位数。不仅在RAM阵列中的每 个数不能超过255,而且其总和也不能超过255。这种加法器也没有办法进行减法运算。虽然 可以用2的补码表示负数,但是在这种情况下,加法器只能处理一128~127之间的数字。让它 处理更大数字(例如,16位数)的一种显而易见的方法就是使RAM阵列、加法器和锁存器的 宽度加倍,同时再提供8个灯泡。不过你可能不太愿意做这种投资 当然,要不是我们最终要去解决这些问题,这儿是不会提到这些问题的。不过我们首先 想谈的却是另外一个问题。如果不是要把100个数加成一个数,会怎么样?如果只想用自动加 法器把50对数字加成50个不同的结果又会怎么样?也许你希望有一个万能的机器来累加多对 数字、10个数字或100个数字,并且希望所有的结果都可方便地使用 前面提到的自动加法器在与锁存器相连接的一组灯泡上显示出其相加结果。对于把50对 数字加成50个不同的和来说,这种方法并不好。你可能希望把结果存回RAM阵列中,然后, 在方便的时候用RAM控制面板来检查结果。控制面板上有专门为此目的而设计的灯泡。 这意味着连接在锁存器上的灯泡可以去掉。不过,锁存器的输出端必须连接到RAM阵列 的数据输入端上,以便于和可以写入到RAM中 控制面板 6位计数器 8位加法器
R A M控制面板上的接管开关(这样控制面板不会再对 R A M阵列起控制作用了),并断开清零 开关。这时,你就只需坐着看灯泡的亮灭变化了。 其工作情况为:当清零开关第一次断开时, R A M阵列的地址输入为 0 0 0 0 h,保存在R A M 阵列当前地址的8位数是加法器的输入。由于锁存器也清零,所以加法器的另 8位输入为0 0 h。 振荡器提供时钟信号—一个在0和1之间迅速交替变化的信号。在清零开关断开后,当时 钟由0变为1时,将同时发生两个事件:锁存器保存来自加法器的结果;同时, 1 6位计数器加1, 指向R A M阵列的下一个地址。在清零开关断开后,当时钟第一次由 0变为1时,锁存器保存第 一个数,同时,计数器增加到 0 0 0 1 h;当时钟第二次由0变为1时,锁存器保存第一个数与第二 个数之和,同时计数器增加到 0 0 0 2 h;依此类推。 当然,这里先做了一些假设,首要一点,振荡器需慢到允许电路的其余部分可以工作。 对于每次时钟振荡,在加法器输出端显示有效和之前,许多继电器必须触发其他继电器。 这种电路有一个问题,即没有办法让它停止。到一定时候,灯泡会停止闪动,因为 R A M 阵列中的其余数都为 0 0 h。这时,你可以看到二进制和。但当计数器最终到达 F F F F h时,它又 会翻到0 0 0 0 h(就像汽车里程表),这时自动加法器又会开始把这些数加到已经计算过的和中。 这种加法机还有一个问题:它只能用于加法,并且只能加 8位数。不仅在R A M阵列中的每 个数不能超过2 5 5,而且其总和也不能超过 2 5 5。这种加法器也没有办法进行减法运算。虽然 可以用2的补码表示负数,但是在这种情况下,加法器只能处理- 1 2 8~1 2 7之间的数字。让它 处理更大数字(例如, 1 6位数)的一种显而易见的方法就是使 R A M阵列、加法器和锁存器的 宽度加倍,同时再提供8个灯泡。不过你可能不太愿意做这种投资。 当然,要不是我们最终要去解决这些问题,这儿是不会提到这些问题的。不过我们首先 想谈的却是另外一个问题。如果不是要把 1 0 0个数加成一个数,会怎么样?如果只想用自动加 法器把5 0对数字加成5 0个不同的结果又会怎么样?也许你希望有一个万能的机器来累加多对 数字、1 0个数字或1 0 0个数字,并且希望所有的结果都可方便地使用。 前面提到的自动加法器在与锁存器相连接的一组灯泡上显示出其相加结果。对于把 5 0对 数字加成5 0个不同的和来说,这种方法并不好。你可能希望把结果存回 R A M阵列中,然后, 在方便的时候用R A M控制面板来检查结果。控制面板上有专门为此目的而设计的灯泡。 这意味着连接在锁存器上的灯泡可以去掉。不过,锁存器的输出端必须连接到 R A M阵列 的数据输入端上,以便于和可以写入到 R A M中: 152 编码的奥秘 下载 控制面板 16位计数器 8位加法器 8位锁存器
Chinaopub.com 第7章自动果作153 下载 上图中省略了自动加法器的其余部分,特别是振荡器和清零开关,因为不再需要显著标 计数器和锁存器的清零和时钟输入来源。此外,既然我们已经充分利用了RAM的数据输入 ,就需要有一种方法来控制RAM的写入信号。 我们不去考虑这个电路能否工作,而把重点放在需要解决的问题上。当前需要解决的问 题是能配置一个自动加法器,它不会仅用来累加一串数字。我们希望能随心所欲地确定累加 多少数字、在RAM中存储多少不同的结果以供日后检查 例如,假设我们希望先把三个数字加在一起,然后把另两个数字加在一起,最后再把另 外三个数加在一起。我们可能会将这些数字存储在从地址0000h开始的RAM阵列中,存储器 的内容如下所示: 0000h|27h 第一个和放在这里 0004h 第二个和放在这里 000k33h 三个和放在这里 这是本书第16章所说明的内容。方格里是存储单元中的内容,存储器的每一个字节在 个方格中。方格的地址在方格左面,并非每一个地址都要表示出来,存储器的地址是连续的, 因而可以算出某个方格的地址。方格的右侧是关于这个存储单元的注释,它们表示出我们希 望自动加法器在这些空格中存储三个结果。(虽然这些方格是空的,但存储单元并非空的。存 储单元中总有一些东西,即使只是随机数,但此时它不是有用的数。) 现在可以试一下十六进制算术运算并且把结果存到方格中,但这并不是此项试验的要点 我们想让自动加法器来做一些额外的工作。 不是让自动加法器只做一件事情一在最初的加法器中,只是把RAM地址中的内容加到 称为累加器的8位锁存器中—实际上是让它做四件不同的事。要做加法,需先从存储器中传 送一个字节到累加器中,这个操作叫作Load(装载)。第二项所要执行的操作是把存储器中的 个字节加(Ad)到累加器中。第三项是从累加器中取出结果,保存( Store)到存储器中。最后, 需要有一些方法使自动加法器停止(Halt)工作 详细说来,让自动加法器所做的工作如下所示 把地址0000h中的数装载到累加器中 把地址000h中的数加到累加器中 把地址0002h中的数加到累加器中 ·把累加器中的数保存到地址0003h中 把地址0004h中的数装载到累加器中
上图中省略了自动加法器的其余部分,特别是振荡器和清零开关,因为不再需要显著标 出计数器和锁存器的清零和时钟输入来源。此外,既然我们已经充分利用了 R A M的数据输入 端,就需要有一种方法来控制 R A M的写入信号。 我们不去考虑这个电路能否工作,而把重点放在需要解决的问题上。当前需要解决的问 题是能配置一个自动加法器,它不会仅用来累加一串数字。我们希望能随心所欲地确定累加 多少数字、在R A M中存储多少不同的结果以供日后检查。 例如,假设我们希望先把三个数字加在一起,然后把另两个数字加在一起,最后再把另 外三个数加在一起。我们可能会将这些数字存储在从地址 0 0 0 0 h开始的R A M阵列中,存储器 的内容如下所示: 这是本书第1 6章所说明的内容。方格里是存储单元中的内容,存储器的每一个字节在一 个方格中。方格的地址在方格左面,并非每一个地址都要表示出来,存储器的地址是连续的, 因而可以算出某个方格的地址。方格的右侧是关于这个存储单元的注释,它们表示出我们希 望自动加法器在这些空格中存储三个结果。(虽然这些方格是空的,但存储单元并非空的。存 储单元中总有一些东西,即使只是随机数,但此时它不是有用的数。) 现在可以试一下十六进制算术运算并且把结果存到方格中,但这并不是此项试验的要点, 我们想让自动加法器来做一些额外的工作。 不是让自动加法器只做一件事情—在最初的加法器中,只是把 R A M地址中的内容加到 称为累加器的8位锁存器中—实际上是让它做四件不同的事。要做加法,需先从存储器中传 送一个字节到累加器中,这个操作叫作 L o a d(装载)。第二项所要执行的操作是把存储器中的 一个字节加( A d d )到累加器中。第三项是从累加器中取出结果,保存 ( S t o r e )到存储器中。最后, 需要有一些方法使自动加法器停止 ( H a l t )工作。 详细说来,让自动加法器所做的工作如下所示: • 把地址0 0 0 0 h中的数装载到累加器中 • 把地址0 0 0 1 h中的数加到累加器中 • 把地址0 0 0 2 h中的数加到累加器中 • 把累加器中的数保存到地址 0 0 0 3 h中 • 把地址0 0 0 4 h中的数装载到累加器中 第17章 自 动 操 作 153 下载 第一个和放在这里 第二个和放在这里 第三个和放在这里
154编的 Chinapub.com 下载 把地址0005h中的数加到累加器中 把累加器中的数保存到地址0006h中 ·把地址0007h中的数装载到累加器中 把地址0008h中的数加到累加器中 把地址0009h中的数加到累加器中 把累加器中的数保存到地址000Ah中 停止自动加法器的工作 注意,同最初的自动加法器一样,存储器的每个字节的地址是连续的,开始处为0000h 以前自动加法器只是简单地把存储器中相应地址的数加到累加器中。某些情况下,现在仍然 需要这样做,但有时我们也想直接把存储器中的数装载到累加器中或者把累加器中的数保存 到存储器中。在所有事情都完成以后,我们还想让自动加法器停下来以便检查RAM阵列中的 内容。 怎样完成这些工作呢?只是简单地键入一组数到RAM中并期望自动加法器来正确操作是 不可能的。对于RAM中的每个数字,我们还需要一个数字代码来表示自动加法器所要做的工 作:装载,加,保存或停止。 也许最容易(但肯定不是最便宜)的方法是把这些代码存储在一个完全独立的RAM阵列 中。这第二个RAM阵列与最初的RAM阵列同时被访问,但它存放的不是要加的数,而是用 来表明自动加法器将要对最初的RAM阵列的相应地址进行某种操作的代码。这两个RAM阵列 可以分别标为数据(最初的RAM阵列)和代码(新的RAM阵列): 控制面板 」士 64ltxg Dob RAM 16位计数器 控制面板 646 RAM Dol 数据 已经确认新的自动加法器能够把“和”写入到最初的RAM阵列(标为数据),而要写入新 的RAM阵列(标为代码)则只能通过控制面板来进行 我们用4个代码来表示自动加法器希望能实现的4个操作。4个代码可任意指定,下面为可 能的一组代码:
154 编码的奥秘 下载 • 把地址0 0 0 5 h中的数加到累加器中 • 把累加器中的数保存到地址 0 0 0 6 h中 • 把地址0 0 0 7 h中的数装载到累加器中 • 把地址0 0 0 8 h中的数加到累加器中 • 把地址0 0 0 9 h中的数加到累加器中 • 把累加器中的数保存到地址 0 0 0 A h中 • 停止自动加法器的工作 注意,同最初的自动加法器一样,存储器的每个字节的地址是连续的,开始处为 0 0 0 0 h。 以前自动加法器只是简单地把存储器中相应地址的数加到累加器中。某些情况下,现在仍然 需要这样做,但有时我们也想直接把存储器中的数装载到累加器中或者把累加器中的数保存 到存储器中。在所有事情都完成以后,我们还想让自动加法器停下来以便检查 R A M阵列中的 内容。 怎样完成这些工作呢?只是简单地键入一组数到 R A M中并期望自动加法器来正确操作是 不可能的。对于 R A M中的每个数字,我们还需要一个数字代码来表示自动加法器所要做的工 作:装载,加,保存或停止。 也许最容易(但肯定不是最便宜)的方法是把这些代码存储在一个完全独立的 R A M阵列 中。这第二个 RAM 阵列与最初的R A M阵列同时被访问,但它存放的不是要加的数,而是用 来表明自动加法器将要对最初的 R A M阵列的相应地址进行某种操作的代码。这两个 R A M阵列 可以分别标为数据(最初的 R A M阵列)和代码(新的R A M阵列): 已经确认新的自动加法器能够把“和”写入到最初的 R A M阵列(标为数据),而要写入新 的R A M阵列(标为代码)则只能通过控制面板来进行。 我们用4个代码来表示自动加法器希望能实现的 4个操作。4个代码可任意指定,下面为可 能的一组代码: 控制面板 控制面板 16位计数器 代码 数据