在设计多时钟信号的数字系统时,涉及到了时钟切换,在网上找到了一篇文献:Trouble-Free Switching Between Clocks,第 20 页,这篇极短的小文章可能是 Xilinx 元老 Peter Alfke 写的,非常实用,受益匪浅。
一、时钟电路分析
下面就是文章中设计的时钟切换电路图:
Xilinx 这个电路的基本思想是 SR latch。 去掉图中两个 flip flop,最前端的两个 AND 组成一个类似 SR latch 的电路,只不过 SR Latch 的 S,R 输入换成了 Select 和 Select inverted。为了使 SR Latch 的输出能与所需控制的时钟同步,加上了一级 flip flop 同步一下。
Xilinx 这个电路里有一个非常重要的小细节,牵涉到时钟切换的一条重要原则——先关断当前选择的时钟,再使能新选择的时钟。 QB 反馈到 Clock A 那边经过一个反向再和 Select 反向 AND,QA 反馈到 Clock B 那边经过一个反向再和 Select AND,保证了先关断再使能这个重要原则。
Xilinx 这个电路里还有个非常重要的小细节,也是该电路的精妙之处。
这两个 flip flop 的时钟输入端有个小泡泡,意思是时钟下降沿触发,这是一个重要的设计思想。如果要 gate off 掉一个时钟,在该时钟低电平时 gate off 是最安全的。 如果是在高电平时做切换,很容易造成高电平被切掉一段变成一个毛刺,这可是大大的危害。
搞笑的是网上 随便搜一下 “glitchless clock switching”,会出来一大堆文章,虽然都是基于 Xilinx 这个电路,但大部分漏掉了低电平触发这个细节。
二、改进后的时钟切换电路
上面的电路虽然概念上是对的,但有明显瑕疵。如果 Select 相对于 Clock A,Clock B 是完全异步(asynchronous),电路中的两个 flip flop 在 Select 变化时会有亚稳态(metastability)的可能性。 克服这个瑕疵的 fix 很简单,把图中的单个 flip flop 换成两级 flip flop 组成的同步器(synchronizer)就可以了。
下面是改进的电路,一级 flip flop 换成了两级 flip flop 同步而已。
三、仿真分析
电路启动波形
切换波形:fast to slow
切换波形:slow to fast
以上是一个比较经典的时钟切换电路。 根据实际使用场景的不同,时钟切换有很多不同的实现方法,都可以做得非常经典。 时钟,复位,是数字设计里最最基本的电路,稍有不慎,就会毁了整个设计,一定要谨慎再谨慎。
扫码关注尚为网微信公众号
原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1267.html