• 编码:隐匿在计算机软硬件背后的语言(8)--自动操作(一)


    在本系列文章的前面几篇中,我们介绍了加法器、减法器、锁存器和存储器组织等,但这些器件目前看上去还是“很笨”,例如加法器和减法器,只能计算8位二进制数;另一方面如果你想得到100个8位二进制数的和,你需要输入所有的数并累加起来,终于完成时,你发现有两个数输入错了,这时你不得不重新输入一遍,重复所有的操作。这是一个很大的缺陷。

    下图我们在加法器的基础上介绍一个用于累加两个数的连接图


    首先清零开关闭合,将锁存器输出置零,然后在输入端输入两个数中的第一个8位二进制数,时钟为1时,该数被锁存器保存并输入到加法器的B端口;然后我们在A端口输入第二个加数,它与第一个加数相加后作为锁存器的输入,当时钟为1时输出;此时灯泡的亮灭可以帮助我们获得两个数的和。

    以上是该自动累加器的工作原理。

    现在有了更高的需求,要得到100个8为二进制数的和。前面我们有了RAM存储阵列,现在利用这个存储阵列就可以实现。我们要在64K存储器的基础上加一个控制面板来辅助我们的操作,如下图所示


    加一个控制面板,这个控制面板主要由25个2-1选择器组成。其作用是控制地址、数据输入和写入端的信号是来自外部还是来自内部。之所以是25个2-1选择器,是因为地址端是16位,数据端是8位,写入端1位,加起来就是25。控制端控制这25个信号是我们手动输入还是系统自动输入。

    现在我们为了实现我们的目的,将8位自动累加器和64K×8的存储器组织组合在一起。此外,存储器组织的地址我们用前面介绍的16位计数器的输出作为其输入。组合后的图如下所示


    下面我来看一下,这个电路是如何工作的;再次之前我们需要说明一下,这里的锁存器我们使用的上升沿触发的锁存器,它比电平触发的锁存器要好用的多。

    首先,先闭合RAM存储器的控制面板开关,将我们要相加的100个数输入到存储器阵列中,这些数位置在0000h-0063h,其余位置全部是00h。

    然后,我们将清零开关闭合,将计数器置为0000h,同时将锁存器的输出置为00h。然后将清零开关断开。此时,地址端为0000h,也就是指向第一个地址。

    接下来。当时钟从0->1时,将有两件事同时发生:锁存器保存加法器的结果,也就是0000h地址中我们输入的8位二进制数;同时计数器加1,指向RAM存储器的下一个地址0001h。

    当时钟发生第二次跳变时,锁存器保存前两个数的和,同时地址变为0002h。

    如此往复操作。而且是自动完成。最后通过灯泡的亮灭我们就可以知道累加的结果。


    但这个电路也有一个很大的缺陷,那就是只能计算8为二进制数的和,同时这100个数的和也不能超过8位数(十进制的255),另外也只能计算加法,如果要计算减法,那么范围将变为-128-127之间。

    如果要计算更大的数,一个最容易想到的方法就是增加存储器的大小、加法器和锁存器的位宽。但这些投资不太合算。

    此外,如果我们需求增加,例如我们想要得到其中某两个数的和等等,目前这个电路是无法做到的。所以我们需要在此基础上再做更改。

    我们已经有一个存储器可以自由访问,你可能回想,如果把结果反存到存储器中,不是一个好的方法么?

    基于这个想法我们将电路做如下改动


    上图略去了振荡器和清零部分,而且用到了RAM的写入功能,就需要一种用来控制写入信号的方法。

    现在,加入我们要计算三个数的和。我们可以把这三个数RAM阵列中以0000h开始的空间中,如下图所示


    实际上我们需要它做4件事:进行加法操作,把第一个要操作的数从存储器传送到累加器--这个操作称为加载(Load)。第二个操作是把存储器的一个字节加(Add)到累加器的内容中。第三个操作是把累加器的计算结果取出本来存放(Store)到存储器。最后一个操作是用一个方法让自动加法器停下来(Halt)。下图是上面例子的运算过程。



    完成以上四个操作:加载、累加、保存和终止,我们上面的电路可以完成么,当然不行。他们还没有这么聪明。

    我们还有需要用一些数字代码来让系统识别每一项操作。存放这些识别操作类型的最简单(不一定是代价最小)的方法就是把这些代码放在另一个独立的RAM阵列中,然后让它同数据RAM阵列同时被访问。这两个RAM阵列分别被称为数据阵列和代码阵列。如下图所示


    我们现在需要四个代码来标识自动加法器要做的四个操作,这些代码可以任意指定,下图是一种方案


    还是以上面的例子来说明,先把这些代码与要进行的运算对应输入代码阵列,这些数字代码叫做指令码,代码阵列和数据阵列对应的图如下所示


    此外为了实现Load加载操作和Add累加操作,我们还需要对电路做出如下改变


    当执行Load操作时,2-1选择器选择左边的输入,也就是数据RAM阵列的输出,此时数据RAM阵列的写入端置零,这样,第一个数据就通过锁存器被存储,作为加法器的一个输入。当执行Add操作时,2-1选择器选择加法器的输出作为锁存器的输入,这样,第二个数据就和第一个数据(锁存器所保存的值,也就是Load的值)累加,和作为锁存器的输入。此时如果不需要继续累加,那么数据RAM的写入端置1,将和输入到数据RAM阵列,也就执行了Store操作,存储到数据阵列中。

    上面提到的2-1选择器的选择(S)以及16位计数器的时钟输入和清零、8位锁存器的时钟输入和清零,还有数据RAM阵列的写入端等控制信号可以通过逻辑门的组合来实现。


    这一节先记到这里,下一节介绍减法的实现和多位加法的实现等内容。

  • 相关阅读:
    云计算之路-阿里云上:基于Xen的IO模型进一步分析“黑色0.1秒”问题团队
    上周热点回顾(5.5-5.11)团队
    云计算之路-阿里云上:原来“黑色0.1秒”发生在socket读取数据时团队
    云计算之路-阿里云上:读取缓存时的“黑色0.1秒”团队
    云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了团队
    云计算之路-阿里云上:神奇的“黑色30秒”再次出现,究竟是谁的错?团队
    上周热点回顾(4.28-5.4)团队
    云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析团队
    上周热点回顾(4.21-4.27)团队
    云计算之路-阿里云上:借助IIS Log Parser Studio分析“黑色30秒”问题团队
  • 原文地址:https://www.cnblogs.com/hitfredrick/p/6403006.html
Copyright © 2020-2023  润新知