第14章:反馈与触发器
Last updated
Last updated
观察如下一个电路:
当我们闭合开关,会在以下两种情况中不断振荡:
事实上,振荡器相当于将一个反向器输入端与输出端相接。我们可以符号化为:
振荡器在电路中会进行以一定频率在0和1之间变化,因此其又常常被称为时钟(clock)。
我们将两个或非门相连,每一个的输入都成为另一个的输出。
我们考虑以下四种情况:
只闭合上面的开关
将上面闭合的开关断开
只闭合下面的开关
将下面闭合的开关断开
注意到在开关都处于断开的状态下,灯泡有0和1两种状态,取决于最近闭合的是哪一个开关,也就是说,触发器能够记住最近的闭合信息。
这种触发器又被称为R-S(Reset-Set, 复位/置位)触发器,我们通常这样绘制电路图:
我们将输出端表示为和,注意二者互反,也就是说如果R和S同时取1是无意义的。我们希望用表示刚刚的操作是将S设置为1,用表示刚刚的操作是将R设置为1。
在R-S触发器的基础上,我们设置一个保持位(Hold That Bit),以及一个数据输入端,我们称之为电平触发的D-型触发器 (level-triggered D-type flip-flop),如下图所示:
在保持位为0时,无论数据端为0(上图),还是数据端为1(下图),都对电路没有任何影响。
但是在保持位为1时,数据端的输出会对电路产生影响:
如果此时再断开保持位,则数据端又不会影响到电路,同时输出端会记录下上一次保持位为1时数据端的输入(下图)。
如果将保持位改成一个振荡器,我们就能够周期性的储存数据,即一个电平触发的D-型锁存器level-triggered D-type latch。
我们希望利用更好的实现多次加法,而不是每次都将上一次的结果重新手动输入到加法器中。因此我们需要一种方式将锁存器和加法器的输入端相连接:
其中8位锁存器的时钟端是由save开关手动控制的,2-1选择器则是下面的结构:
我们在此基础上进行优化。首先我们在锁存器上设置一个清零开关,当清零开关打开的时候,锁存器将会处于全0的状态:
改进后的多次加法器为:
我们先闭合再断开清零开关,然后输入加法器的第一个加数,并闭合相加开关,第一个加数就会被保存到锁存器中。之后再输入第二个加数,再次闭合相加开关,所得的和就会显示在与锁存器相连的灯泡上。
注意到上述结构的一个重要的问题是,一旦闭合开关我们就很难将加法停止下来。也就是说,手动再次输入加数仅仅存在于理论上。我们将通过引入边沿触发时钟输入来解决这一问题。
边沿触发的D-型触发器由两级R-S触发器组成:
只要时钟输入为0,无论怎么变化数据端,结果都是。但是注意到数据端不同的值,使得电路中的电流路径不同。
如果我们此时将时钟端输入更改为1,那么最终的输出端结果就与数据端一致(时钟输入在0时,不同的数据端输入影响电流路径,在时钟端输入变为1时,这一路径不同会影响到最终的输出)。
注意到当我们保持时钟端输入为1不变时,数据端的变化同样不会影响到输出(下图)。也就是说,只有时钟端从0变为1时,输出端才会反映出数据端的输入。
将清零功能引入,我们同时再引入预置(preset)来实现与清零相反的操作。下图所示的就是一个更复杂,功能更全面的边沿触发的D-型触发器。
显然,通过将边沿触发的D-型触发器替换原来的锁存器,我们就能够真正实现多次加法的运算。
我们将振荡器与边沿触发的D-型触发器相连接,并将端与数据端相连,我们将这种结构称为分频器:
注意到如果开始D和均为1,则时钟端一次从0到1时,会使得Q端变1,从而和D端都变为0,当下一次时钟端一次从0到1时,会使得Q端变为0。这一规律可以被表示为:
即Q端输出的变化频率是振荡器的一半,也就是分频器名字的由来。我们将多个分频器相连,并将每个输出端都接上灯泡,那么随着时间的变化,信号的变化应该与下图所示相同:
如果将从上到下分别看做是低位到高位,那么我们就实现了一个二进制计数器的功能。我们将其称为行波计数器(Ripple Counter)。