在实际应用中,还经常会遇到小数分频。实现小数分频经常采用两种方法。
1、方法一用数字锁相环实现,先利用锁相环电路将输入时钟倍频,然后再利用分频器对新产生的高频信号进行分频得到需要的时钟频率。例如要实现5.7分频,可以先将输入的时钟10倍频,然后再将倍频后的时钟57分频,这样即可以精确实现5.7的小数分频。这样的好处可以做到精确分频。但是需要器件包含锁相环电路,但有的FPGA器件内部是不包含锁相环电路的,因此这种方法一般只在某些对信号频率精度要求较高的场合下或者所使用的器件支持的情况下使用
2、方法二是先设计两个不同分频比的整数分频器,然后通过控制两种分频比出现的不同次数来获取所需要的小数分频值,从而实现平均意义上的小数分频。分频比可以表示为
N=M/P 式中,N表示分频比;M表示分频器输入脉冲数;P表示分频器输出脉冲数。当N为小数分频比时,又可以表示为
N=K+10^(-n)X
式中K、n和X都为正整数,n表示小数的位数。
由以上两式可得M=(K+10^(-n)X)P,令P=10^(n),有M=10^n *K+X,即在进行(10^n)K分频时多输入X个脉冲。
下面实现一个分频系数为8.1的小数分频器。通过计数器先做9次8分频,再做一次9分频,这样总的分频值为:N=(8*9+9*1)/(9+1)=8.1
test.v
module test(clk_in,rst,clk_out);
input clk_in,rst;
output clk_out;
reg clk_out;
reg[3:0] cnt1;
reg[3:0] cnt2;
always@(posedge clk_in or posedge rst)
begin
if(rst)
begin
cnt1<=0;cnt2<=0;clk_out<=0;
end
else if(cnt1<9)
begin
if(cnt2<7)
begin
cnt2<=cnt2+1;clk_out<=0;
end
else
begin
cnt2<=0;cnt1<=cnt1+1;clk_out<=1;
end
end
else begin
if(cnt2<8)
begin cnt2<=cnt2+1;clk_out<=0;
end
else
begin
cnt2<=0;cnt1<=0;clk_out<=1;
end
end
end
endmodule