前言
本系列整理数字系统设计的相关知识体系架构,为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中,D触发器是最常用的器件,也可以说是时序逻辑的核心,本文根据个人的思考历程结合相关书籍内容和网上文章,聊一聊D触发器与亚稳态的那些事。
D触发器结构
由传输门和两个反相器组成一个循环电路(锁存器),再由前后两级锁存器按主从结构连接而成。分别用两个反相时钟控制 , 触发器在时钟有效沿的短期时间 “ 窗口” 采样数据。传输门起开关的作用,随着CLK的状态变化切换开关。从输出来看的话,前级的锁存器的值会有序传送给后级(随着时钟输入)。
D触发器的工作时序如下图,图中的D为上图D触发器输入端,Q为D触发器输出端。此处分析并不考虑时钟存在抖动偏移的情况,认为时钟是理想的,没有抖动偏移的。
时钟为低电平时,也即主锁存器工作时,D触发器的主锁存器进行锁存,在图中标号1为输入的信号。主锁存器经过传输门和反相器进行数据寄存;此时后级的从锁存器和前级隔开;从锁存器输出上一个时钟周期的数据。
时钟为高电平时,也即从锁存器工作时,D输入端和主锁存器断开,确保数据稳定,然后主锁存器将数据传输给从锁存器,然后输出到Q端。
标号2的虚线表示理想条件下(无延时)主锁存器的锁存边沿,实际上主锁存器稳定锁存需要时间,所以相比理想条件需要延时一段时间。标号3的虚线表示理想条件下(无延时)从锁存器的锁存边沿,实际上从锁存器稳定锁存需要时间,所以相比理想条件需要延时一段时间。根据主从锁存器的输出结果,可得到D触发器输出Q的波形。图中的标号4中的虚线表示理想条件下(无延时)从锁存器的锁存边沿,这里的延时是经过传输门 TG3 和反相器到输出端 Q 的延迟。
同时,当时钟由低电平变为高电平时,涉及到了两组传输门的切换,因为实际的物理模型开关切换都是需要时间的,并且每个开关进行开断时都有一定的时间偏差,所以在此时D端的输入改变就容易造成从锁存器的锁存错误,从而造成从锁存器的反相器环路想后级传递值时,给出错误的数据值,进而影响功能。
与主锁存器相关的建立时间
此时再回顾建立时间的定义,建立时间 (通常表示为tsu)指在时钟上升沿来临之前信号保持稳定的最小时间。结合前面的分析,建立时间的存在意义也就是于此。在时钟电平跳变前,主锁存器需要稳定锁存我们想要的数据,由于实际物理电路的延迟,需要提前一段时间进行将数据进行稳定。因此,建立时间,实质上是主锁存器锁存需要的时间,。
与从锁存器相关的保持时间
再回顾保持时间的定义,保持时间(通常表示为th)指在时钟上升沿来临之后信号保持稳定的最小时间。结合前面的分析,保持时间的存在意义也就是于此。当时钟进入高电平后,由于传输门关断需要一定的时间,因此输入D必须继续稳定一段时间才能够保证数据被稳定锁存。因此,保持时间,实质上是传输门切换至从锁存器锁存数据需要的时间。
简单来说,主锁存器决定了D触发器的建立时间,从锁存器决定了D触发器的保持时间,从上面的例子中可以很容易看到,同时说明一点上面的分析均基于理想时钟的情况下,同样的道理,时钟的抖动也会影响,数据正常锁存。
亚稳态理论引入
所以,根据前文D触发器模型的分析可知,当信号没有满足两个锁存器的锁存时间时(也即违背了触发器的建立和保持时间),就没法正常的让系统工作。设计中任何一个触发器都有特定的建立和保持时间,在时钟上升沿前后的这段时间窗口内,数据输入信号必须保持稳定。如果信号在这段时期发生了变化,那么输出将是未知的。这种有害状态的传播就叫做亚稳态。
亚稳态窗口
因此,可以定义触发器的建立时间和保持时间为亚稳态窗口( Metastability Window)。在亚稳态窗口内,如果信号发生变化,输出就可能变成亚稳态。建立时间和保持时间共同决定亚稳态窗口的宽度。
窗口越大,进人亚稳态的概率越高。在大多数情况下,较新的逻辑器件会有更小的亚稳态窗口,也就意味着器件进入亚稳态的概率会更小。
异步系统容易发生亚稳态
在同步系统中输入信号总是满足触发器的时序要求,所以不会发生亚稳态。但是,在异步系统中,由于数据和时钟的关系不是固定的,因此有时会出现违反建立和保持时间的现象。此时触发器的输出会因此而产生毛刺,或者暂时保持在不稳定状态而且需要较长时间才能回到稳定状态。
当触发器处在亚稳态时,输出会在高低电平之间波动,这会导致延迟输出转换过程,并超出所规定的时钟到输出的延迟值(tco)。亚稳态输出恢复到稳定状态所需的超出t的额外时间部分称为稳定时间(tMET)。并非所有不满足建立和保持时间的输入变化都会导致亚稳态输出。触发器是否进入亚稳态和返回稳态所需时间取决于生产器件的工艺技术与外界环境。一般来说,触发器都会在一个或者两个时钟周期内返回稳态。
当信号在一个时钟域( src_data_out)里变化,在另一个时钟域(dest_data_in)内采样时,就会导致输出变成亚稳态。这就是所谓的同步失败,会导致逻辑功能的异常。
平均无故障时间(MTBF)
当系统的故障率恒定时,MTBF ( Mean/ Average Time Between Failures,平均无故障时间)就是故障率的倒数。我们可以从中知道特定触发器发生故障的频率。
对于一个具有给定时钟频率和在该时钟周期内具有均匀概率密度的异步数据信号边沿的单级同步器,亚稳态事件的发生率可以用建立、保持时间窗口和时钟周期的比值乘以信号触发频率来计算。
$$
\begin{aligned}
\frac {1}{故障率}\ &= MTBF \ =\frac {e(t_r/\tau)}{Wf_cf_d}\
\end{aligned}
$$
t r : 允许超出器件正常传输延迟的解析时间 τ = 触发器的亚稳态 ( 解析 ) 时间常数 W = 亚稳态窗口 f c = 时钟频率 f d = 异步信号边沿频率 \begin{aligned} t_r&:允许超出器件正常传输延迟的解析时间\\ \tau&=触发器的亚稳态(解析)时间常数\\ W&=亚稳态窗口\\ f_c&=时钟频率\\ f_d&=异步信号边沿频率\\ \end{aligned} trτWfcfd:允许超出器件正常传输延迟的解析时间=触发器的亚稳态(解析)时间常数=亚稳态窗口=时钟频率=异步信号边沿频率
常数W和τ跟触发器的电气特性有关,会根据工艺技术而改变。所以,相同工艺生产出来的不同器件有着相似的W和τ值。
如何尽量避免亚稳态
每当违背建立、保持时间时,亚稳态就会出现,所以了解在何种情况下容易发生亚稳态,自然也就知道如何更好的避免亚稳态。在以下条件中,信号可能违背建立时间和保持时间的要求:
- 异步信号 :输入信号是异步信号。
- 时钟不稳定: 时钟偏移/摆动(上升/下降时间)高于容限值。
- 跨时钟域工作: 信号在两个不同频率或者相同频率但是相位和偏移不同的时钟域下跨时钟域工作。
- 组合延迟过大 使触发器的数据输入在亚稳态窗口内发生变化。
亚稳态会引起过多的传输延迟和系统故障,所有的触发器和寄存器都存在亚稳态可能。
亚稳态不能根除,但是可以减小亚稳态发生的概率。
在最简单的情况下,设可以通过确保时钟周期足够长来避免亚稳态(也即降低时钟频率),但这种方法很难再满足性能的要求。另一种避免亚稳态的方法就是使用同步器,这种同步器最好在单Bit信号的情况下使用。
使用多级同步器
避免亚稳态最常见的方法是在跨时钟域的信号上加上一个或者多个同步触发器,如下图所示。这种方法用一个完整的时钟周期来解决第一级同步触发器的亚稳态问题(不包括第二级触发器的建立时间)。但是这种方式增加了同步逻辑输入的延迟。
简而言之就是对于异步信号进行打拍处理,这个在数字系统设计中很常用。
使用时钟倍频电路的多级同步器
多级同步器的一个局限就是系统需要花费较长的时间去响应异步输入。解决这个问题的办法就是使用倍频时钟作为两个同步触发器的时钟输入。Altera的FPGA中具有这项称为时钟倍频的技术。
这种方法不仅能够让系统在一个系统时钟周期内响应一个异步输入,而且改善了MTBF。尽管这种倍频时钟能够降低MTBF,但是这个影响要超过两级触发器引起的偏移量。
两种方法都不能保证同步器阻止亚稳态传播下去,它们仅仅减少了亚稳态发生的概率。
同步器的类型
根据MTBF的计算公式 ,一个异步输入电路的MTBF和用于从亚稳态恢复的时间呈指数关系。 用同步器构成的时间缓冲器可以帮助从亚稳态中恢复。(这里参考的是《硬件架构的艺术》这本书,但是个人感觉翻译的笔者可能把这段搞混掉了,如果看了原书的人,可能没太能搞懂他说的两种同步器,图片和内容在我看来好像是存在不对应的情况,这里就依据个人理解对书中的内容进行勘误)。
在《硬件架构的艺术》这本书中介绍了两级同步器的两种不同的模式:模式A(慢时钟域转快时钟域)和模式B(快时钟域转慢时钟域)。
模式A(慢时钟域转快时钟域)
模式A是一个标准的电路,当异步输入信号比时钟周期大得多时最有效。(这里根据我的个人理解他可能想表达的就是常规在目的时钟域中打两拍的做同步,所以我这里暂且认定前面提到的多级同步器是他这里说的标准电路)
使用在目的时钟域打两拍的方式作为两级同步器,即使异步输入在建立时间区间之外稳定,它仍然需要由时钟驱动产生两个周期的延迟,否则FF1可能进入亚稳态。如果亚稳态在不到一个时钟周期内就解析了,FF2就会有稳定的输入,否则就需要级联更多的触发器作为同步器。
模式B(快时钟域转慢时钟域)
对于同步器的模式B,第一级触发器的输入D与Vcc相连,同时时钟信号是异步输入信号。另外两个触发器直接由系统时钟(clk)控制。一个短脉冲让q1变成高电平,这个高电平在经过两个时钟(clk)沿后从sync_out输出。
本节总结:
- 当信号存在跨时钟域工作或者为异步信号时,此时要采用同步器进行同步,确保工作稳定。
- 如果是慢时钟域转快时钟域的场景,可以进行打拍处理;如果是快时钟域转慢时钟域,就采用同步器的模式B。
面对亚稳态建议
在两个相互异步系统的交界面亚稳态是不可避免的。下面的几点建议可以明显减小亚稳态发生的概率。
工艺器件角度:
- 采用响应更快的触发器(缩短亚稳态窗口 Tw )。
- 使用亚稳态硬化触发器(专为高宽带设计并且减少为时钟域输入电路而优化的采样时间)。
设计角度:
- 采用同步器。
- 使用级联触发器(两个或者多个)作为同步器。如果一个触发器的亚稳态失败概率为P,那么N个触发器的亚稳态失败率就是P^{N}。
- 减少采样速率,或者说降低时钟频率。
- 避免使用dV/dt低的输入信号(电压突变较慢的输入信号)。
小思与总结
本文针对前面D触发器的分析没有进行考虑时钟的偏移情况,相关内容在后续介绍时序约束时进行整理;同时本文的同步方法建议在单Bit信号进行使用,多Bit信号或者单Bit信号处理的其他方法待后续进行整理。
为什么多Bit信号不能使用文中的同步器方式呢?在《硬件架构的艺术》书中提到了这样一句话:一个异步信号不应该被两个或者多个同步器所同步,这样做会存在多个同步器输出产生不同信号的风险。 这大概也就是这个问题的答案,具体分析将在后面关于跨时钟处理的文章中进行整理解答,笔者水平有限,如有错误,欢迎讨论。
reference
- CMOS的宽/长比、传输门与三态门、锁存器与触发器、简单版图、竞争与冒险
- 一文解决关于建立保持时间的困惑 - 知乎
- 硬件架构的艺术