《编码》读书笔记——真正的自动化

自动化

这一张篇将是最让人激动人心的一刻。前面我们已经解决了存储、加法、减法的问题,这里将之前的知识全部连起来。

简单回顾

之前用过一个8位锁存器实现累加8个开关输入的数


回顾一下使用步骤:

  1. 使用锁存器之前需要清零处理,使存储的内容清零,
  2. 开关输入第一个数字,加法器将数字与锁存器输出的零相加
  3. 按下锁存器的开关(当时钟信号为1的时候 ,锁存器的数据是可以改变的)将加法器输出结果保存到锁存器中,并且灯泡显示出结果
  4. 断开相加开关,保证存储的数据不收影响
  5. 现在输入第二个数,加法器把这个数与锁存器中数相加。
  6. 连通相加开关,加法器中的结果保存到锁存器中。
  7. 反复进行则达到了累加的目的。

之前提到过边沿触发器的锁存器易于使用,只会在始终由0变为1的瞬间保存数据,后面用的锁存器都为边沿触发的锁存器。

上一篇介绍了存储器RAM用于保存数据,如何将RAM阵列连接到累加器上。用RAM替换掉开关。之前讲过计数器,计数器就可以控制RAM阵列的地址,现在把这些连起来。可以得到下图



步骤

  1. 闭合清零开关,清除锁存器内容及16计数器输出置为0000h
  2. 闭合RAM控制面板上的接管开关
  3. 输入一组想要加的8位数,如果有100个数,则被保存在0000h到0063换地址中
  4. 断开RAM的接管开关,控制面版不再对RAM阵列起作用
  5. 断开清零开关
  6. 观察灯泡的明灭

振荡器提供时钟信号,在0和1之间交替变化的信号。当时钟由0变为1的时候,锁存器保存了加法器的输出,16位计数器加1,指向下一个RAM阵列的地址。这里的振荡器让RAM地址自动增加,实现了自动寻址的功能

  • 当清零开关断开后,时钟第一次由 0变为 1时,锁存器保存第一个数 。同 时 , 计数器增加到0001 h ; 当 时 钟 第 二 次 由 0 变为 1 时 , 锁 存 器 保 存 第 一 个 数 与 第 二 个数之和,同时计数器增加到 0 0 0 2 h 。这里假设的是振荡器需要慢到允许电路的其余部分都可以再次工作。

下一步把灯泡去掉,锁存器的输出端连接到RAM阵列的数据输入端,让RAM也可以保存相加的结果。


现在如果想实现先把三个数相加,然后把另外两个数相加,接下来把另外三个数相加。可能会用下面这个图表示(这里的空格后面会介绍),方格里面是存储单元的内容,存储器每一个字节在一个方格中:

自动加法器所做的工作大致如下:



总共其实就四件实际情况

  • 从存储器传送字节到累加器,过程叫装载(Load)
  • 把存储器中的一个字节加到累加器中,过程叫加(Add)
  • 从累加器中取出结果保存到存储器,过程叫存(Store)
  • 停止加法器工作,过程叫停止(Halt)

现在需要用一种方法来控制RAM如何写入信号,也就是上面提到的几个过程。于是需要一个数字代码来标识自动加法器所要做的工作

把数字代码独立的存储在完全独立的RAM阵列中,第二个RAM阵列与最初RAM阵列同事被方位,但它存放的不是要加的数,而是用来表示自动加法器将要对最初的RAM阵列相应地址进行何种操作的代码。

将操作写入新的RAM只能通过控制面板来实现。现在规定下数字代码表示如下:


为了实现上面提到的加法,需要把数字代码保存到RAM阵列中。

上面的代码称为指令码,指示电路执行某种操作

为了实现装载指令,需要将RAM输出,有时候也作为8位锁存器的输入。这种改变需要2-1选择器。(因为现在控制指令也存储在了RAM阵列中,之前RAM直接输出到加法器是因为那时候只有RAM只保存了数据而没有保存控制指令。)


上图还少很多控制这些组件的信号,比如计数器的时钟和清零输入,锁存器的清零和保存,RAM阵列的写入以及选择器的输入。这些控制信号可以通过逻辑门的各个组合来产生。

为了实现减法,我们扩展操作码,增加减法。

加法和减法只通过操作码的最低有效位来区分。如果操作码为21h,需要增加对减法的支持。减法相对于加法多取反器以及进位输入置位1,其余与加法指令相同。

完整电路图如下


例子:假设56h加2Ah再减去38h。两个RAM阵列保存的数据如下(数据和控制信号分开存储的)


之前讲过计算机如何实现加法和减法的。按照之前讲的步骤。先是56h加上2Ah和是80h,然后减法就是38h取反为C7h,然后加法器进位输入为1时,将C7h与80h相加,(C7h+80h+1h=48h)

上面所有的操作部件宽度都只有8位,如果要扩充到16进制,一般就是连接两个8位加法器。但是也可以把16位数拆分为两个8位

比如



先加低字节再加高字节,然后拼在一起




结果

