组合逻辑与时序逻辑

我们如何定义组合逻辑和时序逻辑?

  • 组合逻辑 (Combinational Logic) :输出只由当前输入决定,电路没有存储单元;
  • 时序逻辑 (Sequential Logic) :输出由当前输入和以前的输入(电路状态)决定,用来实现需要若干步骤问题的解决,同时电路中需要存储元件来保存以前输入形成的结果。典型例子便是状态机。

对于时序逻辑,我们又可以分为两类:

  • 异步(Asynchronous)时序电路:没有时钟,存储单元输出的变化由输入信号决定
  • 同步(Synchronous)时序电路:统一的时钟,存储单元输出的变化在时钟沿发生

这两类对应两种状态机:Mealy和Moore。

  • 输出和当前状态及输入有关,则称为米利(Mealy)状态机
  • 输出只和当前状态有关,则称为摩尔(Moore)状态机

双稳态电路

交叉耦合的反相器对可以构成一个双稳态电路。本质上是一个正反馈。

双稳态电路

能量越低越稳定,因此中间的交叉点处是非稳态。只要有一点扰动,电压就会变化到1或者0,所以中间的交叉点是非稳态。

为了改变电路保存的状态,我们可以:

  1. 使用驱动强度更强的电路(强行覆盖)
  2. 断开反馈回路(打破正反馈)

SR锁存器

何为SR?

  • S:Set,置位
  • R:Reset,复位

普通型

SR锁存器分为两种:基于NOR的与基于NAND的。前者高有效,后者低有效。

两种SR锁存器都存在无效/禁止状态。前者为11无效,后者为00无效!

换言之,你不能“既要又要”:两个输入端最多只有一个能被使能。

钟控型

经过修改,我们让SR锁存器也能被时钟控制:

注意到与非 = 非或,因此OAI逻辑将与非门换为非或门,因此输入为低电平有效。

钟控JK锁存器与主从触发器

钟控JK锁存器

JK触发器的名称来源不明。 —— WikiPedia

Jump-Key Flip-flop. —— 老师

Jack Kilby 发明。—— Google

扑克牌中的J是侍从,K是国王,像极了一主一从的JK触发器。 —— 百度知道

JK触发器的原理图

SR锁存器中,我们提到:两种SR锁存器都存在禁止状态,即两个输入端均使能的状态。NAND门的SR锁存器为低有效,因此禁止两个端均输入0。我们对其进行修改,在输入端接入与非门,这就是JK锁存器。

JK锁存器的真值表

很显然,JK锁存器并没有禁止的输入状态,但它存在一个问题。如果输入均为1,在时钟高电平时,会发生什么?

看一看这一张图。如果输入均为1,会变成三个反相器头尾相连的状态。反相器的个数为奇数,形成了一个振荡器。因此,电路是不稳定的。为了不产生振荡,必须使CK的高电平时间小于JK锁存器从输入到输出的延时。但这样做会导致时钟频率太高,对数字电路设计是难以实现的。

和上面的SR锁存器原理类似,采用AOI门实现的钟控JK锁存器只需要16个晶体管,而NAND逻辑实现的则需要20个晶体管!

用AOI门实现的钟控JK锁存器CMOS电路

主从触发器

我们如何解决上面提到的震荡问题?采用主从结构即可。

主从触发器的组成

两个触发器接入反相的时钟信号。在同一个时钟作用下,因控制两个锁存器的时钟反相,一定有一个锁存器是保持数据状态,因此输入不可能直接到达输出,这样避免了震荡的产生。接回主触发器的与非门的输入端的是从触发器的输出端,因此不会出现反相器链的情况!

主从JK触发器的波形图

D锁存器与D触发器

D锁存器

我们将钟控SR锁存器的输入端加以改造,让它们始终反相,这样子就不会出现振荡的情况了。

D锁存器结构图
  • CK=1时,D传输给S,D非传输给R,使Q=D,此时D触发器跟随输入;
  • CK=0时,S=0,R=0,SR触发器处于保持状态,保持输出不变,此时D触发器保持输出。

使用AOI逻辑的话,D锁存器需要14个晶体管,没有不允许的输入状态,输出也不会振荡。

