对跨时钟域数据的处理的核心就是要保证下级时钟对上级数据采样的setup 时间或hold 时间满足要求,即尽量避免亚稳态的发生和传播。但是,我们知道,只要系统中有异步元件,亚稳态就是无法避免的,因此设计的电路首先要减少亚稳态导致错误的发生,其次要使系统对产生的错误不敏感。我们推荐使用以下方法来解决异步时钟域数据同步问题。
1. 用触发器打两拍
如图1,左边为异步输入端,经过两级触发器同步,在右边的输出将是同步的,而且该输出基本不存在亚稳态。其原理是即使第一个触发器的输出端存在亚稳态,经过一个CLK周期后,第二个触发器D端的电平仍未稳定的概率非常小,因此第二个触发器Q端基本不会产生亚稳态。然而,亚稳态是无法被根除的,一旦亚稳态发生,后果的严重程度依赖于你
设计系统对产生的错误是否敏感。
图1:触发器打两拍电路图
2. 异步FIFO或DPRAM
因为异步FIFO或DPRAM使用格雷码计数器设计读写地址的指针,所以它可以很好地避免亚稳态的发生。使用方法如图2,将上级芯片提供的数据随路时钟作为写信号,将数据写入异步FIFO或DPRAM,然后使用本级的采样时钟将数据读出即可。唯一需要注意的是,当两级时钟频率不同时,需要设计好缓冲区,并通过监控full、half、empty、useword信号,保证数据不会溢出,也不会被读空。
图2:异步FIFO或DPRAM电路图
3.调整时钟相位
这种方法的设计难度较大,而且适用面有限。首先需对跨时钟域数据的路径进行详细的静态时序分析,然后将违反setup时间和hold时间的情况一一列出,在不影响其它设计性能的前提下,综合考虑调整两级时钟的相位关系,最终使其setup时间和hold时间满足要求。