门控时钟、使能时钟的实现

来源:互联网 发布:十大禁书网络 编辑:程序博客网 时间:2024/04/28 18:03
在编写FPGA的时候我们常常会遇到这样的问题:全局时钟的频率太高了,某些模块需要频率更低的时钟来驱动,总是调用pll太浪费资源了。现在说说这种时候该怎么办


1. 门控时钟分频
门控时钟就是通过计数的方式来实现对全局时钟的分频,满足你对低频时钟的需求。
基于计数器的分频器不说了太基础了,现在说说非整数分频怎么实现。非整数分频有两种方法,分别为交错法和累加法。


a. 交错法
交错法其实就是用两种整数分频交替出现使得总结果与原非整数分频等效
举个例子,要实现8.3分频,那么就可以用x次8分频和y次9分频交替来实现。满足(8x+9y)/(x+y)的一切x和y都可以。所以x=7,y=3就满足条件。即7次8分频和3次9分频交替出现。
设原时钟频率为f,即1s有f个时钟脉冲,8.3分频就是实现8.3s有f个时钟脉冲。7次8分频的结果为56s有7f个时钟脉冲,3次9分频的结果为27s有3f个时钟脉冲,合起来就是83s有10f个时钟脉冲,即8.3s有f个时钟脉冲,就实现了与8.3分频等效。


b. 累加法
类加法就是用一个计数器来实现非整数分频
设要实现a/b分频(a>b),设一个计数器x从0开始自加,每个clk自加b. x>=a/2时cllkout = ~clkout,x>=a时clkout = ~clkout同时x <= x - a(变相的求余数)。记住一定要对x的每种状态都做上述的判断,这样输出的clkout才会是a/b分频。
举个例子,仍然是8.3分频,需要先把8.3写成166/20,不写成83/10是因为83不能被2整除。那么寄存器x的两个阈值就分别为83和166,自加步长为20,分频器就完成了。下面验证clkout的是不是8.3分频。
x的自加步长为20,那么自加166次本来的应该20*166,花费的时间是166clk. 因为每到大阈值就取一次余数因此自加166次共计有20*166/166=20次到达过大阈值。因此这166次自加共计输出20个时钟脉冲,即166clk有20个时钟脉冲,即8.3clk有1个时钟脉冲,所以8.3s有f个时钟脉冲,8.3分频没有问题。


2. 使能时钟
使能时钟的思路是这样的,保持全局时钟不变,也不增设新的时钟,而是通过使能信号控制下一级工作。

举个例子全局时钟是f,下一级的工作频率为f/10. 那么就可以在上一级每10个clk输出一个有效的使能信号,而下一级只有接收到有效的使能信号时才工作,这样下一级的输入时钟仍然是f,但是工作频率却是达到了f/10. 就满足了需求。使能时钟的性能和效率都要优于门控时钟,因此在条件允许的情况下推荐使用使能时钟。


转自:http://blog.sina.com.cn/s/blog_bf8ab3180102wgue.html