也是从这时候起,我开始使用计算机在互联网中傲游。从最开始的Flash小游戏中熟悉键盘鼠标的基本操作;到在网络游戏中寻找外挂时迷上黑客技术文化;最后在各种论坛社区中找寻学习计算机各种技术技巧。
差不多有十三四年的时间是在学习如何使用计算机。直到读了《编码》这本书,为了更深入的理解计算机,就想弄懂计算机的工作原理。有机会的话,尝试制作一台计算机。
至此使用计算机变成了制作计算机。
非科班出身的我自然有很大的知识漏洞缺陷。在第一次读这本书时,读到了加法器就再也读不下去了。关上书打基础,在学习了数字电路和模拟电路的一些基础知识后,继续尝试接着读,发现之前困扰问题似乎也不在困难,二进制和十六进制开起来也自然多了。
在我之前的一篇笔记《如何实现加法器》中,对于ALU的工作原理做了简单的了解。
数据虽然是保存硬盘中的,如果CPU每次运算都要从硬盘中取数据的话就太慢了。CPU的运算速度和IO的速度差异实在是太大了,所以需要把硬盘中的数据拷贝到内存中,这样CPU在需要数据的时候直接向内存要。
所以寄存器的作用就是用来保存数据,那么如何用电、逻辑门来保存数据呢?
异或门
回忆一下或非门,其真值表如下:
RS锁存器
现在把两个或非门结合起来,第一个门电路的输出是第二个门电路的输入,第二个门电路的输出是第一个门电路的输入。
可以看到这两个门电路缠绕在一起,输入既决定输出,输出也决定输入。
真值表如下:
从或非门的真值表可知,只要其中有一个输入为1,不管另一个是0还是1,输出都是0。需要注意的是,当两个输入都为0时,两个门电路都无法确定输出,而两个门电路都需要另一个的输出当作输入,所以此时电路系统处于不确定的状态。
只要其中一个输入为1,那么该门电路的输出就确定为0了(异或门决定),另一个的门电路的输入也就确定为0,此时该电路系统就不会出现错误。
神奇的地方来了,如下图:
当输入2为1时,改变上面的输入时,输出随之改变。(先暂时不考虑输出2)
但是当输入2为0时,改变上面的输入时,会发现输出不变了。如下图:
输出1被输入2锁住了,因此这种电路叫做锁存器。(当然,反过来也是一样的)
从上图还可以得知,但输入2为0时,输入1也是可以为0的,此时为什么不是Error呢?
因为之前当两个都为0时,他们的输出是不确定的所以为Error,但是当输入1为1,输入2为0时,此时电路系统是确定的,改变输入1,输入2的输出并没有改变,依然确定输出为1,那么输入1的输出也就是确定的了。因此不会发生错误。
为了方便,把该电路的输入输出取一个名字,如下:
修改后的真值表如下:(注意输入2和输入1交换了位置。)
当S和R都为0时,现在的输出就不是无法确定了。而是保持上一次的输出,这很重要。正是因为有了该特点。电路有了记忆功能,也就是说电路可以保存数据了。
而当S和R都为1时,在这个系统中不需要用到,因此它被禁止了。因为当S和R都为1时,那么输出都为0,这和电路设计中Q和互反矛盾,所以要避免。
这里两个输出是相反的,真正需要的只要1个即可。
因为可把输出锁起来,两个输入端分别为Reset和Set,所以这个电路的名字叫做RS锁存器。
D触发器
继续构造电路,在原来的基础上添加两个或非门。
用一个把两个输入端用一个SCK锁住。当SCK为1时,两个输入端都被锁住,当SCK为0时,输入端被激活。如下图:
[gif error]这个电路和之前的电路并没有什么区别,同理两个输入端不能同时为0(这里因为异或门取反,所以不是同时为1,原理相同)。
数据端也只需要一个输入就可以了,并且不能同时输入0,继续构造电路。
把两个输入接在一起,并且其中一个取反。现在就只有一个输入端和一个保持端了。
当CLK为1时,数据输出保持不变。当CLK为0时,输出端取决于数据输入端。
[gif error]并且还不用担心两个输入端同时为0。真值表如下:
输入端为Data端,这个电路的名字叫做 D触发器 。
可以看到这个电路就可以保存1Bit的数据了。
把好多个串起来,就可以保存多个Bit了。一般情况下,8Bit等于1Byte,写数据也是一个字节一个字节的写,所以一把把8个触发器连起来,共用一根SLK线。所以也叫八位锁存器。
这种触发器的触发方式为CLK为0时,数据就可以输入,当CLK为1时,数据就被锁住不能修改了。
当CLK为0时数据是可以修改的,如果在CLK为0期间,Data输入数据完毕后,CLK还没有锁住时,发送电磁干扰改变了Data的输入,那么保存的数据也就保存错了。
边沿触发器
既然电平触发可能由于时间太长导致数据可能因干扰而改变,那么就减少触发的时间,高低电平改变的瞬间时间很短,因此可以利用高低电平变化的瞬间来触发,把两个D触发器串在一起。为了进行区分,两个D触发器分别取一个名字。
主触发器从Data得到输入,从触发器的输入来自主触发器。主触发器不会改变得到的输入。如下图:
[gif error]目前来说这个触发器和D触发器完全关键来了,对两个触发器的CLK其中一个取反,如下图:
这样的话,CLK只有一个输入,在同一时间,主触发器和从触发器只能有一个起作用。
[gif error]基本原理如下:
- 先把CLK置为0,此时主触发器的CLK经过取反现在为1,此时主触发器就锁住了。虽然从触发器的CLK为0没有被锁住,但是从触发器的输入需要从主触发器的输出得到,主触发器没有改变,那么从触发器也就不会改变。
- 现在把CLK置为1,此时主触发器的CLK解锁。可以修改输出,但是从触发器此时被锁住。主触发器的输出还是无法改变从触发器的输出。
- 重点来了,此时虽然主触发器的输入无法改变,但是主触发器的输出已经固定下来了。此时再把CLK置为0,那么从触发器此时的输入可以从被之前的主触发器的输出改变的,只是无法从触发器的输入改变而已。
完成流程如下:
- 先把CLK置为1,锁从触发器,现在可以把需要保存的数据输入到主出触发器中。
- 注意,现在保存的数据已经在主触发器中了。现在把CLK置0,一瞬间,主触发器锁住,从触发器打开,保存在主触发器的数据已经输出到从触发器中了。
[gif error]这样子,一瞬间触发的触发器的名字叫做 边沿触发器 。
同理把多个边沿触发器连在一起,就能保存多个Bit的数据了。
这里把8个组合在一起,就可以保存一个Byte的数据了。
它的名字就是寄存器。