时钟切换电路 clock switch

转:https://blog.csdn.net/u014070258/article/details/90052426

 

在设计多时钟系统中,需要切换时钟源,这两个时钟可能是没有关联的(相位、频率),或者他们为倍数关系。这两种情况都有可能在开关时产生毛刺(glitch),而系统上的毛刺对系统来说是危险的,他可能能够被一些寄存器捕获为触发边沿,而其他寄存器忽略此毛刺。  、

时钟切换的简单实现

在这种情况下就会出现毛刺,产生这种问题的根本原因是切换控制信号相对于时钟信号可以在任何时间里发生改变,本质是切换信号为异步信号。 任何时钟的高电平状态下的切换都需要避免

 

当两个输入时钟之间是倍数关系时,插入下降沿触发触发器确保切换只发生在时钟为低电平时候,引入输出反馈确保另外一路的时钟为低电平时候发生切换,

上述电路的缺点 没有解决异步的问题,有可能会出现亚稳态问题,

下面电路第一级通过锁定数据来帮助稳定数据,然后将数据传递到下一级

 

 

 

 

ALTER推荐的时钟切换电路图

/***************************************************

*无毛刺切换时钟,要点

*    1、clkx_synx 复位后为0

*    2、在高电平状态下不切换时钟

*    3、同步寄存器为posedge 触发

*    4、最后一级为 negedge 触发,确保切换发生在时钟为低电平

****************************************************/


 
 
  1. module clk_mux(
  2. input rst,
  3. input clk1,
  4. input clk2,
  5. input sel,
  6. output m_clk
  7. );
  8. reg clk1_syn1;
  9. reg clk1_syn2;
  10. reg clk2_syn1;
  11. reg clk2_syn2;
  12. /*同步寄存器*/
  13. always @(posedge clk1 or negedge rst)
  14. if(!rst)
  15. clk1_syn1 <= 1 'b0;
  16. else
  17. clk1_syn1 <= sel & (~clk2_syn2);
  18. always @(negedge clk1 or negedge rst)
  19. if(!rst)
  20. clk1_syn2 <= 1 'b0;
  21. else
  22. clk1_syn2 <= clk1_syn1;
  23. /*同步寄存器*/
  24. always @(posedge clk2 or negedge rst)
  25. if(!rst)
  26. clk2_syn1 <= 1 'b0;
  27. else
  28. clk2_syn1 <= (~sel) & (~clk1_syn2);
  29. always @(negedge clk2 or negedge rst)
  30. if(!rst)
  31. clk2_syn2 <= 1 'b0;
  32. else
  33. clk2_syn2 <= clk2_syn1;
  34. assign m_clk = (clk1 & clk1_syn2) | (clk2 & clk2_syn2);
  35. endmodule

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值