正文
以前有篇文章讲述了时钟切换的时候毛刺(glitch)带来的危害,以及如何设计防止毛刺发生的时钟切换电路。但是没有讲到电路设计的构思从何而来,大家看了之后知道直接用这个电路,但是假如不看这篇文章,自己从头设计还是无从下手。
在这里,换另外一个角度,通过电路设计技巧来阐述防毛刺时钟切换电路的设计思路。
希望看过之后,不用参考文章就能够自己设计出这个电路。
对于一个时钟切换电路,输入两个异步时钟 clk0、clk1,以及一个选择信号 sel。
(1) 假设不考虑 glitch,直接使用Mux 就可以完成切频。电路如下:
由于 clk0/clk1/sel 之间是异步关系,时钟切换会发生在任意时刻,有一定的概率会发生glitch. glitch 的危害文章里已经详述,这里不再重复。
(2)
由于 sel 和 clk0 和 clk1 都是不同步的,我们可以从 sel 同步的方向入手,假如 sel 需要和 clk0和 clk1
进行同步,那么 sel 必须分成两路,一个和 clk0 同步,一个和 clk1 同步,同步之后的 sel 讯号再和 clk0/clk1
gating 起来,就可以让问题简单化。为了将 sel 分成两路,并且 clk0/clk1 需要分别 gating, 那么可以将 mux
逻辑用and/or设计出来,如下:
当然此 Mux 电路还可以用两个 or 加上一个 and来实现,都可以。注意 G0 和 G1 两点就是分别对 clk0 和 clk1进行 gating. 将来会在 G0/G1 点插入同步 DFF.
(3) 将上面电路拆开成两部分,一部分电路通过 sel 产生 sel+和sel-两路,另一部分电路是 gating mux 电路, 如下:
只需要将 sel-接上 G0, sel+接上 G1 就是一个 mux电路。将电路分开,是为了后续技巧性的功能替换。
(4) 将 part0 电路换成同样功能的带反馈的组合电路(为何要这样做,属于电路设计直觉和技巧)。最常见带反馈的电路是 RS 触发器,因此可以将 part0 换成如下电路。
(5) 将 part0_a 或者part0_b 替换 part0 电路,功能不变。如下:
不过,此时插入同步DFF 的地方就多了一个选择,如果直接在G0, G1 插入同步 DFF, clk0 和 clk1 的 gating时间先后顺序不确定,还是有可能发生毛刺。而在 s0 和 s1 处插入同步
DFF, 正好利用反馈,让时钟切换按照安全的顺序进行: