问题描述:
程序中需要转换 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
文章评论(0条评论)
登录后参与讨论