基于传输门与反相器的D锁存器

使用传输门,我们也能实现D锁存器:

基于传输门的D锁存器

基于C2MOS的D锁存器

C2MOS (Clock CMOS),时钟控制CMOS逻辑,中间由反相时钟信号控制。

基于C2MOS的D锁存器

时间参数

  • 建立时间 tsetup :输入信号D在时钟跳变沿之前,要保持稳定不变最短时间
  • 保持时间 thold :输入信号D在时钟跳变沿之后,要保持稳定不变最短时间
  • 输出延时 tclk2Q :从时钟跳变沿Q的值稳定的时间

边沿触发的D触发器

基于传输门的D触发器

和主从JK触发器类似,我们将两个D触发器级联,并用反相时钟控制,得到边沿触发的主从D触发器。

主从D触发器
  • 当CLK=0时,Master跟随输入D,Slave处于保持状态,保存的是上一次采样到的D,输入信号D的变化不影响输出Qs
  • 当CLK=1时,Master处于保持状态,保存住当前输入的D,Slave处于跟随状态,Qs跟随Qm的变化

该D触发器在CLK的上升沿将输入数据D传输到Qs!

基于C2MOS的主从D触发器

时间参数

D触发器的时间参数
  • 建立时间 tsetup :CLK=0时,TG1和TG4导通,TG2和TG3截止。当传输门TG2打开时,要求TG2两边的数据必须是一致的。否则Master在CLK上升沿锁存下来的数据可能就会出错。出错的原因是TG2两边数据不一致产生的竞争。这就要求数据从D输入,要一直传递到Qm后,TG2才能导通。
    数据从TG1到Qm的延时时间就是D触发器的建立时间。
  • 输出延时 tc2q :TG3导通时,数据从Qm传输到Qs的延时。
  • 保持时间 thold :当CLK上升沿后,TG1截止,D的变化不会影响Master锁存的数据,因此该CMOS D触发器的保持时间为0

各种各样的D触发器

为什么复位用或非门,置位用与非门?

因为复位需要让输出为0,或非门“有1就是0”,因此或非门易于复位;

而置位需要让输出为1,与非门“有0就是1”,因此与非门易于置位。

带置位和复位端的D触发器

24年PPT新增内容

带置位和复位的主从D触发器

复杂的时序计算

必考。理清锁存器与触发器的时序分析方法,分清各种延时时间的名称。

时序电路时间参数

  • 传输延时:输入端信号开始变化到输出端信号稳定所需要的时间
  • 污染延时:输入端信号开始变化到输出端信号开始变化所需要的时间
  • 建立时间:上升沿到来,输入端数据需要保持稳定的最小时间
  • 保持时间:上升沿到来,输入端数据需要保持稳定的最小时间
简写 含义
tpd 组合逻辑 传输延时
tcd 组合逻辑 污染延时
tpcq Latch/Flop Clk-Q 传输延时
tccq Latch/Flop Clk-Q 污染延时
tpdq Latch D-Q 传输延时
tcdq Latch D-Q 污染延时
tsetup Latch/Flop 建立时间
thold Latch/Flop 保持时间
D锁存器和D触发器的时序波形

输出延时与建立延时之和被称为时序逻辑的时间开销!

衡量触发器的性能指标:tpcq+tsetup。值越小说明触发器性能越高。

24年PPT修改内容

建立时间和保持时间确定。注意建立时间的正确图像。

触发器

最大传输延时

触发器最大延时

对于触发器来说,数据在每个时钟上升沿才能传递。在Q1传入数据给组合逻辑之后,一个时钟周期内要组合逻辑完成运算并输出。

因此,从上一个时钟上升沿算起,数据从D触发器的Clk端到达Q端的传输延迟为tpcq,之后交给组合逻辑运算,组合逻辑的传输延时为tpd。运算完成后,要保持一段时间,满足下一个D触发器的建立时间tsetup,即下一个时钟上升沿到来之前。

因此,总的时间要求为:

tpdTc(tsetup+tpcq)t_{pd}\leqslant T_c-(t_{setup}+t_{pcq})

最小污染延时

触发器最小延时

