Clock-Divider
问题
-
实现一个时钟分频电路,无论是奇数分频、偶数分频还是小数分频。
-
通过输入任意切换分频,即从一种分频时钟无缝切换到另一种分频时钟。
分类
整数
计数分频
最容易想到的就是行为级描述Verilog通过计数来进行分频操作。
偶分频
观察偶数偶分频的时序图如下(假设分频数为N
):
对于2
分频,需要cnt=0
时,clk_div<=1
;cnt=1
时,clk_div<=0
;
对于4
分频,需要cnt=0,1
时,clk_div<=1
;cnt=2,3
时,clk_div<=0
;
对于6
分频,需要cnt=0,1,2
时,clk_div<=1
;cnt=3,4,5
时,clk_div<=0
;
所以,对于N
分频(偶数),
-
clk_div
只要在cnt<(N>>1)
(小于N/2
)时,clk_div<=1
, -
clk_div
其余时候(大于N/2
小于N
),clk_div<=0
;
奇分频
其实奇数分频可以参考偶数分频来做(假设分频数为N
),两种方法可以简单的想象为+1
法或-1
法。
举例而言,假设需要5
分频的时钟,则可以通过半周期的4
分频时钟+1
半周期(取或
),或是通过半周期的6
分频-1
半周期(取与
)来实现;时序图如下:
其逻辑就是4+1=5
或6-1=5
:
观察奇数分频的时序图,假设5
分频,则
+1
法取或
需要cnt=0,1
时,clk4_p<=1
,cnt=2,3,4
时,clk4_p<=0
;(占空比4:6
)
需要clk4_p+1
比clk4_p
晚半个时钟
,下降沿
触发;
clk_div
等于clk4_p
和clk4_p+1
的或
-1
法取与
需要cnt=0,1,2
时,clk6_p<=1
,cnt=3,4
时,clk6_p<=0
;(占空比6:4
)
需要clk6_p-1
比clk6_p
早半个时钟
,下降沿
触发;
可以发现这样无法通过clk6_p
生成clk6_p-1
,因此这里应该先通过下降沿
触发的方式构造clk6_p-1
,再通过晚半个时钟
,上升沿
触发的方式构造clk6_p
;即如下时序图:
需要cnt=0,1,2
时,clk6_n<=1
,cnt=3,4
时,clk6_n<=0
;(占空比6:4
)
需要clk6_n+1
比clk6_n
晚半个时钟
,上升沿
触发;
clk_div
等于clk6_n
和clk6_n+1
的与
所以,对于N
分频(奇数,假设分频数为N
)可以总结规律:
这里只写
+1
法的规律,-1
法同理可得其规律
-
clkN-1_p
只要在cnt<(N>>1)
(小于N/2
)时,clk_div<=1
; -
clkN-1_p
其余时候(大于N/2
小于N
),clk_div<=0
; -
clkN-1_p+1
比clk4_p
晚半个时钟
,下降沿
触发; -
clk_div
等于clk4_p
和clk4_p+1
的或
示例:
1 | module clk_div #(parameter N = 3) |
仿真:
通用法
偶数分频其实就是奇数分频计算的其中一个时钟而已,因此可以通过判断奇偶进行分频切换。
假设只是参数化配置为任意分频时钟:
1 | module clk_div #(parameter N = 3) |
如果需要随时可切换,则需要一个输入信号n
。需要注意几个点:
- 另外为了防止切换时出现异常,应至少等待到上一次分频信号输出完成(即
cnt
计满)才能进行切换; - 初始化时必须的预设置一个
num
,否则计数器无法启动; - 以上代码没有考虑
N=1
的情况,即原时钟输出的情况;
示例:
1 | module clk_div #(parameter WIDTH = 4) |
仿真:
级联分频
结构级描述应该侧重于考虑级联生成时钟
如果偶数分频系数是2的幂,就可以用2分频器级联得到;例如4分频就是两个2分频级联,用两个2分频器级联得到4分频器,以此类推。同理可得,数分频系数是3的幂,就可以用3分频器级联得到,以此类推。级联可以减少计数器的使用,从而减少电路设计中的组合逻辑大小。
小数
通用法
小数分频的具体的电路实现方法可参考时钟分频系列——分数分频电路的Verilog实现 - 知乎。由于参考文章的作者讲的不够清晰易懂,这里重新叙述一遍其原理,但不再进行电路实现。
举例子最容易理解。例如需要实现一个1.3
分频时钟,那么等效于在原时钟进行13
个时钟周期,输出的时钟正好完成10
个时钟周期。可能的一种时序图如下:
这里先输出7
个1
分频的时钟,再输出3
个2
分频的时钟,得到10
个时钟正好是原时钟13
个时钟的完成时间。
总结上述过程,小数分频满足的条件是:
1 × 7 + 2 × 3=13
7 + 3 = 10
即
div1 × A + div2 × B = N × 10n+m
A + B = 10n
以上二元一次方程组的整数解即是用两个分频时钟凑小数分频的解法。
其中,
div1和div2分别代表分频系数
A和B分别代表两个分频时钟的个数
10n
代表其为10
的幂次,N
代表其个数m
为实际的小数部分(3
),0<m<10n
再以时钟分频系列——分数分频电路的Verilog实现 - 知乎举例,假设分频系数6.432
,则可以取10n=1000
,N=6
,m=432
。
下面介绍通用解法:
将A = 10n- B
代入得:
div1 × (10n - B) + div2 × B = N × 10n+m
整理得:
div1 × 10n + (div2-div1) × B = N × 10n+m
根据等式两边的形式,可以看出此等式一定存在一种解,就是div1 = N
,(div2-div1)×B = m
;更特殊的话,解可以是div1 = N,div2 = N + 1,B = m
。
在1.3
分频的例子中,即是div1 = 1, div2 = 2, B = 3
;
在6.432
分频的例子中,即是div1 = 6, div2 = 7, B = 432
。
因此,这里存在一种通用解法,取
div1 = N , div2 = N + 1, B = m, A = 10n-m
即可。
构造的两个分频时钟为:10-m
个分频系数为N
的时钟 + m
个分频系数为N+1
的时钟。
在1.3
分频的例子中,即是构造7
个分频系数为1
的时钟 + 3
个分频系数为2
的时钟。
在6.432
分频的例子中,即是构造568
个分频系数为6
的时钟 + 432
个分频系数为7
的时钟。
衍生
构造方法
由于此问题的本质是解上述二元一次方程组的整数解,因此除了此通用方法之外,肯定存在其他多种解法,只要满足方程式就可以。
-
倒退一步
在
6.432
分频的例子中,此时若不考虑特殊的通用解,往前倒退一步,由公式知:div1 = 6
,(div2-6)×B = 432
。由于
432 = 24 × 33
可分解,因此可以不取div2=7,B=432
的解,比如:div2-6 = 2,B = 23 × 33
,即div2=8, B=216
也是一种解法,此时构造784
个分频系数为6
的时钟 +216
个分频系数为8
的时钟。由于
8
分频时钟构造上比7
分频简单(级联分频),而计数器的使用位宽应相当,因此此种构造方法可能
更省资源。 -
倒退两步
在
6.432
分频的例子中,此时若不考虑特殊的通用解,往前倒退两步,由公式知:div1 × 10n + (div2-div1) × B = N × 10n+m
即
div1 × 1000 + (div2-div1) × B = 6000 + 432
那么
div1
完全可以不取6
,由于div1
为分频系数,因此取4
比较合理,这样化简为:(div2-4) × B = 2000 + 432
由于
2432 = 27 × 19
可分解,由于div2
为分频系数,取div2=8,B=608
即是一种解法,此时构造392
个分频系数为4
的时钟 +608
个分频系数为8
的时钟。级联分频构造4
分频和8
分频时钟就更简单了。 -
倒退回开始
在
6.432
分频的例子中,此时若不考虑特殊的通用解,往前倒退回最开始的位置,由公式知:div1 × A + div2 × B = N × 10n+m
A + B = 10n
即
div1 × A + div2 × B = 6432
A + B = 1000
由于这是通过两个分频时钟凑小数分频的解法,那么其实逻辑上也可以通过更多个分频时钟凑小数分频。
比如
div1 × A + div2 × B + div3 × C = 6432
A + B + C= 1000
更多的分频自然意味着更多的可能性,当然最终的逻辑资源消耗就得根据结果具体分析了。
分频方法
假设在前一步通过各种构造方法完成了分频时钟的选择,分频的方法也存在多种选择
的可能。
在1.3
分频的例子中,假定已经选择构造7
个分频系数为1
的时钟 + 3
个分频系数为2
的时钟。除了一开始示意的时序图:
-
先做
7
次1
分频,再做3
次2
分频还有可能的分频方法是将
2
分频的时钟放在前面,即如下时序图: -
先做
3
次2
分频,再做7
次1
分频还有可能的分频方法是将
2
分频的时钟穿插在1
分频的时钟的中间(混频),即如下时序图: -
3
次2
分频穿插在7
次1
分频中同样的,可以将
1
分频的时钟穿插在2
分频的时钟的中间(混频),即如下时序图: -
7
次1
分频穿插在3
次2
分频中
根据时钟分频系列——分数分频电路的Verilog实现 - 知乎的说法,
第1、2种情况前后时钟频率不太均匀,因此相位抖动比较大;
第3、4种情况前后时钟频率均匀性稍好,因此相位抖动会减小。
占空比
挖坑占座。主要参考 2020年大疆芯片开发工程师笔试真题解析-单选部分 - 知乎
参考资料
[1] 时钟分频系列——偶数分频/奇数分频/分数分频 - 知乎
[2] 时钟分频系列——分数分频电路的Verilog实现 - 知乎
[3] IC/FPGA校招笔试题分析(二)任意切换的时钟分频电路_Reborn Lee-CSDN博客
[4] Verilog设计分频器(面试必看) - Zhangxianhe - 博客园 (cnblogs.com)
[5] 备战秋招-手撕代码篇-奇数分频