时序逻辑电路
时序逻辑电路
时序逻辑电路的输出由当前时刻的输入和之前时刻的输入共同决定的逻辑电路。也就是说时序逻辑电路内部具有记忆性。其中时序逻辑电路有以下概念:
- 状态:用于解释电路未来所需要的信息
- 锁存器和触发器:用于存储1比特状态的模块
- 同步时序逻辑电路:一类由组合逻辑电路和一组电路状态的触发器所构成的电路
思考:时序逻辑电路的特征?
时序逻辑电路是按照一定输入和输出时序实现的功能电路模块,它具有记忆性,并且输出与输入之间具有反馈电路,如下图:
时序逻辑电路和组合逻辑电路最大的一个区别就是组合逻辑电路输入和输出之间没有反馈回路,即输出永远只能受输入影响。而在时序逻辑电路中输入和输出之间是可以有反馈电路的,这也就是说明在时序逻辑电路中,输出信号反过来是可以影响输入信号的。
存储电路状态的模块
电路中的状态会影响电路未来的行为,而下面是一些常见的可以存储电路状态的模块:
- 双稳态电路
- SR锁存器
- D锁存器
- D触发器
我们可以理解为触发器是锁存器的一个改良模块。那么接下来我们分别来详细了解一下各个存储电路状态的模块的具体功能实现。
双稳态电路(bistable)
首先双稳态电路是其他存储模块的基础,其他的存储电路状态的模块都是根据双稳态电路衍生而来的。如下图是常见的双稳态电路图:
我们可以看出双稳态电路有以下几个特点:
- 对称性:即电路总是对称的,有一个对称轴,对称轴两侧的电路元件相同
- 有两个输出:Q和
非Q
- 没有输入
我们分析一下双稳态电路是如何稳定存储电路的1比特状态的。首先我们知道电路理论上只有两种状态即1和0,因此我们想要Q和非Q
可以稳定存储这两个状态。那么假设此时Q存储的是0,那么很明显非Q
可以很稳定的存储1,并且反过来他又会影响Q的输入从而维持Q稳定存储0状态,因此两者相互影响从而实现稳定存储电路的0和1两个状态。同样的,假设Q存储的是1,那么不难看出此时非Q
也会稳定存储0状态。
因此双稳态电路可以稳定存储电路的0和1两种状态。但是我们发现双稳态电路存在一个缺陷,即改电路没有输入端,因此我们无法认为的控制电路中状态的存储,也就是说当一个双稳态电路模块在制作完成后就已经确定了两个输出端存储的电路状态了不能再改变,这很不好。
SR锁存器(Latch)
为了解决双稳态电路的这一缺陷,因此改良产生了SR锁存器,如下图:
此时就是在双稳态电路中加入了R和S两个输入端,同时门元件换成了或非门,因此在SR锁存器中:
- 总是存在两个输入端用来输入激励信号
- 两个输出端用来输出存储的电路状态
此时我们同样分析一下SR锁存器的功能实现,我们发现有以下四个不同的状态。
状态一:置位(SET)
当S=1,R=0时,那么此时SR锁存器的状态稳定为:
即Q永远存储的是1,而非Q
永远存储的是0,此时这种状态我们称之为置位。
状态二:复位(RESET)
当S=0,R=1时,那么,此时SR锁存器的状态稳定为:
即Q永远存储的是0,而非Q
永远存储的是1,此时这种状态我们称之为复位。
我们形象的记忆:首先SR锁存器的这两种状态输入端和对应的输出端信号状态总是相反的,同时S=1(SET=1)是置位,R=1(RESET=1)是复位。
状态三:保持态
当S=R=0时,那么次此时我们既没有置位,也没有复位,此时Q和非Q
的值会保持之前的状态。我们先看一下保持态的图:
我们不难看出当S=0,R=0时,上面的Q和非Q
的两种状态是都有可能出现的,那么何时出现的是左侧的图,何时出现的是右侧的电路状态呢?这取决于在保持态出现之前的状态,加入,保持态出现之前是置位态,那么切换到保持态时就会稳定成右侧的状态图,若保持态出现之前是复位态,那么切换到保持态后就会维持成左侧的状态图。因此保持态实际上就是时序逻辑电路中最能体现具有记忆性特点的状态。
状态四:非稳态
这种情况一般出现在S=R=1时出现,他是一种非稳态会导致输出端出现随机的状态,因此一般是避免的:
我们发现虽然S=R=1时确实电路状态维持成了Q=非Q
=1的状态,当时当切换成其他状态时就会出现Q和非Q
不可预测的情况。因此这种状态称为非稳态,他并不是指自身不能稳定,而是值切换到其他状态时会导致不稳定的输出状态,因此称为非稳态,一般我们要避免这种情况出现。
四个状态总结
- SR锁存器是一个基于双稳态电路衍生改良出现的可以存储1比特电路状态的功能模块,其中两个输入端S表示置位(Set),R表示复位(Reset)
- 通过控制S和R的信号输入,我们可以控制切换SR锁存器的输出稳定状态(这是比双稳态电路优秀的地方):
- Set置位:S=1,R=0->Q=1
- Reset复位:R=1,S=0->Q=0
- 保持:S=R=0->使Q和
非Q
维持保持态之前的状态 - 非稳态:S=R=1,禁止出现
上图是一个SR锁存器的状态波形图,他展示了输入不同的激励信号S和R后产生的状态切换过程。我们可以假设一开始初始状态为0,那么初始时S=R=0,也就是保持态,因此Q维持为初始态0,当S=1时,此时R=0,切换成为了置位态,因此Q变成了1,然后S又变成了0,那么此时又处于S=R=0的保持态,但是此时保持态会维持之前的置位态的输出,因此此时Q=1,然后R=1,此时S=0因此切换成了复位态,因此Q复位成0,然后R又变成了0,此时S=R=0,因此电路又变成了保持态,因此Q又维持复位态的输出,即Q=0。我们从上面的过程可以直观的感受到SR锁存器的强大的存储状态的功能,同时我们还可以看到上面的过程中总是保证了S和R只有一个为高电平,从而避免了非稳态的出现。
D锁存器
D锁存器同样是一种可以存储电路状态的功能模块,他的电路符号如下图:
D锁存器的特点是包含了两个输入端CLK和D,CLK控制存储器状态发生改变的时间,D是数据输入端,控制下一个状态的值。
实际上CLK可以更加形象的理解为使能端,当CLK=1时,那么Q跟随输入端D随时变化,即D锁存器此时可以看成是透明不存在的,此时就是一个组合逻辑电路的特点,输出随时跟随输入端变化, 但是当CLK=0时,那么Q就维持之前的状态,即类似于SR锁存器的保持态,此时输出端并不会跟随D改变,因此体现了“锁存”的特点,是时序逻辑电路具有记忆性特点的体现。其具体的功能实现:
我们不难看出实际上D锁存器是在SR锁存器的基础上进行改良的版本,他的主要优点是即实现了与SR锁存器相同的置位、复位、保持功能,同时还避免了非稳态的出现,更加安全。也就是此时D锁存器只有三个状态,没有了非稳态:
注意此时D同时实现了复位和置位两种状态,当D=1时实现的是与SR锁存器相同的置位功能,D=0时实现的就是与SR锁存器相同的复位功能,而CLK主要是用来切换保持态的。
我们同样可以分析一下他的波形图:
如上图,初始时CLK为0,因此此时是保持态,Q保持为初始态0,因此当D升为1以后由于此时CLK=0,因此是保持态,Q不会跟随D发生变化,当CLK变成1以后,D同时为1时,Q才会跟着变成1信号。
D触发器(Flip-flop)
D触发器实际上并没有相较于D锁存器有什么改进,因为D锁存器已经很完美了,D触发器只是另一种不同的状态切换方式的模块。D触发器的电路符号如下图:
注意D触发器和D锁存器的电路符号的区别,D触发器多了个下三角符号。为了更加明显的区分两者,使用右侧的符号更好。
D触发器的特点是包含两个输入端CLK和D,实际上和D锁存器一样。
但是D触发器的功能即状态切换与D锁存器不太一样,首先D触发器同样是有三个状态。但是只有在CLK的上升沿才会对D进行采样,即只有当CLK的信号从0到1的瞬间过程,Q被修改为当前时刻D的值,其他时刻Q都处于保持状态。也就是说Q只会在CLK上沿的时刻可能发生信号值的改变。
主从式D触发器的实现电路如下图:
可以看到D触发器是通过两个D锁存器实现的。两个D锁存器L1和L2顺序串联,同时有一组相反的时钟信号所控制。
- 当CLK=0时
- 主锁存器L1是透明的
- 从锁存器L2是不透明的
- 因此N1跟随D发生变化,但是Q和
非Q
不会跟随N1变化
- 当CLK=1时
- 主锁存器L1是不透明的
- 从锁存器L2是透明的
- 从锁存器的状态跟随N1变化,即此时N1不跟随D变化,但是Q和
非Q
会跟随N1变化
- 因此一个完整的Q跟随D变化实际上是上面两个过程的结合体,也就是在时钟的上升沿(CLK从0->1)时刻,完成一次Q被D赋值的功能
同样的我们分析一下他的状态波形图:
起初CLK是0,因此是保持态,即Q(触发器)此时是初始态1,而当CLK处于第一次上升沿时由于此时D=0,而Q(触发器)处于1与D不同,因此Q(触发器)变成0,而Q(锁存器)同样也变成0是因为最终CLK会处于1状态,那么Q(锁存器)就可以更改Q跟随D取值。但是当CLK还保持为1的同时,D变成1的时候我们可以看到此时D触发器和D锁存器的输出端发生了不同的情况,对于Q(触发器)由于此时CLK=1,因此Q还可以跟随D变化,因此Q(锁存器)变成了与D相同的1状态,但是此时触发器由于CLK一直稳定为状态1而不是上升沿,因此此时Q(触发器)不发生变化还维持0。因此我们可以总结出D锁存器和D触发器还是有区别的,即D触发器中CLK=0或是CLK=1时都是保持态,这是和D触发器最大的不同。
寄存器
寄存器可以存储CPU暂时不需要的信息,那么寄存器是如何实现的呢?实际上一个N为寄存器就是由一个共享的CLK输入和N个D触发器组成的,如下图:
由于此时N个D触发器共享一个CLK,因此寄存器的N个D触发器肯定是同时更新数据的,并且只有在CLK处于上升沿的时候才能更新数据,寄存器的所有位同时被更新,这是大多数时序逻辑电路中的关键组件。
思考:为什么寄存器要设置成N个D触发器共享一个CLK?
我们知道寄存器一般存储的是一个N为二进制数据,那么很明显这个数据是一次性存储到寄存器中的,因此数据的每一位同时存储到寄存器的一个D触发器当中。
带使能端的D触发器
实际上就是在D触发器的基础上有添加了一个使能端EN如下图:
使能端EN是用来控制D是否能被触发器存储的,此时功能是:
- EN=1时且在时钟上升沿时,Q才能被更新为当前D的值
- EN=0时即使时钟处于上升沿,Q也不能更新为D的值
因此只是相较于D触发器又增加了一个条件使得Q更新为D值的条件更加苛刻了。
带复位功能的D触发器
我们思考一个问题,前面我们学习D触发器的时候,学习到D=0且CLK处于上升沿时可以将Q置位0,即类似于SR锁存器的复位功能,但是我们发现D触发器想实现这个功能条件过于严苛了,需要同时满足D=0且CLK处于上升沿,我们想改进为D=1时也可以对Q进行恢复为0的复位功能,此时就产生了带复位功能的D触发器。如下图:
此时Reset=1时,那么无论D是何值,都可以将Q强制设置为0,Reset=0是就是正常的D触发器,此时我们又可以将带复位功能的D触发器分类为同步复位和异步复位:
- 同步复位:只在CLK处于上升沿时可以进行复位
- 异步复位:只要Reset信号为1有效,那么无论CLK是否处于上升沿都可以进行复位
带置位功能的D触发器
同样的,我们也可以类比得到带置位功能的D触发器:
当Set=1时无论D取何值,Q都被强制设置为1,当Set=0时D触发器正常工作。同样的也有同步置位和异步置位的区分。
非稳态电路
非稳态电路是一种特殊的时序逻辑电路,他的特点是输出端不稳定,会发生周期性的翻转变化,如下图是一个非稳态电路:
此时这个电路是一个具有回路的,且输出端会反馈到输入端的时序逻辑电路,我们分析一下可以轻松的发现输出结果会发生周期性的翻转变化,即X,Y,Z不断的在0和1信号之间切换,此时他们的波形图是:
上面的这种非稳态电路可以应用为环形振荡器。
同步时序电路
对于上面的这种非稳态的时序逻辑电路,我们在信号传播的途径中插入寄存器来断开电路中的环路,此时就会使得电路变成一个组合逻辑电路和寄存器的集合体,也就是同步时序逻辑电路。他的特点是:
- 寄存器包含着系统的下一个要切换的状态
- 状态仅在时钟边沿(注意上升沿或者下降沿都可以)到达发生变化,也就是状态同步于时钟信号
- 如果时钟足够慢,使得在下一个时钟沿到达之前,输入到寄存器的信号都可以稳定下来,那么所有的冒险都将会被消除
- 一个同步时序电路包含一组有限的离散状态{S0,S1,…,Sk-1}
- 同步时序电路有一个时钟输入
- 上升沿表示电路状态转变发生的时间,其中涉及到两个状态
- 现态:当前系统的状态
- 次态:下一个时钟沿后系统将进入的状态
同步时序逻辑电路的功能主要是描述当前状态和输入的各种组合对应的下一个状态与输出的电路,他需要明确建立时间和保持时间。这样每隔一个CLK就会自动切换到下一个给定输入所对应的输出状态。组成一个同步时序逻辑电路需要满足以下规则:
- 电路中的模块或者是寄存器或者是组合逻辑电路
- 模块中应该至少包含一个寄存器
- 所有的寄存器都共用一个时钟信号
- 电路的每个环路中至少包含一个寄存器
其中常见的两个同步时序逻辑电路是有限状态机(FSM)和流水线
下面我们看一下一个最简单的同步时序逻辑电路模块:
一个D触发器本身实际上就是一个最简单的同步时序逻辑电路,它包含一个输入D,一个时钟信号CLK和一个输出Q,同时也具有两个离散的不同状态{0,1},并且D触发器下一个状态就是D,Q就是当前状态,,而D触发器本身就是一个寄存器。
思考:下列哪些电路是同步时序电路?
对于上面的CL
符号表示逻辑电路,因此上面的这些电路模块中,只有4,5是同步时序电路,其他的模块之所以不是同步时序逻辑电路的原因是:
- 1:就是一个组合逻辑电路,肯定不是时序逻辑电路更不是同步时序逻辑电路
- 3:注意那个不是D触发器,而是D锁存器,所以不是
- 6:没有D触发器
- 7:如果三个clk是共享一个时钟沿那么就是同步时序逻辑,否则就不是
所以同步时序逻辑电路就是一个在组合逻辑电路基础上增加了记忆组件触发器的电路系统,并且还要求所有的触发器的时钟沿共享一个时钟输入。正式由于拥有了记忆组件D触发器,才能实现时序逻辑的当前输出由当前输入和以前输入共同决定的特点。
思考:时序逻辑电路到底有没有回路?
都可以,有没有回路都是可以的,只是有回路时更加复杂,此时的时序逻辑电路不仅输出由当前输入与以前输入决定,而且当前输入也由当前的输入与之前的输出共同决定。只要有组合逻辑电路+D触发器那么就是一个时序逻辑电路。当所有clk共享一个时钟输入时就是同步时序逻辑电路,否则就是异步时序逻辑电路。
异步时序电路
非同步时序电路就是异步时序电路,很明显异步时序电路并不需要在特定的CLK变化沿时才可以切换电路状态,而是只要满足条件就可以切换。这种系统的时序不受时钟控制的寄存器所约束的异步时序电路实际上在实际应用中更加广泛。但是实际生活中,所有的系统本质上都是同步的,因为同步时序电路比异步时序电路更容易设计实现,最典型的就是CPU中切换线程时的RR(时间片轮转方法)。虽然不是最优情况,但是在最低的实现成本情况下可以实现较优的策略。