如果两个触发器中间的组合逻辑延时很短呢?上一个触发器的数据经过很短的时间就会送到下一个触发器的输入端。这会带来什么问题?

如果组合逻辑运算时间太短,两个触发器受到同一个时钟沿控制,组合逻辑的污染延时使得输出不稳定,有可能不满足下一个触发器的保持时间要求!

从上一个触发器接收到时钟上升沿开始算起,触发器从Clk端到达Q端的污染延时为tccq,此时第一个触发器输出开始不稳定;随后,要经过tcd即组合逻辑污染延时之后,输出才稳定。因此,组合逻辑的输出D2应当大于触发器的保持时间。

为了满足保持时间的要求:

thold<tccq+tcdt_{hold}\lt t_{ccq}+t_{cd}

我们不妨再举一个更极端的例子:如果触发器背靠背会怎么样?

显然,此时的组合逻辑污染延时没了,表达式变为thold<tccqt_{hold}\lt t_{ccq}

因此,如果通过触发器的污染延时很小,就必须在两个触发器之间插入缓冲器增加延时;如果触发器的污染延时大于保持时间,就可以放心的背靠背使用触发器。

扫描链的使用就是个背靠背触发器的例子!说白了就是个移位寄存器。

两相锁存器

最大传输延时

两相锁存器最大延时

对于两相锁存器,它们分别受不同的时钟控制,但每个时钟的时钟周期是相同的。而且,数据不需要严格与时钟周期对齐,因为运算环节可以在其他时钟周期中完成。不妨假设L1与L3是一个时钟控制,因此要在一个时钟周期内完成运算。

在数据经过第一个锁存器后,需要从输入到输出的传输延时tpdq1,再经过第一个组合逻辑运算延时tpd1,随后在第二相时钟的高电平期间将数据送到下一个组合逻辑内进行处理;第二个组合逻辑运算完毕后,在第一相时钟的高电平前运算完毕并保持,以便在时钟高电平到来时将数据送出。

因此,总的时间应当满足:

tpd1+tpd2Tctpdq1tpdq2=Tc2tpdq\begin{aligned} t_{pd1}+t_{pd2}&\leqslant T_c-t_{pdq1}-t_{pdq2}\\ &=T_c-2\sdot t_{pdq} \end{aligned}

最小污染延时

考虑时钟交叠的两相锁存器最小延时

对于两相锁存器,时钟是错位的。我们将第二相时钟的下降沿与第一相时钟的上升沿之间的时间称为非交叠时间tnonoverlap

对于锁存器来说,在时钟下降沿之后,输入端数据仍需要保持一段时间。因此,对于第二个锁存器,在第二相的下降沿之后,保持时间thold内数据不能发生变化,即一个锁存器污染tccq后输出的数据被组合逻辑处理,经过污染延时tcd后在保持时间之后变化。

因此,满足的时序条件为:

tholdtnonoverlap+tccq+tcdt_{hold}\leqslant t_{nonoverlap}+t_{ccq}+t_{cd}

综上,只要时钟不交叠时间足够大,就可以避免保持时间失效。

但在高速设计中,产生和分布不交叠时钟是很困难的。大部分商用的基于透明锁存器的系统使用一个时钟及其反相互补钟,这使得tnonoverlap=0,此时污染延时的约束条件在锁存器和触发器系统两者是一样的。

时间借用

让我们来对比一下基于触发器和基于锁存器的系统:

  • 基于触发器的系统:
    • 数据在前一个触发器时钟的第一个上升沿送出
    • 在下一个上升沿之前的建立时间必须到达第二个触发器
    • 如果数据到晚了,系统错误
    • 如果数据到早了,时间浪费了
    • 触发器有严格固定的沿,因此无法进行时间借用
  • 基于锁存器的系统:
    • 当锁存器透明时数据可以穿透过去
    • 每个循环只要在一个周期内完成
    • 延时长的逻辑电路可以向下一级锁存器借用时间
时间借用例子,注意第二级输出反馈回第一个组合逻辑的情况

对于组合逻辑的计算,我们只需要让其在第二相时钟的高电平期间完成,即可透过第二个锁存器将数据传出:

最大借用时间的计算

因此,最大的借用时间为:

