以前有篇文章讲述了时钟切换的时候毛刺(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, 正好利用反馈,让时钟切换按照安全的顺序进行:
(1) 先 gating 住之前选择的时钟
(2) 然后再放开将要选择的时钟
在(1)和(2)之间,输出时钟一直都是无效状态(对于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 的时候需要插入反相器,如下图)
本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念
本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“
课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了
@2003-2020 中国电子顶级开发网