所谓的亚稳态是指触发器的输入端在建立时间和保持时间窗口内不能保持稳定,而造成输出端不能稳定的settle到高电平或低电平的情况,并且从进入亚稳态到稳定的settle到某一电平的时间(称为resolution time)也不能确定。这就好比一个在山顶上的球一样,你不知道它会滚向那边,同时你也不知道他什么时候会滚到山的一边。
那么在什么情况下会引起亚稳态呢?在数字电路设计中,通常亚稳态由异步时钟域之间的通信引起。设想有这样一个电路,由两个触发器串联组成,信号包括D、Q1、Q2,各触发器使用的时钟不同,那么触发器串联的部分就是异步时钟域间的通信。当这两个时钟在某一个时刻同时触发,并且在那个时刻Q1也发生变化时,由于在第二个触发器中,输入Q1不能在critical window中保持稳定,因此输出Q2就有可能进入亚稳态。
由于在现实应用中异步时钟域之间的传输必然存在,则亚稳态的出现也不可避免。需要明确的是,亚稳态是不可消除的,我们能做的就是使亚稳态出现的概率降低,避免亚稳态的进一步传播,并且在出现亚稳态的时候,系统具有一定的容错机制而不致于使整个电路系统崩溃,这刚好对应于亚稳态带来的两个问题,即resolution time和settle 电平不确定。
那么具体的如何来对付亚稳态呢?首先,需要限制采样时钟的最大频率。我们知道,亚稳态的出现是一个概率事件(你在山里玩滚球游戏不可能每次都那么好运使球刚好滚到山顶,然后停住几秒再滚向山的另一边),假设其概率是q,,同时采样时钟的频率为f,则在一秒种内发生亚稳态的次数为fq,而发生错误的平均时间为1/fq(称为MTBF)。q的大小与触发器采用的结构有关,要使MTBF尽可能长,就只能减小f,或者说需要给f规定一个上限。统计表明resolution time大约是触发器时钟到输出的20倍,由resolution time + Tcq就规定了采样时钟的最短周期,从而可以确定其fmax,更快的时钟频率将使亚稳态在采样时钟域中进一步传播。其次,对异步数据采用采样时钟进行两级同步寄存。由于采用了两级同步操作,从这两个寄存器的外部来看,其发生亚稳态的概率为q的平方。实际上,这两个处理的作用是阻止亚稳态的进一步传播,使电路快速稳定到某一状态。对于settle 错误造成的结果,需要根据具体的设计去处理。
异步FIFO就是一个典型的异步时钟域间通信的例子。我们都知道任何FIFO都具有满空信号,已实现对FIFO的控制,使其不至于吃掉数据或者自动生成数据,而满空信号的产生又需要对读写指针进行对比,若读写时钟不同,则这个逻辑就是异步时钟域通信。具体的说,就是在判断空信号时,需要用读时钟去采样写指针,如果写指针比读指针大一,则此时若读使能有效则空信号应该置位;而在判断满信号时,需要用写时钟去采样读指针,如果读指针比写指针大一,则此时若写使能有效则满信号应该置位。因此,需要使用读时钟对写指针,以及写时钟对读指针进行两次同步。由于在确定满空信号时对指针进行了同步操作,在此期间可能实际的指针位置已经发生变化,设想最坏的情况下,应该根据读写时钟的比值预留读写指针之间足够的差值。另外,为了使指针的变化尽可能的减少,应该使用格雷码计数器代替二进制计数器(数据如果不变化,则采样时就是稳定的,自然也不会发生亚稳态)。