D 触发器的原理
在前面介绍了一种特殊的锁存器, 它不是由电平的高低去触发存储的动作, 而是在电平的跳变中才触发了存储的动作, 而当控制端保持高电平或低电平不变时, 便不再触发存储.
这样一个特性正好解决了之前面临的问题, 那么, 这种特性背后的原理是什么呢? 为什么它只在电平跳变时才会触发呢?
回到电平触发的锁存器上, 我们知道它是由一个传输门所控制的, 具体依赖于与门的特性.
当与门其中一个控制端处于高电平时, 与门的另一个输出端的信号才能出现在输出端, 这点我们已经很清楚.
但哪里才能找这种支持跳变特性的传输门呢?
现有的传输门只能是高电平通过, 当然了, 稍作调整, 在控制端前置一个非门, 它也可以是低电平通过.
带传输门控制的锁存器 反向 在线可互动操作示例
但本质上还是一个道理.
现在仔细分析下跳变通过的特性, 具体就以前面所看到的这个为例吧, 它在由低电平变为高电平时触发, 换言之, 它的触发包含两个条件:
既要有低电平, 又要有高电平.
而目前我们所知的传输门, 经上面分析, 要么高电平通过, 要么低电平通过, 不存在既低又高的, 这样的情况不可能同时存在在同一个门中, 那唯一的可能, 说明这里面不止一道门! 而是两道门!
然后其中一道用低电平打开, 另一道则用高电平打开!
另外, 单纯处在低电平和高电平下都无法通过, 说明这两扇门是不可能同时打开或关闭的.
只能是要么这个打开, 那个关闭; 要么是那个打开, 这个关闭, 状态总是相反的.
可如果总是有个门是关闭的, 那是否意味着始终无法通过呢?
其实现实中, 如果你了解多级船闸的原理, 它的门始终有一个关闭:
但为啥船还是通过了呢? 相信你看了上面的动图演示也就明白了.
首先两个门之间是有间隔而不是紧挨着的, 船可以在中间停留; 另外船不是一下子通过的, 而是以走走停停的方式通过.
现实中是否有这种场景我不清楚, 但小时候曾经玩过的一个游戏<<魂斗罗>>中曾经有这样的场景:
如果你第一次通过这样的关卡, 这种交替的爪子简直令人抓狂, 你想一口气冲过去是不可能的.
这种交替的爪子其实就类似于始终有一扇关闭的门, 这也意味着需要分阶段通过. 要把握好节奏, 看准时机一次通过一扇门, 一走一停, 走走停停, 最终就都通过了.
那回到触发器控制的设计上, 思路就比较清晰了.
我们需要两个D锁存器, 因为中间阶段也要保存信号, 所以只用两个传输门是不行的;
此外这两个锁存器的通过控制必须一个是低电平通过(带反相器), 另一个是高电平通过.
然后它们需要串联起来, 因为要让信号一步一步通过. 因此要把其中一个锁存器的输出 DO 接到另一个锁存器的 DI 输入上.
因为要让低电平时先通过第一个门, 所以我们把低电平通过锁存器放在前头, 高电平通过的则放在后头.
最后, 让我们一步一步分析下信号是怎样穿过这两个数据锁存器的.
在数据端置入高电平, 一开始, 控制端是低电平, 经反向变高电平, 因此第一个锁存器是通的, 信号通过第一个锁存器被保存下来.
而此时第二个锁存器是不通的, 因此信号无法进一步进入到最终的输出端, 只能停留在中间, 就像船在两个船闸门之间停留一样.
接着, 控制端由低电平变为高电平(上升沿), 此时第一个传输门关闭, 而随着第二个锁存器通道打开, 第一个锁存器的输出信号 DO1 通过第二个锁存器输入进来并被锁存到最终的输出端 DO2:
因此, 在经历了一个从低电平到高电平的上升沿触发后, 信号依次通过两级串联的锁存器后最终到达了输出端.
之后, 哪怕这个输出信号经过反馈又回到输入端, 并引发了新的信号变化, 但由于此刻第一个锁存器通道是关闭的, 信号无法继续通过. 连续的反馈因此被打断了.
如上, 把输入端改为低电平, 但因为第一个锁存器最终进来的控制信号是低电平, 所以这个低电平的数据输入是不会被保存的, 尽管控制端目前还是高电平.
而当把控制端再改为低电平呢?
级联的锁存器 在线可互动操作示例
可以看到, 这时数据端的低电平确实被保存到了第一个锁存器中, 但由于此刻第二个锁存器的控制端又是低电平, 该低电平输入信号无法通过第二个锁存器.
其实又是回到了类似开头的状态, 而要想最终保存这个新的低电平输入信号, 只能是再经历一轮上升沿变化!
由此, 反馈信号完全被我们掌控, 只能在我们的控制下一步一步的前进.
所以这就是上升沿触发的触发器的原理了, 英文名为 flip-flop. 需要反复的上升沿信号才能驱动它不断工作, 有点像大蛤蟆, 一戳一蹦跶.
又像我们的心跳一样. 到后面, 这个滴答(tick-toke)其实就是时钟信号, 所谓的计算就是在这种 tick-toke, tick-toke 的驱动下进行, 所谓的 CPU 的主频其实就是这个滴答信号的频率.
在之前累加器的控制端上接入方波信号, 我们就可以得到一个计数器.
时钟源驱动的仿计数器 在线可互动操作示例
时钟源可以通过 "菜单--绘制--输入和电源--添加时钟源" 方式添加.
在下方的示波器中可看到 CLK 时钟源不断跳动产生了一系列方波信号, 每一次方波信号从低电平跳变到高电平, 都会驱动触发器锁存一次结果并反馈回加法器的另一端.
方波信号免去了手动不断点击开关的麻烦, 而且它产生的每个方波信号的间隔也是相对固定的, 具有良好的周期性.
加法器的一个输入端固定置入了数字 1, 所以整体效果就是不断累加这个 1, 形成一个计数的效果.
另: LED 数码管是支持 16 进制显示的, 所以结果会一直加到 F(15) 再回到 0.
当然, 这跟累加还不太一样, 计数类似于累加, 但它每次只能加一.
真正的计数器也无需这么复杂, 我们将在后面再介绍计数器的另一种简洁实现.
目前来讲, 我们离最终的自动计算还挺远的. 现在电路可以在我们受控驱动下前进, 累加的和也不需要我们手动转设到输入端.
但另一个输入端上, 还是要手动地把一个一个数设置上去, 否则就只能固定的累加同一个数.
我们仍然需要注意操作的顺序, 比如要在设置好数之后, 才切换一次控制开关, 否则则会把同一个数多加一次.
为避免在计算过程中去反复设置加数, 可以考虑多个上述的4位触发器组合在一起. 但设置好后, 又如何一个一个的把它们依次取出来呢?
这需要我们先读取第一个, 再读取第二个, 之后是第三个...
过程中其实就隐含了计数的需求, 因此, 在下一章节, 我们先来探讨一下计数器的实现.