时钟多路器用于使同一个逻辑功能具有不同的时钟,比如在通信系统中,为了适应不同的数据速率要求,经常要进行时钟切换。有时为了节约功耗,也会把高速时钟切换到低速时钟,或者进行时钟休眠操作。下图是某一类型的时钟多路器:
![clk_mux](https://images2015.cnblogs.com/blog/745855/201509/745855-20150908214210169-1895207226.jpg)
虽然在时钟信号上引入多路逻辑会产生毛刺等问题,但是在不同的应用中,对多路时钟的要求区别很大。时钟切换的最佳途径是使用FPGA内部的专用Clock MUX,这些MUX的反应速度快,锁定时间短,切换瞬间带来的冲击和抖动小。如果器件内没有专用的Clock MUX,应尽量满足如下几点:
- 时钟切换控制逻辑在配置后将不再改变。
- 在时钟切换后,对相关电路复位,以保证寄存器等电路状态不会锁死或者进入死循环。
- 所设计的系统对时钟切换过程发生的短暂错误不敏感。
如果设计中时钟切换很频繁,并且不在复位时切换,设计中也不能允许出现短暂的错误,就必须使用同步设计以确保寄存器没有违背时序,时钟信号上不会出现毛刺等问题。下图是一个无毛刺的时钟多路复用器:
![clk muxlti](https://images2015.cnblogs.com/blog/745855/201509/745855-20150908214211247-1969701223.jpg)
上图的结构适用于任意数量的时钟通道,而且在切换的过程中,可以容许极端的竞争冒险。
以下是时钟多路复用器功能仿真波形图,具体代码请参考下方参考代码链接,同时Altera也提供了对应的IP核,详情请参考Clock Control Block (ALTCLKCTRL) Megafunction User Guide
![RTL](https://images2015.cnblogs.com/blog/745855/201509/745855-20150908214212075-1161590309.jpg)
参考资料
1 Advanced Synthesis Cookbook
2 The Art of Hardware Architecture
3 参考代码