前面在制作CPU时钟时,介绍了SR触发器。本来触发器与锁存器应该在这里介绍,但之前NE555芯片中有使用到SR触发器,所以就提前讲了一下,这一章我们继续将D锁存器与D触发器。

在最开始介绍SR触发器时,我有提到过,锁存器和触发器可以用于存储1bit数据。这一章要介绍的D锁存器与D触发器就是用来存储数据的,实际上D就是Data的缩写。

改进SR触发器

在正式介绍D锁存器和D触发器以前,我们先来回顾一下前面提到的SR触发器:

SR触发器

我们知道,SR触发器的两个输入分别表示SET和RESET,其中SET端输入高电平,则输出Q为高电平,反Q输出低电平,如果RESET端输入高电平,则Q输出高电平,反Q输出低电平。

但是如果在某些时候,我们不希望SR触发器的状态发生变化,那么我们可以给SR触发器增加一根引脚用于激活触发器,我们可以称其为enable引脚。

我们基于SR触发器,修改电路为如下:

带激活引脚的SR触发器

经过改造的SR触发器,只有在中间的引脚(也就是激活引脚)为高电平时,才会修改触发器状态,否则不管S引脚和R引脚的输入如何,都不会有状态改变,这样我们就能根据需要来锁定SR触发器的状态了。

不过这个电路还有一些问题,众所周知,SR触发器仅在S引脚和R引脚的输入不同时生效,也就是说,当S引脚或R引脚同时输入高电平时,SR触发器会处于一个错误状态,Q和反Q都输出低电平。如果S引脚和R引脚同时输入低电平,则SR触发器状态不发生改变。所以实际上,我们在使用到SR触发器时,S和R的输入应该始终相反的,这样我们可以尝试通过逻辑电路,将两个引脚合并成一个引脚,并使得两个引脚得到的电平状态相反,改造后的电路如下:

改造后的带激活引脚的SR触发器

D锁存器

实际上,经过我们两次改造后得到的电路图就是D锁存器的原理图。

正如上图所示一样,D锁存器也有两个输入和两个输出,其中,输入引脚为D(Data)引脚和激活引脚,输出为Q和反Q。只有当激活引脚输入高电平时,D锁存器的状态才会随着D引脚的输入而改变。当激活引脚处于低电平状态时,D锁存器会锁定输出状态,直到下一次激活引脚激活,输出再随输入状态而改变。

其逻辑图如下:

D锁存器

正如上面所述,D锁存器的输入和输出的电平变化为如下情况:

随便画的,将就看,能理解意思就行...

顺便说一句,用红色线拉通的表示发生在同一时刻(即使它看起来并不是在同一时刻)。

D触发器

实际上在CPU当中,我们一般会使用心跳信号(也就是我们之前完成的CPU脉冲输出的信号)来代替激活引脚,当心跳信号拉高的一瞬间,改变D锁存器的状态。

如下:

D触发器电平变化

正如上图所示,无论心跳电平和数据电平变化情况如何,输出Q的状态只会在心跳电压升高的一瞬间,根据D在那一时刻的状态发生改变(也就是所谓的边沿触发)。

我们可以根据D锁存器进行改造得到D触发器。总所周知,D锁存器的Q引脚如果想要发生改变,必需在激活引脚为高电平时,也就是说,如果我们想实现D触发器的功能,我们需要在心跳信号电平拉高的一瞬间,给激活引脚一个极短时间的高电平,让D锁存器改变状态。

用上面的图举个例子,如下:

D触发器与D锁存器电平状态

实际上激活引脚拉高电平的时间更短,一般来说也就几ns,不过太短了不好画,所以画成现在这个样子,能理解原理就行...

实际上有很多方法实现在电压拉高的一瞬间来给激活引脚提供一个高电平,一个比较简单的方法是使用AND门与NOT门相连接,如下:

基于逻辑门的脉冲发生器

不过一般来说,只用一组可能延迟时间不够,需要用到多组串联,如图下面的电路,一般可能需要串联3到5个。

还有一种方法,使用电阻和电容,利用电容的充放电时间来调整脉冲发生时间。这个我就不放原理图了,很简单,可以自行尝试一下。

使用1个D触发器,我们就可以存储1bit数据,所以后面我们每搭建一个8位寄存器,就会用到8个D触发器。


学而不思则罔,思而不学则殆