在数字电路设计领域中,时钟切换逻辑是实现时钟域之间的通信以及切换时钟源的重要组成部分。然而,在进行时钟切换时,如果不采取适当的措施,很容易产生glitch(毛刺),即在输出信号上出现短暂的不期望的脉冲,这将对电路的稳定性和可靠性造成严重影响。Glitch可能会导致寄存器的输出状态不确定,从而造成电路故障。因此,设计一个无毛刺(glitch free)的时钟切换电路是至关重要的。
我们要了解毛刺是如何产生的。在数字电路中,如果时钟切换发生在时钟信号的上升沿或下降沿附近,由于异步信号之间的不确定时序关系,可能会导致输出信号出现短暂的错误电平。为了防止glitch的产生,设计时钟切换电路需要遵循的原则是:在选择信号(sel)切换前后,必须确保时钟信号(clk0、clk1)是处于稳定状态的,也就是在非时钟边沿期间进行切换。
在设计无毛刺时钟切换电路时,通常会使用多级D触发器(DFF)来同步选择信号sel,确保其与被选择的时钟信号同频同步。这主要通过在异步输入的sel和同步时钟之间插入一个或多个DFF来实现。这样做可以避免直接在异步状态下切换时钟,从而大大减少毛刺产生的概率。
可以使用带有反馈机制的电路结构来确保切换顺序的安全性。最典型的反馈电路是RS触发器(Reset-Set flip-flop)。利用RS触发器或者类似的结构,可以在一个时钟信号被禁用之前,先激活另一个时钟信号,这样做的好处是可以在切换过程中有一个明确的时钟信号来维持电路的状态,避免因为两个时钟信号重叠或同时无效而引发问题。
在实际的电路设计中,还可以用逻辑门电路(如AND、OR、NOT门)来组合实现无毛刺的时钟切换。例如,可以通过AND门对时钟信号进行门控(gating),然后用OR门来选择输出。为了进一步提高电路的可靠性,通常会在Mux的选择输入端使用同步DFF,以及在gating点处使用两级DFF进行同步,从而确保在进行时钟切换时,所有相关的信号都已稳定。
此外,设计时还需要注意以下几点:
1. 插入的DFF使用不同时钟:对于和clk0同步的DFF,使用clk0作为其时钟;对于和clk1同步的DFF,使用clk1作为其时钟。
2. 两级DFF的时钟边沿选择:第一级DFF可以使用上升沿或下降沿,第二级DFF应当使用下降沿(对于使用AND门gating的电路)或上升沿(对于使用OR门gating的电路),以避免在时钟切换时产生毛刺。
3. 所有的DFF复位值都应为0,以确保在初始化时输出信号处于无效状态。
4. 先禁用再启用的切换顺序:在实际电路中,必须先确保前一个时钟被禁用,之后再启用目标时钟,从而避免两个时钟同时为高电平的情况。
通过上述方法,可以设计出一个可靠的无毛刺时钟切换电路。需要注意的是,虽然上述提到的设计方法是针对简单的两时钟切换,但在复杂的设计中,可能需要使用更多的逻辑门电路和DFF来满足各种特殊的设计要求。设计者需要根据实际的应用场景和要求灵活调整电路设计,以达到最佳的性能。