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位计数器 代码 数据
第7章自动作155 下载 操作码 代码 Load(装载)10h Store(保存) Add(加) (停止) 为了执行以上例子中提到的三组加法,需要用控制面板把下面这些数保存到代砍AM阵列中: 20h Add 20h Add 0007h: IOh Load 20hAdd th store O0OBh: FFh Halt 你可能想把这个RAM阵列中的内容与存放累加数据的RAM阵列的内容作一比较。你会发 现代码RAM中的每个代码或者对应于数据RAM中一个要装入或加到累加器的数,或者表示 个要存回到存储器中的数。这样的数字代码通常称作指令码或操作码,它们“指示”电路 执行某种“操作”。 前面谈到过,早期自动加法器的8位锁存器的输出需要作为数据RAM阵列的输入,这就 是“保存”指令的功能。另外还需要一个改变:以前,8位加法器的输出是作为锁存器的输入 但现在为了实现“装载”指令,数据RAM的输出有时候也要作为8位锁存器的输入,这种改 变需要2-1数据选择器。改进的自动加法器如下图: 控制面板 ap代码 控制面板 数据 8位加法 2-1选择器 8位锁存
操作码 代码 L o a d(装载) 1 0 h Store (保存) 11 h Add (加) 2 0 h Halt ( 停止) F F h 为了执行以上例子中提到的三组加法,需要用控制面板把下面这些数保存到代码R A M阵列中: 你可能想把这个R A M阵列中的内容与存放累加数据的 R A M阵列的内容作一比较。你会发 现代码R A M中的每个代码或者对应于数据 R A M中一个要装入或加到累加器的数,或者表示 一个要存回到存储器中的数。这样的数字代码通常称作指令码或操作码,它们“指示”电路 执行某种“操作”。 前面谈到过,早期自动加法器的 8位锁存器的输出需要作为数据 R A M阵列的输入,这就 是“保存”指令的功能。另外还需要一个改变:以前,8位加法器的输出是作为锁存器的输入, 但现在为了实现“装载”指令,数据 R A M的输出有时候也要作为 8位锁存器的输入,这种改 变需要2 - 1数据选择器。改进的自动加法器如下图: 第17章 自 动 操 作 155 下载 控制面板 控制面板 16位计数 器 8位加法 器 8位锁存 器 代码 数据 2-1选择器
156编的奥 下载 上图中少了一些东西,但它显示了各种组件间的8位数据通路,一个16位计数器为2个 RAM阵列提供地址。通常,数据RAM阵列输出到8位加法器上执行加法指令。8位锁存器的 输入可能是数据RAM阵列的输出也可能是加法器的输出,这需要2-1选择器来选择。通常 锁存器的输出又流回到加法器,但对“保存”指令而言,它又作为数据RAM阵列的输入 上图中缺少的是控制这些组件的信号,统称为控制信号。它们包括16位计数器的时钟(Clk) 和清零(Clr)输入,8位锁存器的Clk和CIr输入,数据RAM阵列的写入(W)输入以及2-1选择器的 选择(S)输入。其中有一些信号明显基于代码RMM阵列的输出,例如,若代码RAM阵列的输 出表示装载指令,则2-1选择器的S输入必须为0(选择数据RAM阵列的输出)。仅当操作码为保 存指令时,数据RAM阵列的W输入才为1。这些控制信号可以由逻辑门的各种组合来产生。 利用最小数量的附加硬件和新增的操作码,也能让这个电路从累加器中减去一个数。第1 步是扩充操作码表: 操作码 Load Store 加法和减法只通过操作码的最低有效位来区分。若操作码为21h,除了在数据RAM阵列 的输出数据输入到加法器之前取反并且加法器的进位输入置1外,电路所做的几乎与电路执行 加法指令所做的完全相同。在下面这个改进的有一个反相器的自动加法器里,C信号可以完 成这两项任务: x令代码 16位计数 控制面板 数据 2-1选择器 8位镁存器
上图中少了一些东西,但它显示了各种组件间的 8位数据通路,一个 1 6位计数器为 2个 R A M阵列提供地址。通常,数据 RAM 阵列输出到8位加法器上执行加法指令。 8位锁存器的 输入可能是数据 R A M阵列的输出也可能是加法器的输出,这需要 2 - 1选择器来选择。通常, 锁存器的输出又流回到加法器,但对“保存”指令而言,它又作为数据 R A M阵列的输入。 上图中缺少的是控制这些组件的信号,统称为控制信号。它们包括1 6位计数器的时钟(C l k) 和清零( C l r )输入,8位锁存器的C l k和C l r输入,数据 R A M阵列的写入( W )输入以及2 - 1选择器的 选择( S )输入。其中有一些信号明显基于代码 RAM 阵列的输出,例如,若代码 RAM 阵列的输 出表示装载指令,则2 - 1选择器的S输入必须为0(选择数据R A M阵列的输出)。仅当操作码为保 存指令时,数据R A M阵列的W输入才为1。这些控制信号可以由逻辑门的各种组合来产生。 利用最小数量的附加硬件和新增的操作码,也能让这个电路从累加器中减去一个数。第 1 步是扩充操作码表: 操作码 代码 L o a d 1 0 h S t o r e 11 h A d d 2 0 h S u b t r a c t (减) 2 1 h H a l t FFh 加法和减法只通过操作码的最低有效位来区分。若操作码为 2 1 h,除了在数据 R A M阵列 的输出数据输入到加法器之前取反并且加法器的进位输入置 1外,电路所做的几乎与电路执行 加法指令所做的完全相同。在下面这个改进的有一个反相器的自动加法器里, C0信号可以完 成这两项任务: 156 编码的奥秘 下载 控制面板 16位计数 器 控制面板 代码 数据 反相器 8位加法器 2-1选择器 8位锁存器
Chinapul.com 下载 第7章自动果作157 现在假设把56h和2Ah相加再减去38h,可以按下图所显示的存储在两个RAM阵列中的操 码和数据进行计算 结果放在此处 装载操作完成后,累加器中的数为56h。加法操作完成后,累加器中的数为56h加上2Ah的 和,即80h。减法操作使数据RAM阵列的下一个数(38h)按位取反,变为C7h。加法器的进 位输入置为1时,取反的数C7h与80h相加 其结果为48h。(按十进制,86加42减56等于72。) 还有一个未找到适当解决方法的问题是加法器及连到其上的所有部件的宽度只有8位。以 往唯一的解决方法就是连接两个8位加法器(或其他的两个部件),形成16位的设备 但也有更便宜的解决方法。假设要加两个16位数,例如: 76ABh +232Ch 这种16位加法同单独加最右边的字节(通常称作低字节) ABh + 2Ch DTh 然后再加最左边的字节,即高字节 99h 得到的结果一样,为99D7h。因此,如果像这样把两个16位数保存在存储器中 000k10hIed000k想 低字节结果 10h Load 20hsdd 高字节结果 H
现在假设把5 6 h和2 A h相加再减去3 8 h,可以按下图所显示的存储在两个 R A M阵列中的操 作码和数据进行计算: 装载操作完成后,累加器中的数为 5 6 h。加法操作完成后,累加器中的数为 5 6 h加上2 A h的 和,即8 0 h。减法操作使数据 R A M阵列的下一个数(3 8 h)按位取反,变为C 7 h。加法器的进 位输入置为1时,取反的数C 7 h与8 0 h相加: C 7 h + 80h + 1h 4 8 h 其结果为4 8 h。(按十进制,8 6加4 2减5 6等于7 2。) 还有一个未找到适当解决方法的问题是加法器及连到其上的所有部件的宽度只有 8位。以 往唯一的解决方法就是连接两个 8位加法器(或其他的两个部件),形成1 6位的设备。 但也有更便宜的解决方法。假设要加两个 1 6位数,例如: 7 6 A B h + 232Ch 这种1 6位加法同单独加最右边的字节(通常称作低字节): A B h + 2Ch D 7 h 然后再加最左边的字节,即高字节 7 6 h + 23h 99h 得到的结果一样,为9 9 D 7 h。因此,如果像这样把两个 1 6位数保存在存储器中: 第17章 自 动 操 作 157 下载 “代码” “数据” 结果放在此处 “代码” “数据” 低字节结果 高字节结果
158的奥磁 Chinapub.com 下载 结果中的D7h存在地址0002h中,99h存在地址0005h中 当然,并非所有的数都这样计算,对上例中的数是这样计算。若两个16位数76ABh和 236Ch相加会怎么样呢?在这种情况下,2个低字节数相加的结果将产生一个进位: ABh +bCh Th 这个进位必须加到2个高字节数的和中: +76h +23h Ah 最后的结果为9A17h 可以增强自动加法器的电路功能以正确进行16位数的加法吗?当然可以。需要做的就是 保存低字节数相加结果的进位,然后把该进位作为高字节数相加的进位输入。如何存储1位 呢?当然是用1位锁存器。这时,该锁存器称为进位锁存器。 为了使用进位锁存器,需要有另一个操作码,称作“进位加”( Add with Carry)。在进行 位数加法运算时,使用的是常规“加法”指令。加法器的进位输入为0,加法器的进位输出 锁存在进位锁存器中(尽管根本不必用到) 在进行16位数加法运算时,仍然使用常规“加法”指令来进行低字节加法运算。加法器 的进位输入为0,其进位输出锁存到进位锁存器中。要进行高字节加法运算就要使用新的“进 位加”指令。这时,两个数相加使用进位锁存器的输出作为加法器的进位输入。如果低字节 加法有进位,则其进位可用在第二次运算中:如果无进位,则进位锁存器的输出为0。 如果进行16位数减法运算,还需要一个新指令,称为“借位减”( Subtract with borrow) 通常,减法操作需要使减数取反且把加法器的进位输入置为1。因为进位通常不是1,所以往 往被忽略。在进行16位数减法运算时,进位输出应保存在进位锁存器中。高字节相减时,进 位锁存器的结果应作为加法器的进位输入 加上新的“进位加”和“借位减”操作,共有7个操作码: 操作码 代码 Load Add with Carry(进位加) Subtract with borrow(借位减) 在减法和借位减法运算中,需要把送往加法器的数取反。加法器的进位输出作为进位锁 存器的输入。无论何时执行加法、减法、进位加法和借位减法操作,进位锁存器都被同步。 当进行减法操作,或进位锁存器的数据输出为1并且执行进位加法或者借位减法指令时,8位 加法器的进位输入被置为 记住,只有上一次的加法或者进位加法指令产生进位输出时,进位加法操作才会使8位加
158 编码的奥秘 下载 结果中的D 7 h存在地址0 0 0 2 h中,9 9 h存在地址0 0 0 5 h中。 当然,并非所有的数都这样计算,对上例中的数是这样计算。若两个 1 6位数7 6 A B h和 2 3 6 C h相加会怎么样呢?在这种情况下, 2个低字节数相加的结果将产生一个进位: A B h + 6Ch 11 7 h 这个进位必须加到2个高字节数的和中: 1 h + 76h + 23h 9 A h 最后的结果为9 A 1 7 h。 可以增强自动加法器的电路功能以正确进行 1 6位数的加法吗?当然可以。需要做的就是 保存低字节数相加结果的进位,然后把该进位作为高字节数相加的进位输入。如何存储 1位 呢?当然是用1位锁存器。这时,该锁存器称为进位锁存器。 为了使用进位锁存器,需要有另一个操作码,称作“进位加”(Add with Carry)。在进行 8位数加法运算时,使用的是常规“加法”指令。加法器的进位输入为 0,加法器的进位输出 锁存在进位锁存器中(尽管根本不必用到)。 在进行1 6位数加法运算时,仍然使用常规“加法”指令来进行低字节加法运算。加法器 的进位输入为0,其进位输出锁存到进位锁存器中。要进行高字节加法运算就要使用新的“进 位加”指令。这时,两个数相加使用进位锁存器的输出作为加法器的进位输入。如果低字节 加法有进位,则其进位可用在第二次运算中;如果无进位,则进位锁存器的输出为 0。 如果进行1 6位数减法运算,还需要一个新指令,称为“借位减”(Subtract with Borrow)。 通常,减法操作需要使减数取反且把加法器的进位输入置为 1。因为进位通常不是 1,所以往 往被忽略。在进行 1 6位数减法运算时,进位输出应保存在进位锁存器中。高字节相减时,进 位锁存器的结果应作为加法器的进位输入。 加上新的“进位加”和“借位减”操作,共有 7个操作码: 操作码 代码 L o a d 1 0 h S t o r e 11 h A d d 2 0 h S u b t r a c t 2 1 h Add with Carry(进位加) 2 2 h Subtract with Borrow(借位减) 2 3 h H a l t F F h 在减法和借位减法运算中,需要把送往加法器的数取反。加法器的进位输出作为进位锁 存器的输入。无论何时执行加法、减法、进位加法和借位减法操作,进位锁存器都被同步。 当进行减法操作,或进位锁存器的数据输出为 1并且执行进位加法或者借位减法指令时, 8位 加法器的进位输入被置为1。 记住,只有上一次的加法或者进位加法指令产生进位输出时,进位加法操作才会使 8位加
Chinaopub.com 第7章自动果作159 下载 法器的进位输入为1。任何时候进行多字节数加法运算时,不管是否必要,都应该用进位加法 指令计算。为正确编码前面列出的16位加法,可用如下所示方法: “代码” “数据 低字节结果 11h Stm 高字节结果 不管是什么样的数,该方法都能正确工作。 有了这两个新的操作码,极大地扩展了机器处理的范围,使其不再只局限于进行8位数加 。重复使用进位加法指令,能进行16位数、24位数、32位数、40位数等更多位数的加法 假设要把32位数7A892BCDh与65A872FFh相加,则需要一个加法指令及三个进位加法指 数据 IOoth: h Lmd mmh:I Cph Ah sr 11h Strom 低字节结果 Dh Imd 2.h h地 d with CurryT2h 11h Trmm 次高字节结果 lh Lnd 89h hJd with Carry阻h 11h Strm 次高字节结果 l1h Strum 最高字节结果 shAlt 当然,把这些数存放到存储器中并非真的很好。这不仅要用开关来表示二进制数,而且 数在存储器中的地址也并不连续。例如,7A892BCDh从最低有效字节开始,每个字节分别存 入存储器地址0000h、0003h、0006h及0009h中。为了得到最终结果,还必须检查地址0002h 0005h、0008h及000Bh中的数。 此外,当前设计的自动加法器不允许在随后的计算中重复利用计算结果。假设要把3个8 位数加起来,然后再在和中减去一个8位数,并且存储结果。这需要一次装载操作、两次加法 操作、一次减法和一次保存操作。但如果想从原先的和中减去另外一个数会怎么样呢?那个 和是不能访问的,每次用到它时都要重新计算。 原因在于我们已经建造了一个自动加法器,其中的代码RAM和数据RAM阵列同时、顺 序地从0000h开始寻址。代码RAM中的每条指令对应于数据RAM中相同地址的存储单元
法器的进位输入为1。任何时候进行多字节数加法运算时,不管是否必要,都应该用进位加法 指令计算。为正确编码前面列出的 1 6位加法,可用如下所示方法: 不管是什么样的数,该方法都能正确工作。 有了这两个新的操作码,极大地扩展了机器处理的范围,使其不再只局限于进行 8位数加 法。重复使用进位加法指令,能进行 1 6位数、2 4位数、3 2位数、4 0位数等更多位数的加法运 算。假设要把3 2位数7 A 8 9 2 B C D h与6 5 A 8 7 2 F F h相加,则需要一个加法指令及三个进位加法指 令: 当然,把这些数存放到存储器中并非真的很好。这不仅要用开关来表示二进制数,而且 数在存储器中的地址也并不连续。例如, 7 A 8 9 2 B C D h从最低有效字节开始,每个字节分别存 入存储器地址0 0 0 0 h、0 0 0 3 h、0 0 0 6 h及0 0 0 9 h中。为了得到最终结果,还必须检查地址 0 0 0 2 h、 0 0 0 5 h、0 0 0 8 h及0 0 0 B h中的数。 此外,当前设计的自动加法器不允许在随后的计算中重复利用计算结果。假设要把 3个8 位数加起来,然后再在和中减去一个 8位数,并且存储结果。这需要一次装载操作、两次加法 操作、一次减法和一次保存操作。但如果想从原先的和中减去另外一个数会怎么样呢?那个 和是不能访问的,每次用到它时都要重新计算。 原因在于我们已经建造了一个自动加法器,其中的代码 R A M和数据 R A M阵列同时、顺 序地从0 0 0 0 h开始寻址。代码 R A M中的每条指令对应于数据 R A M中相同地址的存储单元。一 第17章 自 动 操 作 159 下载 “代码” “数据” “代码” 数据 低字节结果 次高字节结果 次高字节结果 最高字节结果 低字节结果 高字节结果