加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

verilog 实现小数分频(小数分频器)

(2010-06-14 15:50:02)
标签:

杂谈

    小数分频无法做到1:1 的占空比。例如用77 分频得到16M 时钟的生成原理如下:对于77 M的时钟,一个sts-12帧有9720拍。对于16M时钟,一个sts-12帧有32*8*8拍。即77M下每计数1215,16M下计数256.1215/256 =4.76 考虑到数字处理只能是整数,则需要在每m 个5拍扣一拍,每 n个4拍扣一拍。列方程为:
        m + n =256

       5m + 4n =1215

得到 m= 191, n = 65, 即通过191个5分频和65个4分频实现16M的时钟。

    小数分频是通过可变分频和多次平均的方法实现的。例如要实现4.7分频,需要在10次分频中做3 次4分频和7次5分频就可以做到,再如实现5.67分频,只要在100次分频中,做67次6分频,33次5分频即可。因为从N分频到N+1分频和从N+1分频到N分频的切换,会产生一个随时间增长的相位移。考虑到小数分频中需要多次进行两种频率分频,必须将两种分频均匀,这种“均匀”工作是通过计数器完成的,这里仅给出一位小数的情况,下面简要介绍这种混合的方法:

   每进行一次分频,计数值为10减去分频系数的小数部分,各次计数值累加。若累加结果小于10,则进行 N +1 分频,若大于或等于10,则进行 N 分频。以8.7 分频为例进行设计时,需要进行3次 8分频,7次 9 分频。该例中计数值(10-7)=3,前三次累加结果都小于10,所以为9分频,第四次累加结果为12,则去掉十位数后累加结果变为2,同时进行8分频,下表给出了该分频器的分频过程。
           分频系数8.7

--------------------------------------

序号           累加结果       分频系数

                              9

                               9

                               9

           12-10 =2              8

                               9

                               9

           11-10 =1              8

                               9

                               9

 10             10                 8

以下是代码模块:

//top module

module fd89bits( clkin,reset,a,clkout
    );
  input clkin;
    input reset;
  input a;
    output reg clkout;
      
    wire clkout1,clkout2;  
  
   fd8bits  dut1(clkin,reset,clkout1);
   fd9bits  dut2(clkin,reset,clkout2);
 
   always@(posedge clkin) begin
     if(a)
        clkout <= clkout1;
     else
        clkout <= clkout2;
   end
endmodule

`timescale 1ns / 1ps
module fd8bits(
  clk_in,reset,clk_out  );
 
  input clk_in;
  input reset;
  output reg clk_out;
 
  reg[3:0] count;
 
  always@(posedge clk_in) begin
    if(!reset)
     count <= 0;
  else begin
     if(count  < 7)
         count  <= count + 1;
     else
     count  <= 0;
  end

   clk_out  <= count[2];

 end
endmodule

// 9 分频

module fd9bits(
    clk_in,reset,clk_out  );
 
  input clk_in;
  input reset;
  output reg clk_out;
 
  reg[3:0] count;
 
  always@(posedge clk_in) begin
    if(!reset)
     count <= 0;
  else begin
     if(count  < 8)
         count  <= count + 1;
     else
     count  <= 0;
  end

   clk_out  <= count[2];

 end
endmodule

// testbench

module testbench(
    );
 
  reg clk_in;
  reg reset;
  reg a;
  wire clk_out;
  
  fd89bits dut(clk_in,reset,a,clk_out);
 
  initial begin
    clk_in= 0;
  reset = 0;
  #11;
  reset = 1;
  forever begin
  a = 1;
  #60;
  a = 0;
  #20;
  a = 1;
  #40;
  a = 0;
  #20;
  a = 1;
  #40;
  a = 0;
  #20;
  end
   end
 
 always #10 clk_in = ~clk_in;
endmodule

//result 

http://s8/middle/6840802c488f8945496f7&690实现小数分频(小数分频器)" TITLE="verilog 实现小数分频(小数分频器)" />

 

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有