| |
所有数字器件(例如FPGA)的信号传输都会有一定的时序要求,从而保证每个寄存器将捕获的输入信号正确输出。为了确保可靠的操作,输入寄存器的信号必须在时钟沿的某段时间(寄存器的建立时间Tsu)之前保持稳定,并且持续到时钟沿之后的某段时间(寄存器的保持时间Th)之后才能改变。而该寄存器的输入反映到输出则需要经过一定的延时(时钟到输出的时间Tco)。如果数据信号的变化违反了Tsu后者Th的要求,那么寄存器的输出就会处于亚稳态。此时,寄存器的输出会在高电平1和低电平0之间盘旋一段时间,这也意味着寄存器的输出达到一个稳定的高或者低电平的状态所需要的时间会大于Tco。
在同步系统中,输入信号总是能够达到寄存器的时序要求,所以亚稳态不会发生。亚稳态问题通常发生在一些跨时钟域信号的传输上。由于数据信号可能在任何时间到达异步时钟域的目的寄存器,所以设计者无法保证满足Tsu和Th的要求。然而,并非所有违反寄存器的Tsu或Th要求的信号会导致输出亚稳态。某个寄存器进入了亚稳态后重新回到稳定状态的时间取决于器件的制造工艺及工作环境。在大多数情况下,寄存器将会快速的返回稳定状态。
寄存器在时钟沿采样数据信号好比一个球从小山的一侧抛到另一侧。如图1所示,小山的两侧代表数据的稳定状态——旧的数据值或者新的数据值;山顶代表亚稳态。如果球被抛到山顶上,它可能会停在山顶上,但实际上它只要稍微有些动静就会滚落到山底的任意一侧。在一定时间内,球滚的越远,它达到稳定状态的时间也就越短。
? 如果数据信号的变化发生在时钟沿的某段时间之后(Th),就好像球跌落到了小山的“old data value”一侧,输出信号仍然保持时钟变化前的值不变。
——自己的理解:信号在Th后发生跳变,就是已经过了CLK采样时间,CLK的上升沿没有采样到数据已经发生了跳变,所以输出还是原来值old data value。
? 如果数据信号的变化发生在时钟沿的某段时间(Tsu)之前,并且持续到时钟沿之后的某段时间(Th)都不再变化,那就好像球跌落到了小山的“new data value”一侧,输出数据达到稳定状态的时间为Tco。
——自己的理解:信号在CLK的上升沿Tsu时间段之前跳变,满足时序要求,当CLK上升沿到来正好可以采样到跳变后的新数据,并且满足CLK需要的数据保持时间Th,因此输出是跳变后的新数据new data value。
? 然而,当一个寄存器的输入数据违反了Tsu或者Th,就像球被抛到了山顶。如果球在山顶停留的越久,那么它到达山底的时间也就越长,这就相应的延长了从时钟变化到输出数据达到稳定状态的时间(Tco)。
——自己的理解:进入亚稳态,首先就会保持在亚稳态的状态(既不是0也不是1),只有如果稍有动静才会慢慢进入稳态(而且这个稳态是0还是1是随机的),因此要经过比Tco长得多的时间,就好像从山顶向下落,落在哪边都有可能。
图2很好的阐释了亚稳态信号。在时钟变化的同时(这个“同时”指的是实际的使用状态而非理想状态),寄存器的输入数据信号也从低到高变化,这就违反了寄存器的Tsu要求。图中的输出信号从低电平变化到亚稳态,即盘旋于高低电平之间的一个状态。信号输出A最终达到输入信号的新状态值1,信号输出B却返回了输入信号的旧状态值0。在这两种情况下,信号输出变化稳定在固定的1或者0状态的时间远超过了寄存器的固有Tco。
图2 亚稳态信号向0向1跳变都有可能
如果输出信号在下一个寄存器捕获数据前(下一个时钟锁存沿的Tsu时间前)处于一个稳定的有效状态,那么亚稳态信号不会对该系统照成影响。但是如果亚稳态信号在下一个寄存器捕获数据时(即上升沿阶段)仍然盘旋于高或者低电平之间,那将会对系统的后续电路产生影响。继续讨论球和小山的比喻,当球到达山底的时间(处于稳定的逻辑值0或1)超过了扣除寄存器Tco以外的余量时间,那么问题就随着而来。