tborrowTc2(tsetup+tnonoverlap)t_{borrow} \leqslant \frac{T_c}{2} - (t_{setup} + t_{nonoverlap})

时钟偏斜

理想情况下,每一个时钟都是对齐的,此时我们称“时钟偏斜为0。”

然而,真正的时钟到达时具有不确定性。时钟偏斜(skew)减小了最大传输延时、增大了最小污染延时,并减小借用时间。

触发器

时钟偏斜情况下的触发器最大延时

如图,则最大传输延时的表达式变为:

tpdTc(tpcq+tsetup+tskew)sequencing  overheadt_{pd} \leqslant T_c - \underbrace{\left( t_{pcq} + t_{setup} + t_{skew} \right)}_{\text{sequencing \ overhead}}

注意时钟偏斜是前后都有可能,因此应当计算允许的最大延时的最小值,因此要在原来的基础上减去时钟偏斜的时间。

时钟偏斜情况下的触发器最小延时

同样,对于最小污染延时,应当计算允许的最小延时的最大值:

tcdtholdtccq+tskewt_{cd} \geqslant t_{hold} - t_{ccq} + t_{skew}

两相锁存器

时钟偏斜情况下的两相锁存器最大延时

我们观察时钟偏斜影响下的两相锁存器最大传输延时。发现了什么?

因为两相时钟的偏斜是同步的,信号可以有完整的透明周期到达L3,因此最大传输延时不受影响

tpdTc  (2tpdq)  sequencing  overheadt_{pd} \leqslant T_c - \underbrace{\ \ (2t_{pdq})\ \ }_{\text{sequencing \ overhead}}

锁存器是容许时钟偏斜的。

保持时间则因为时钟偏斜而上升:

时钟偏斜情况下的两相锁存器保持时间

tcd,1,tcd,2(tholdtccqtnonoverlap+tskew)t_{cd,1}, t_{cd,2} \geqslant \left(t_{hold} - t_{ccq} - t_{nonoverlap} + t_{skew}\right)

对于借用时间,因为时钟偏斜的存在,可认为第二相时钟的高电平时间比之前缩短了一个tskew

时钟偏斜情况下的两相锁存器最大借用时间

因此,最大借用时间变为:

tborrowTc2(tsetup+tnonoverlap+tskew)t_{borrow} \leqslant \frac{T_c}{2} - \left(t_{setup} + t_{nonoverlap} + t_{skew}\right)

时钟偏斜会使最大传输延时变小,使最小污染延时变大!

单级的时序计算例子

多看,大概率会考。

非常复杂的时序逻辑分析题
答案

对于组合逻辑最大传输延时:

  1. 没有时钟偏斜与时间借用时:
    1. D触发器:500-50-65=385ps
    2. 两相锁存器:500-2x40=420ps
  2. 存在50ps的时钟偏斜时:
    1. D触发器:500-50-65-50=335ps
    2. 两相锁存器:500-2x40=420ps(锁存器系统对时钟偏斜是透明的)
答案

对于组合逻辑最小污染延时:

  1. 没有时钟偏斜与时间借用时:
    1. D触发器:30-35=-5=0ps
    2. 时钟占空比为50%的两相锁存器:30-35=-5=0ps
    3. 时钟有60ps不交叠时间的两相锁存器:30-35-60=-65=0ps
  2. 有50ps的时钟偏斜时:
    1. D触发器:30-35+50=45ps
    2. 时钟占空比为50%的两相锁存器:30-35+50=45ps
    3. 时钟有60ps不交叠时间的两相锁存器:30-35-60+50=-15=0ps

最大借用时间的计算
答案
  1. 没有时钟偏斜时:
    1. D触发器:没办法时间借用。
    2. 时钟占空比为50%的两相锁存器:500/2-25=225ps
    3. 时钟有60ps不交叠时间的两相锁存器:500/2-25-60=165ps
  2. 有50ps的时钟偏斜时:
    1. D触发器:没办法时间借用。烂中烂
    2. 时钟占空比为50%的两相锁存器:500/2-25-50-50=175ps
    3. 时钟有60ps不交叠时间的两相锁存器:500/2-25-50-60=115ps

