参考资料:

无毛刺时钟切换电路

实时的时钟切换的问题

使用 AND-OR 门组成 MUX,可以得到一个时钟切换电路,但是,当 SELECT 的值发生变化,输出时钟从当前的时钟源切换到下一个时钟源时,可能会产生毛刺。
ClkSwMUX.png

存在的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
{ signal: [
{ name: "CLK0", wave: "p..", period: 1 },
{ name: "CLK1", wave: "p......h", period: 0.3 },
{ name: "SELECT", wave: "0..........1.................." , period: 0.1 },
{ name: "CLKOUT", wave: "h....l....hlh.l.h.l.h.l.h.l.h." , period: 0.1, node: '...........ab'},
],
config: { hscale: 5 },
head:{
text:'在 a-b 之间,输出时钟发生了截断,导致毛刺的产生',
tick:0,
every:1
},
}
  1. SELECT 控制信号至少与其中一个时钟源异步;
  2. SELECT 控制信号与时钟信号构成门控时钟,为了防止时钟被截断,只能在时钟低电平的时发生改变。

倍频时钟的无缝切换

解决方法:在每个时钟源的选择路径上,都插入一个下降沿有效的 D 触发器。

  • 在时钟的每个下降沿寄存选择控制信号 SELECT,并且只有在其他时钟的选择被释放后(无效后)才会使能新的时钟选择,这样对输出毛刺问题进行很好的解决。
  • 在时钟的下降沿处寄存选择控制信号,保证了控制信号不会在两个时钟源的高电平处进行跳变,这样就防止对输出时钟进行截断(导致毛刺)。
  • 一个时钟的选择反馈到了另一个时钟(Qˉ\bar{Q}),这种反馈机制使得门控开关在选择输出下一个时钟之前,必须先取消当前时钟的输出选择,这样避免了任何可能出现的毛刺 Glitch。

假设此时 SELECT 在适中的高电平处进行了跳变,由于与门作用,需要等待其另一个时钟触发的寄存器输出 Qˉ\bar{Q} 也变化为 1 时,与门的结果  SELECT-1 才会变化,而 Qˉ\bar{Q} 的变化需要等待到时钟的下降沿才会变化,所以经过处理后的 SELECT-1 信号的跳变只发生在时钟的低电平处。

如图 2-2 的时序图所示为 SELECT 选择信号从 0 到 1 变化时是如何影响的输出 OUT CLOCK 的波形。首先在 CLK0 的下降沿停止 CLK0 在 OUT CLOCK 上的输出,然后在紧接着的 CLK1 的下降沿开始输出 CLK1。
无毛刺切换倍频时钟电路.png

1
2
3
4
5
6
7
8
9
10
11
12
13
{ signal: [
{ name: "CLK0", wave: "p..", period: 1 },
{ name: "CLK1", wave: "p......h", period: 0.3 },
{ name: "SELECT", wave: "l..........h.................." , period: 0.1 },
{ name: "CLKOUT", wave: "h....l....h....l....h.l.h.l.h." , period: 0.1, node: '...........a...b..c'},
],
config: { hscale: 5 },
head:{
text:'在 a 处,SELECT 信号变化,在 b 处,时钟 CLK0 关闭,在 c 处,时钟 CLK1 打开',
tick:0,
every:1
},
}

在这个电路中有 3 条时序路径需要特别考虑:

  1. SELECT 控制信号到任意一个下降沿有效的触发器 ;
  2. DFF0 的输出到 DFF1 的输入;
  3. DFF1 的输出到 DFF0 的输入。

如果这三条路径中的任一路径上的信号在目的寄存器时钟的捕获沿时发生变化,则寄存器的输出有一定的机会会进入亚稳态,这意味着会进入理想的 0 和 1 之间的一个状态。(在此例中,捕获沿均为下降沿)。

亚稳态经过一段时间后会 随机的 稳定为 0 或者 1,这就导致两个寄存器可能采集到不同的值(一个认为是 0,而另一个认为是 1)。因此,这就要求两个寄存器捕获沿和 对 SELECT 信号的发起沿分开,以避免任何可能的异步接口。由于两个时钟源的时序关系是已知的,所以上述可以通过使用恰当的多周期约束(multi-cylce hold)或者最小延时(minimun delay)约束来实现。

在芯片的启动时,DFF0 和 DFF1 两个寄存器都应该复位为 “0” 状态,这样在最开始时,两个时钟都没有被选中输出。通过在 “0” 状态下起点两个触发器,时钟开关内置了容错功能。
假定在启动时有个错误导致其中一个时钟没有进行翻转。如果使用这个错误时钟的触发器的初始状态是“1”状态,而此时这个触发器由于没有时钟的翻转边沿触发,所以导致该寄存器的输出状态不变,这就阻止了对另一个时钟的选择。通过让两个寄存器都以 “0” 状态开始,那么即使有一个时钟没能正常的工作,另一个正常的时钟也能通过门控输出。

异步时钟的无缝切换

当两个时钟源完全不相关时,异步行为可能来自 SELECT,也可能来自另一个时钟域的异步的反馈信号。

如图 3-1 所示,对每个时钟源路径上,各增加一个该时钟源上升沿驱动的触发器来避免亚稳态

  • 上升沿有效的触发器可以减少SELECT信号和异步反馈信号导致的亚稳态现象.
  • 下降沿有效的触发器可以保证SELECT信号在时钟源的低电平处跳变.
  • 反馈信号可以保证在输出下一个时钟之前已经取消了上一个时钟的输出.

时钟无毛刺切换电路.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{ signal: [
{ name: "CLK0", wave: "h....l....h....l....h....l....h....l", period: 0.1 },
{ name: "CLK1", wave: "p........", period: 0.3 },
{ name: "SELECT", wave: "l..........h........................" , period: 0.1 },
{ name: "CLKOUT", wave: "h....l....h....l....h....l......h.l." , period: 0.1, node: '...........a........b....c..d.e'},
],
config: { hscale: 5 },
head:{
text:'在 a 处,SELECT 发生变化,在 b 处,时钟 CLK0 上升沿采样,在 c 处,时钟 CLK0 下降沿采样后关闭',
},
foot:{
text:'在 d 处,时钟 CLK1 上升沿采样,在 e 处,时钟 CLK1 下降沿采样后打开,完成时钟切换。',
},
}