热度 11
2015-11-20 09:07
1522 次阅读|
0 个评论
问题描述: 程序中需要转换 50MHz 和16MHz 时钟,我直接用一个信号来控制两个时钟的切换,而 这个信号是被 8MHz 时钟同步的。结果就悲剧了。 解决方法: 一、使用器件内建 多路时钟选择器。 xilinx 器件中提供了 BUFGMUX,altera 中Cyclone II 以上提供 ALTCLKCTRL。两者都是 glitch-free clock multiplexer。 【参见 Ensure glitch-free switchover implementation 】 二、自己设计多路时钟选择器 很不幸,我用的是 Cyclone,木有 ALTCLKCTRL。 法一: 先使用三态 TRI 单元,控制时钟的输出,然后再让时钟通过一般的 MUX,这样子的话,次序应该是首先把原来的时钟通过三态电路Disable掉,然后打开另外一个三态电路,输出时钟,同时,Mux 根据控制信号选择新的时钟。 【参见 Alter FPGA 与 Xilinx FPGA 的优缺点比较 】 法二: 更为具体的做法,我准备尝试。但是难点在于:时钟要经过多路时钟选择器,而该时钟域的使能、地址和数据信号也要分别经过多路选择器,那么如何让经过多路选择器后的时钟、使能、地址和数据信号依然保持同步是一个问题。 这个还需要请教高人 。 【参见 Techniques to make clock switching glitch free】 三、方案重制定 由于上面的问题,没有把握,而时间又紧,所以决定更改策略: 50MHz 使用单独一路DP RAM,16MHz 使用两路 DP RAM 进行乒乓操作。那么只需要使能、地址和数据信号通过多路选择器;为了让选择信号与16MHz 时钟同步,进而满足建立保持时间,需要用16MHz 时钟打一下。 转载:http://www.eetop.cn/blog/html/30/523930-24957.html