如果两个16位数76ABh和236Ch相加会有溢出的现象,也就是进位。这个时候需要保存低字节相加的结果进位,然后把这个结果作为高字节相加的进位输入。于是就要用到1位锁存器,也叫做进位锁存器

所以现在现在新加一个操作码叫进位加(Add with Carray).

8位加法运算中使用的是常规指令,加法器的进位为0。但是16位数相加,使用常规指令来实现低字节加法,但是高字节相加的时候就要使用到新的进位指令。

如果进行16减法,那还需要一个借位减,减法操作是减数取反并且把加法器进位输入置为1,因为进位通常不是1,所以被忽略了。而在16位减法中,进位输出应该保持在进位锁存器中高字节相减的时候,进位锁存器的结果作为加法器的进位输入。

总共的操作码


任何时候进行多字节加法运算,不管是否需要都应该用进位加法器指令计算。

有了进位操作符与借位操作符,极大的扩展了机器处理的范围。从八进制到16、24,32,40都可以。

比如32位数的7A892BCDh与65A872FFh相加。则需要一个加法指令及三个进位加法指令。


现在有一个自动加法器了,其中代码的RAM和数据的RAM阵列同同时、顺序的从0000h开始寻址,代码RAM中的每条指令对应于数据RAM中相同地址的存储单元。一旦保存指令是的数据保存到了数据的RAM中,这个数就不能再次被装载到累加器中。因为代码指令数据是一一对应的。

接下来为了解决这个问题,需要指令在存储器中占3个字节。第一个字节表示指令本色,后面两个字节代表16存储器的单元地址。

之前:



之后:


通过改进可以用更合理的方式来保存两个加数及结果。这可能会报错在以前从没有使用的存储区域



存储单元可以按照逻辑联系起来


整个过程和之前的过程一样,首先4001h和4003h中的低字节相加,结果保存到4005h中,两个高字节利用进位加法进行相加,结果保存早4004h中。如果去掉了停止指令,在代码RAM中添加更多指令,后面的计算就可以简单通过存储器地址利用原来的数和他们的和了。


从存储器中读出指令的过程叫做取址。每个指令长3个字节,每次从存储器中只能取一个字节,因此需要3个时钟周期。

现在只需要一个RAM阵列来达到我们的目的,用三个字节来标识操作以及数据,代码和数据存储在同一个RAM阵列中。则需要一个2-1选择器来确定如何寻址,地址可能来至RAM也可能来至锁存器,在地址呗锁存之后,选择器允许锁存器中的地址作为RAM的地址输入。

怎么把两个8位数相加再减去第三个数:



为了让加法器执行所有指令则我们必须去掉00Ch的停止指令。这里就引入了jump(转移)指令。

现在可以在00Ch中用转移指令替换停止指令。
如何在电路中实现转移指令?需要用到触发器的预置和清零。



根据上面可以知道只有当指令代码为30h且后面的地址被锁存的时候,置位信号才为1。现在解决了转移的问题。

如果要实现两个数的乘法怎么办,比如A7h与1Ch(对应十进制中的28)相乘,也就是28个A7h相加。比如最开始RAM存放如下:


下面是A7h加一次的过程(高字节和高字节、低字节和低字节相加)


可以把上面的指令再重复27次。但是这是很不理想的。如果在0012h处直接转移到0000h处,则就会进行再加一次。但是这样就永远循环去了。需要一种机制来停止。这就是条件转移,需要新增一个和进位锁存器类似的以为锁存器,因为只有8位加法器的输出全为0它才锁存1。


只有当零锁存器为0时,非零转移指令才转移到置顶地址。也就是一次加法,减法,进位加法、进位减法指令计算结果为0,则没有发生转移,则16计数器的置位信号不会被触发。

改进之后的RAM存储内容


从1Ch中减去1的结果和把FFh与1Ch相加的结果是一样的。利用这个机制就可以通过加法实现连续减去1。在电路中也容易实现。

通过上面的条件转移指令就达到了循环加的目的。
至此已经有了如下操作码



数字计算机有4个主要部分:处理器,存储器,输入设备和输出设备。对应到上面的图,存储器是一个64kb的RAM;输入输出分别是RAM控制板上的几行开关和灯泡;处理器就是实现累加这一块器件。

处理器是计算机的核心,由各个器件组成。累加器是一个,还有一个锁存器用来保存数据。上面设计的计算机中8位方向器和8位加法器在一起称作算术逻辑单元或ALU,16计数器也叫做程序计数器PC。

上面提到的一些指令,也就是处理器可以相应的操作码(如装载指令10h)叫做机器码,或机器语言。计算机提供了机器码的助记符来简化指令的编写。


上面的加法转换为指令代码结果如下:



这就是所谓的汇编语言。

至此基本上把整个计算机怎么由一个一个的电子元器件组装起来的过程介绍完毕。中间省略了一些内容,比如非零转移中的电路如何设计,只介绍了非零转移的原理。

你可能感兴趣的:(《编码》读书笔记——真正的自动化)