关注公众号

关注公众号

手机扫码查看

手机查看

喜欢作者

打赏方式

微信支付微信支付
支付宝支付支付宝支付
×

防止毛刺的时钟切换电路的设计思想

2020.10.26

  以前有篇文章讲述了时钟切换的时候毛刺(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, 正好利用反馈,让时钟切换按照安全的顺序进行:

  (a)。 先 gating 住之前选择的时钟

  (b)。 然后再放开将要选择的时钟

  在(a)和(b)之间,输出时钟一直都是无效状态(对于2and + 1or 的 mux 来说,无效状态就是 0)

  (6) 按照上面的分析,得到电路如下:

  防止毛刺的时钟切换电路的设计思想

  注意几点:

  (1) 对 s0插入的 DFF 需要用 clk0 作为时钟, 对于 s1插入的 DFF 需要用 clk1 作为时钟。

  (2)后一级的 DFF 必须使用 clock 下降沿,因为是用 AND 门进行 gating(如果用上升沿,则更容易出现毛刺)。如果换成 2 个 OR+1个 AND 的 MUX, 则必须用上升沿。

  (3)必须插入两级 DFF 防止 metal stable, 前一级可以用上升沿,也可以用下降沿,用上升沿是为了节省时间。

  (4)所有的 DFF 复位值都是 0,即让 clk_out 处于无效状态。

  (5)必须满足先 gating 后放开的顺序,如果不满足,可以在G0/G1 处各插入一个反相器。(用 part0_b搭配 part1 的时候需要插入反相器,如下图)

  防止毛刺的时钟切换电路的设计思想

  (6)搭配不同的 part0电路和part1 电路,经过稍许修改,都可以完成防毛刺切频电路的设计。


推荐
关闭