FPGA时钟无毛刺切换电路
时钟无毛刺切换电路
(文字由AI润色完成)
本文旨在对几种经典的时钟切换电路进行梳理和总结。
具体的时钟切换时序图可以参考网上各大博客。
有毛刺的切换电路
下图是一个由基本门电路构成的时钟选择器。其本质就是一个组合逻辑的多路选择器(MUX)。
问题所在:选择信号 sel
相对于 clk0
和 clk1
都是异步的。如果 sel
的跳变发生在任一时钟的高电平期间,输出端 clk_out
就可能产生一个非常窄的脉冲,即“毛刺”。这个毛刺会被下游逻辑误采,引发功能错误。
无毛刺时钟切换电路
为了规避上面的异步信号带来的影响,需要加入同步电路,即打2拍把异步信号同步到本地时钟域。
实现无毛刺切换的核心原则是 “先停后启”:即先关闭当前输出的时钟,再开启新的时钟,确保切换过程中不会产生不完整的时钟脉冲。
相关时钟
当两个时钟源 clk0
和 clk1
存在明确的频率或相位关系(如倍频、分频)时,可以采用如下相对简单的设计。
这里本质上sel
信号相对于clk0和clk1仍然是异步信号,但由于这里时钟存在相关性,对异步sel信号进行一定的约束即可规避掉亚稳态问题。
非相关时钟
这是最通用、最稳健的设计,适用于两个时钟之间无任何关联的场景。
该电路的逻辑非常精妙。下面以 sel
从 0
切换到 1
(即时钟从 clk0
切换为 clk1
)为例说明:
- 关闭 clk0:
sel
变为1
后,该信号被clk0
域的两级触发器(FF2, FF3)同步。由于 FF3 是下降沿触发,它会在clk0
的下降沿(即低电平)到来后,才改变其输出。FF3/Qn
变为0
,从而安全地关闭通往clk0
的与门(AND3)。注意此时时钟输出为低电平。 - 开启 clk1:
FF3/Qn
输出的0
会传递给clk1
域的两级触发器(FF0, FF1)。同样,由于 FF1 是下降沿触发,它会在clk1
的下降沿到来后,才使其输出FF1/Q
变为1
,从而安全地打开通往clk1
的与门(AND2)。
至此,时钟源被平稳地从 clk0
切换到了 clk1
,全程无毛刺风险。
简单总结流程是:sel
信号从0
到1
,经历2级clk0
同步关闭clk0
,经历2级clk1
同步打开clk1
。
RTL code
代码编写还是比较容易,将电路描述出来即可。为了仿真观察波形,笔者加入了0.1个时间单位的延迟。
1 |
|
总结
- 用纯组合逻辑(MUX)进行异步时钟切换,极易产生毛刺。
- 设计中的下降沿触发是关键,它确保了对时钟路径的使能/禁止操作都发生在时钟的稳定低电平期间。
参考
- CSDN|Glitch free 无毛刺时钟切换电路、时钟无缝切换、时钟无毛刺切换技术
- 博客园|时钟切换电路(无毛刺)——clock switching glitch free
- 知乎专栏|时钟无毛刺切换电路(glitch free)
FPGA时钟无毛刺切换电路
https://blog.zorogh.top/2025/08/25/glitch-free-clock-switching/