当在时钟域之间传递信号时,要问的一个重要问题是,是否对从一个时钟域传递到另一个时钟域的信号的每个值进行采样?有两种可能的情况,确定哪种情况适用于您的设计非常重要:
场景一:允许在时钟域之间传递时数据漏采样。
场景二:在时钟域之间传递的每个信号都必须进行采样。
第一种情况:有时没有必要对每个值进行采样,但采样值的准确性很重要。例如异步FIFO中格雷码计数器,同步格雷码计数器不需要对向时钟域捕获每个值,但采样值准确对识别何时发生满和空是至关重要。
第二种情况:必须正确识别CDC信号,或者在CDC信号变化之前识别并确认CDC信号。
单比特同步策略
如果CDC信号在时钟域之间传递时不允许丢失,那么在时钟域之间传递时考虑信号宽度或同步技术是很重要的。
-
慢时钟域到快时钟域
如果较快的时钟域的频率是较慢的时钟域的1.5倍(或更多),那么将较慢的控制信号同步到较快的时钟域通常不是问题,因为较快的时钟信号将对较慢的CDC信号进行一次或多次采样。使用两级触发器同步器在时钟域之间传递单bit CDC信号。
-
快时钟域到慢时钟域
考虑一个有严重缺陷的情况,发送时钟域的频率高于接收时钟域,并且CDC信号在发送时钟域中只有一个周期宽读。如果CDC信号只在一个快速时钟周期内脉冲,那么CDC信号可以在较慢时钟的上升沿之间上下波动,而不会被捕获到较慢时钟域
考虑一下另外一种不直观、但有缺陷的情况,其中发送时钟域向接收时钟域发送的脉冲略宽于接收时钟周期。在大多数情况下,信号将被采样并通过,但是CDC脉冲的变化太靠近接收时钟域的两个上升时钟沿,从而违反第一个时钟沿的setup time和第二个时钟沿的hold time,而不是形成预期的脉冲,虽然这种可能性很小,但确实存在。
Mark Litterick指出当通过双触发器同步器在时钟域之间传递一个CDC信号时,CDC信号的宽度必须大于接收域时钟周期周期宽度的1-1/2倍。Littereick将这一要求描述为“输入数据值相对于目标时钟三个沿必须是稳定的”。
Open loop方法
展宽发送CDC信号,最小脉冲宽度为接收时钟频率周期的1.5倍。确保CDC信号将被接收器时钟采样至少一次,或者两次。当相对时钟频率固定时,可以使用这个方法。
最大潜在问题是,其他工程师可能将该解决方案误认为通用解决方案,或者设计需求可能发生变化,而工程师可能无法重新分析。
Closed loop
这个方法也叫握手同步,具体方法为发送一个请求信号,将其同步到目的时钟域,然后通过另一个同步器将同步信号作为确认信号传回发送时钟域。
在这种同步方案中,握手机制用于保证将正确的数据采样到目标时钟域中,而不管源时钟和目标时钟之间的时钟比如何。