无毛刺时钟切换电路
随着多时钟技术被应用到芯片,通常在芯片运行时需要切换不同的时钟源。两个不同的时钟之间可能是完全不相关的,即频率与相位均不相关,也可能存在一定的相位关系或频率倍数关系。不论是何种时钟关系,不可靠的切换可能会在切换过程中引入毛刺(glitch),这些毛刺信号可能会被一部分触发器(flip-flop)捕获到边沿,而另外一部分flip-flop忽略了该边沿,在这种情况下会导致输出逻辑错误,因此设计稳定可靠的电路控制多路选择器(multiplexer)的选择端至关重要。
在文中会先分析任意时刻切换时钟存在的问题,然后引出无毛刺时钟切换时钟电路。分别介绍两种稳定的切换电路,第一种主要针对具有倍数关系的时钟,第二种针对时钟完全无关的系统。
- 任意时刻切换时钟存在的问题
在图 1展示了一种简单的时钟切换电路,是采用与或非门构成的选择器,时钟信号分别从CLKx输入,SELECT为时钟选择端,CLK_OUT为时钟输出端。当SELECT发生翻转时会切换时钟源,由于切换信号的时刻是不确定的,因此可能会出现毛刺。
图 1 时钟切换选择器
在图 2波形中,展示了glitch产生的情况。因为select信号能够在任意时刻发生变化,因此造成了这种问题,当不知道两个时钟的频率的关系时,应该要避免在输出为高时切换时钟。
图 2 任意时刻切换产生的毛刺
- 具有倍数关系的时钟切换
当时钟具有倍数关系时可以采用如图 3所示的时钟切换电路,在图中使用了负边沿触发的D触发器,SELECT信号只在时钟clockx的下降边沿采样,因此确保了切换只会发生在时钟clockx为低电平的状态下。同时才用了反馈结构,确保只有在A路时钟一定为低电平的状态下B路时钟才会发生切换,反之亦然。
图 3 倍数频率关系时钟无毛刺切换电路
当SELECT发生切换时,时序如图 4与图 5所示,通过分析时序图,能够分析出当从A切换到B时,会在A时钟的低电平阶段先切断时钟,即电路中A对应的D触发器Q端为0,然后再B时钟的下降沿切换为B时钟,此时输出时钟保持为低电平。
图 4 时钟1切换到时钟2时序图
图 5 时钟2切换到时钟1时序图
在电路图 3中存在3个timing path需要特别关注,
- SELECT到DFF1与到DFF2;
- DFF1的输出到DFF2的输入;
- DFF2的输出到DFF1的输入;
这3个路径上的信号如果在DFF触发的边沿发生变化,那么可能会发生亚稳态(meta-stable)。注意到SELECT信号必定是与CLK1或者CLK2相关的,为了避免发生亚稳态,SELECT信号应该与时钟切换的DFF使用不同的边沿,在此设计中SELECT应该选择为上升沿触发。
注意事项:
在上电复位阶段,DFF1与DFF2都应该保持Q端为低电平输出,这样确保两个时钟都不会被选中,同时这种设计也使得时钟切换具有容错性(fault tolerance)。具体的,当在初始阶段,时钟A因为错误没有toggle。此时如果控制时钟A的DFFx复位时处于1状态,那么该时钟一直被选中,同时由于没有时钟驱动,触发器DFFx的Q端会一直处于1状态,在这种情况下输出时钟会一直保持为低,且无法切换到另外一路时钟,此时处于锁死状态。但是若初始复位后DFF的Q端保持为0,尽管一路时钟没有工作,也还能够切换到另外一路正常工作的时钟。因此DFFx需要确保复位后输出为0。
- 不相关时钟无毛刺切换
在上述图 3切换电路要求时钟具有倍数关系,因为只有在这种情况下,才能避免出现异步信号,图 3所示电路没有任何处理异步信号的机制,无法用来切换无关系的任意两个时钟。
为了处理异步信号,需要在图 3所示的电路的基础上引入同步器(synchronizer),当需要切换的两个时钟是没有关系时,产生异步信号的源头是控制信号SELECT与DFF的反馈信号。在图 6所示电路中引入了同步器,经过两级DFF同步SELECT与DFF的反馈信号,从而减小了亚稳态传播的概率。
图 6 异步时钟无毛刺切换电路
在图 7描述了CLK2切换到CLK1的过程,其中DFF5Q与DFF6Q为同步器的Q端输出。
图 7 时钟2切换到时钟1
仿真实验测试如图 8所示,分析仿真结果可知图 6所示电路实现了时钟无毛刺切换。
图 8 任意时钟切换仿真
图 3与图 7所示的电路具有一般性,在图中描述的是二输入端口的时钟切换电路,当设计多时钟切换电路时,对每一个时钟切换的使能信号需要与其他的时钟源的反馈信号进行与运算。
别走开,Jayden小哥哥又有话说,仿真工程与源码可扫描二维码关注公众号鼓捣猫尼回复“时钟切换工程源码”获得(不要引号)。在Jayden小哥哥的杂货铺会不定期的更新关于PFGA、IC设计、模拟电路、嵌入式编程等学习心得,期待小伙伴的关注与点赞,I need U。
参考文献:
https://www.eetimes.com/techniques-to-make-clock-switching-glitch-free/