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

时间:2026-01-20

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

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

小数分频无法做到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

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

序号 累加结果 分频系数

1 3 9

2 6 9

3 9 9

4 12-10 =2 8

5 5 9

6 8 9

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

7 11-10 =1 8 8 4 9 9 7 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;

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

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;

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

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

…… 此处隐藏:56字,全部文档内容请下载后查看。喜欢就下载吧 ……
verilog 实现小数分频(小数分频器)代码.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219