单周期多级的时间借用例子

理解。掌握这个你也是神人了。

多级的时间借用例子
答案
  1. 时钟周期1200ps:
    1. 因为半个时钟周期为600ps,大于任何一个组合逻辑延时,因此不需要时钟借用。
    2. 同上。
  2. 时钟周期1000ps:
    1. 第一级、第二级的组合逻辑延时大于半个时钟周期(500ps),因此会向L1借用50ps,L2借用50+80=130ps,L3借用130+450-500=80ps。
    2. 第二级、第四级的组合逻辑延时大于500ps,因此会向L3借用100ps,L4借用50ps。
  3. 时钟周期800ps:
    1. 第一级至第三级的组合逻辑延时均大于半个时钟周期(400ps),因此会向L1借用150ps,L2借用150+580-400=330ps,L3此时累计的延时为330+450-400=430ps,大于半周期,因此L3会错过高电平时期,数据传输会出错。
    2. 第一级至第三级的组合逻辑延时均大于400ps,因此会向L2借用200ps,L3借用200+400-400=200ps,L4借用200+550-400=350ps,回到L1后开始第二个循环,此时累计的延时为350+300-400=250ps,传给L2,L2此时累计的延时为250+600-400=450ps,大于半周期,因此第二个循环中L2会错过高电平时期,数据传输会出错。

多周期多级的时间借用例子

你无敌了孩子。

多周期多级的时间借用例子
答案
  1. 没有时钟偏斜时:

    1. 第一第二级为一个周期内,因此两个延时加起来需要小于两倍的时钟半周期,以确保时间借用不出错;第一至第四级为一个周期内,因此四个延时加起来需要小于四倍的时钟半周期。

      由此,可求得最小时钟半周期为350ps,则时钟周期最小为700ps。

    2. 第一第二级得出时钟大于700ps,第一至第四级得出时钟大于825ps。但是还需要考虑时间借用后的下一级。带入验证可知各级均满足时间要求。

    3. 第一第二级得出时钟大于1200ps,第一至第四级得出时钟大于875ps,因此应当取最大值即1200ps。

  2. 有100ps的时钟偏斜时:与上面结果一致,因为锁存器对时钟偏斜是透明的。

时钟网络

为什么会产生时钟偏斜?是因为即使时钟网络长度一样,也会难免有非理想情况发生。为了尽可能减小时钟偏斜,我们采用H形时钟树来确保时钟网络等长。

工程常用的H型时钟树

对于时钟功耗:

Pcknetwork=fCLKCline+Crep+CcktrVckswing2+VDDIleak,repPff=[αiCi+αOCOβ+Clocalbufγ]VDD2×fCLK +VDD[Ileak,localbuf+Ileak,FF]\begin{aligned} P_{ck-network} &= f_{CLK} \cdot C_{line} + C_{rep} + C_{ck-tr} \cdot V^2_{ck-swing} + V_{DD} \cdot I_{leak,rep}\\\\ P_{ff} &= \left[ \alpha_i C_i + \alpha_O C_O \cdot \beta + C_{local-buf} \cdot \gamma \right] \cdot V^2_{DD} \times f_{CLK}\\ &\ + V_{DD} \cdot \left[ I_{leak,local-buf} + I_{leak,FF} \right] \end{aligned}

为了让时钟耗能减小,我们可以:

  • 降低结点电容
  • 降低时钟电压摆幅
  • 去除冗余的转换活动
  • 降低时钟频率——双沿触发器,可以减小50%功耗,但是会给电路设计带来困难

施密特触发器

施密特触发器是包含正反馈的比较器电路。因为正反馈的存在,对于电平的变化,施密特触发器呈现出“迟滞比较”的特性:

施密特触发器与比较器的作用比较,图片来自维基百科

具有迟滞功能的缓冲器

具有迟滞功能的缓冲器

另一种具有迟滞功能的缓冲器,动态改变上拉或者下拉晶体管尺寸。

显然,当输入为高电平时,下拉网络左侧的NMOS导通,第一个反相器输出低电平,而输出端再经过一次反相,输出高电平,使得下拉网络右侧的NMOS也导通,增强下拉能力;对于输入低电平的状况同理。