小数分频超详解+实例

小数分频原理

在没有数字锁相环的情况下,要实现小数分频的方法是:
先设计两个不同分频比的整数分频器,然后通过控制两种分频比出现的不同次数来获得所需的小数分频值,从而实现平均意义上的小数分频。

假设我们需要进行5.3分频,那么5.3可以写为53/10,因为:
53/10=5…3
商为5,余数为3

那么我们就可以通过5(商)分频和8(商+余数)来实现5.3分频。
现在我们来确定5分频和8分频的次数,设5分频的次数为a,8分频的次数为b;
那么应该有:
a+b=10(除数)
5a+8b = 53(被除数)
解得a=9,b=1,也就是说通过9次5分频和1次8分频可得到5.3分频。

下面我们直接来看Verilog程序。

Verilog源代码

module fdiv5_3(clk_in,rst,clk_out);
input clk_in,rst;
output reg clk_out;
reg [3:0] cnt1,cnt2;
always @(posedge clk_in or posedge rst)
begin
 if(rst)
   begin
  cnt1<=0;
  cnt2<=0;
  clk_out<=0;
 end
 else if(cnt1<9)   //9次5分频,9=a;
 begin 
  if(cnt2<4)     //5
  begin
   cnt2<=cnt2+1;
   clk_out<=0;
  end
  else 
  begin
   cnt2<=0;
   cnt1<=cnt1+1;
   clk_out<=1;
  end
 end
 else 
 begin
  if(cnt2<7)   //1次8分频
  begin
   cnt2<=cnt2+1;
   clk_out<=0;
  end
  else
  begin
   cnt2<=0;
   cnt1<=0;
   clk_out<=1;
  end
 end
end

endmodule

相对应的testbench如下:

testbench

initial                                                
begin                                                  
clk_in=0;
rst=0;

#5000 $stop;                                      
$display("Running testbench");                       
end 
                                                   
always                                                               
begin                                                  
#5 clk_in=~clk_in;                                       
end              

modelsim仿真波形

小数分频超详解+实例_第1张图片
小数分频超详解+实例_第2张图片

从最后的仿真波形可以看到前面9次分频与第10次分频的周期不同,在testbench中设定输入的时钟信号clk_in的周期是10ns,经过5.3分频后,输出信号clk_out的10个周期所占的时间应为53ns。

若文档有任何错误或不足,欢迎在博客下方留言指正;

你可能感兴趣的:(EDA)