1.
偶数倍(
2N
)分频
使用一模
N
计数器模块即可实现,即每当模
N
计数器上升沿从
0
开始计数至
N-1
时,输出时钟进行翻转,
同时给计数器一复位信号使之从
0
开始重新计数,以此循环即可。偶数倍分频原理示意图见图
1
。
2.
奇数倍(
2N+1
)分频
(
1
)占空比为
X/(2N+1)
或(
2N
+
1-X
)
/
(
2N+1
)分频,用模(
2N
+
1
)计数器模块可以实现。取
0
至
2N-1
之间一数值
X(0
,
当计数器时钟上升沿从
0
开始计数到
X
值时输出时钟翻转一次,
在计数器继续计数达到
2N
时,输出时钟再次翻转并对计数器置一复位信号,使之从
0
开始重新计数,即可实现。
(
2
)占空比为
50
%的分频,设计思想如下:基于(
1
)中占空比为非
50
%的输出时钟在输入时钟的上升沿
触发翻转;若在同一个输入时钟周期内,此计数器的两次输出时钟翻转分别在与(
1
)中对应的下降沿触发
翻转,输出的时钟与(
1
)中输出的时钟进行逻辑或,即可得到占空比为
50
%的奇数倍分频时钟。当然其
输出端再与偶数倍分频器串接则可以实现偶数倍分频。奇数倍分频原理示意图见图
2
。
(这也是许多公司常
出的面试题,
^_^
,是不是很简单?)
3. N-0.5
倍分频
采用模
N
计数器可以实现。
具体如下:
计数器从
0
开始上升沿计数,
计数达到
N-1
上升沿时,
输出时钟需翻
转,由于分频值为
N-0.5
,所以在时钟翻转后经历
0.5
个周期时,计数器输出时钟必须进行再次翻转,即当
CLK
为下降沿时计数器的输入端应为上升沿脉冲,使计数器计数达到
N
而复位为
0
重新开始计数同时输出
时钟翻转。这个过程所要做的就是对
CLK
进行适当的变换,使之送给计数器的触发时钟每经历
N-0.5
个周
期就翻转一次。
N-0.5
倍:取
N=3
,分频原理示意图见图
3
。
对于任意的
N
+
A/B
倍分频(
N
、
A
、
B
∈
Z
,
A
≦
B
)
分别设计一个分频值为
N
和分频值
N
+
1
的整数分频器,采用脉冲计数来控制单位时间内两个分频器出现
的次数,从而获得所需要的小数分频值。可以采取如下方法来计算个子出现的频率:
设
N
出现的频率为
a
,则
N
×
a
+(
N+1
)
×
(
B-a
)=
N
×
B
+
A
求解
a
=
B-A;
所以
N
+
1
出现的频率为
A.
例
如实现
7
+
2/5
分频,取
a
为
3
,即
7
×
3
+
8
×
2
就可以实现。但是由于这种小数分频输出的时钟脉冲抖动很大,
现实中很少使用。
通常实现偶数的分频比较容易,以十分频为例
:
always @( posedge clk or posedge reset)
if(reset)
begin
k<=0;
clk_10<=0;
end
else
if(k==4)
begin
k<=0;