FPGA时钟进阶
如何处理逻辑时钟中的时钟域
单一时钟域:一个独立的网络可以驱动整个设计中所有触发器的时钟
跨时钟域:设计中存在两个或两个以上的异步时钟域
如果数据在如图数据跳变发送在时钟上升沿,则会发送亚稳态。可以看出该信号在两个时钟域相邻的时钟沿上无法获得相同的效果,但是在跨过时钟域之后的第二个时钟上升沿时刻,数据应该能稳定下来。

处理亚稳态方法:
1、双触发:
设计中使用的任何寄存器都会指定一个建立和保持时间,在时钟上升沿前后的这个时间内输入数据被禁止发送任何变动。
有一个重要的问题需要思考:是否需要采样从一个时钟域传输到另一个时钟域?
有两种情况:跨时钟域边界存在①跨时钟域传输数据允许丢失部分采样值和②跨时钟域传输数据不允许丢失采样值。
对于①情况,没有必要去采样每一个值,但需要注意的是被采样的值必须要确保精确度;
对应②情况,一个跨时钟域的信号必须要被正确识别,或者说在其允许发生改变之前必须被识别。
最常见的同步器就是两级寄存器,即使用寄存器打两拍的方式同步。(已经可以解决大部分问题)
设计这种寄存器时应当遵循以下原则:
1、级联的寄存器必须使用同一个采样时钟
2、发送端时钟域寄存器输出的接收端异步时钟域级联寄存器输入之间不能有其他组合逻辑
3、同步器中级联的寄存器除了最后一个寄存器外所有的寄存器只能有一个扇出,即其只能驱动下一级寄存器的输入。

每个原则对应的错误案例:



2、使用三级触发处理亚稳态
平均故障间隔时间(Mean Time Between Failure,MTBF),这是衡量一个产品的可靠性指标。
MTBF值大表示两次故障间隔的时间长;相反小表示两次故障间隔的时间短。
有时两级寄存器未必足够,即两级寄存器的MTBF太短,某些高速设计中使用三级触发器。

由低速时钟域传递到高速时钟域时,一般问题不大,直接用两级级联寄存器就ok了,但是当高速时钟传递到低速时钟时,问题可能就比较大。
举个极端的例子:发送端的时钟域频率高于接收端的时钟域频率,而跨时钟域的信号脉冲正好等于发送端时钟的一个时钟周期。那么,当只有一个高速时钟周期宽的跨时钟信号传递到低速时钟域时,被低速时钟域采样后,该信号可能为高也可能为低,也就是说可能被采集也可能不被采集。

从发送时钟域(快速时钟)发送的信号脉宽稍微大于接收时钟(低速时钟),在大部分情况下,该信号是能被低速时钟采集并传递,但小概率情况下,脉冲改变发生在离接收时钟域同步器两个时钟上升沿太近,第二个时钟沿保持时间不够,从而无法得到预期的信号脉冲。

如果丢失信号采样值对应设计来说是不允许的,那么有两种通用的应对方案:
1、开环解决方案,确保信号在无须确认的情况下可以被采集;
2、闭环解决方案,在跨时钟域边界时,信号需要接收端的反馈确认。
使用方案一开环:使用之前介绍的同步器来采样跨时钟域信号,但是前提是需要先将目标信号展宽,需要将目标信号展宽到至少超过接收时钟域的时钟周期,最佳的时钟周期是至少为采样时钟周期的1.5倍,这样跨时钟域信号被接收时,至少被采样一次。

开环解决方案,多用于相关时钟频率固定且时钟信号能够被正确分析。这种方案的好处是能在无需接收时钟域握手信号的情况下最快的将信号传递通过跨时钟域边界;缺点,容易让其他设计者误以为当前解决方案为通用解决方案,或者说需求改变时,容易忘记重新分析之前的“开环”解决方案。
使用方案二闭环:在发送时钟域将控制信号当使能信号传递,并将其同步到接收时钟域,然后接收时钟域收到使能控制信号后,将同步的控制信号反馈到发送时钟域。发送时钟域通过另一个同步器接收此反馈回来的控制信号,并以它作为信号正确接收的握手信号。
优点:可以通过反馈回来的信号可以非常安全的确认第一个使能控制信号已经被接收时钟域,安全的接收。
缺点:这种信号传输有非常大的延迟,因为未完成握手之前无法传递信号的下一个数值。
