分频器的设计

 分频器的设计

内容:

  1. 通用分频器;
  2. 偶分频;
  3. 奇分频;
  4. 半数分频。

 

实现:

  1. 通用分频器

分频公式

 

N是分频系数。

通用分频器的实现方法:应用N进制计数器,将要被分频的信号作为计数器的时钟脉冲,分频信号作为输出。取M值在计数到0N-1期间,0-M设置输出为低,M-N-1设置为高。M可调。

//通用N分频器

module fp_N (

    input clk,

    input en, //使能信号

    input [11:0]N, //分频系数

    input [11:0]M, //高低电平分界值

    output fp_out

);

 

reg [11:0]cnt;

 

assign fp_out=(cnt<M)?1'b0:1'b1; //PWM

 

//分频过程

always @(posedge clk) begin

    if(!en)

        cnt<=12'b0;

    else if(cnt<N-1)

        cnt<=cnt+1'b1;

    else

        cnt<=12'b0;

end

   

endmodule

仿真结果:

 

 

 

 

  1. 偶分频

分频系数N为偶数。有两种实现方法,一是取M=N/2.二是应用N/2进制计数器,计满则输出翻转。

代码:

//偶分频

module fp_even (

    input clk,en,

    input [11:0]N_even,

    output reg fp_out

);

 

reg [11:0]cnt;

 

always @(posedge clk) begin

    if(!en)

    begin

        cnt<=12'b0;

        fp_out<=1'b0;

    end

    else

        if(cnt<(N_even/2-1))

            cnt<=cnt+1'b1;

        else

        begin

            cnt<=12'b0;

            fp_out<=~fp_out;

        end

end

   

endmodule

仿真结果:

 

 

 

  1. 奇分频

N为计数。做两个(N-1/2进制计数器,一个上升沿触发,一个下降沿触发,然后两个输出相或。

代码:

//奇分频

module fp_odd(

    input clk,en,

    input [11:0]N_odd,

    output fp_out

);

 

reg [11:0]cnt1,cnt2;

(*synthesis,probe_port,keep *) wire fp1,fp2;

 

assign fp1=(cnt1<=(N_odd-1)/2)?0:1;

assign fp2=(cnt2<=(N_odd-1)/2)?0:1;

assign fp_out=fp1|fp2;

 

always @(posedge clk) begin

    if(!en)

        cnt1<=12'b0;

    else if(cnt1<N_odd-1)

        cnt1<=cnt1+1'b1;

    else

        cnt1<=12'b0;

end

 

always @(negedge clk) begin

    if(!en)

        cnt2<=12'b0;

    else if(cnt2<N_odd-1)

        cnt2<=cnt2+1'b1;

    else

        cnt2<=12'b0;

end

 

endmodule

仿真结果:

 

 

 

  1. 半数分频

分频系数为整数的一半,比如10.5.

半数分频的原理:计数开始前,先将T触发器清零。经过异或门控制N进制计数器的时钟脉冲。先在时钟上升沿计数,计满,co变高,T触发器输出翻转,接着在时钟下降沿计数。中间计满的那次,数字状态只有半个时钟。

代码:

//半整数分频

module fp10p5 (

    input clk,clr_n,

    output fp_out

);

    reg [3:0]cnt;

    (* synthesis,probe_port,keep *) wire co;

    reg q;

    wire cnt_clk;

 

    assign cnt_clk=clk^q;

    assign fp_out=q;

 

    assign co=(cnt==4'd10);

 

    always @(posedge cnt_clk) begin //counter 10

        if(cnt==4'd10)

            cnt<=4'd0;

        else

            cnt<=cnt+1'b1;

    end

 

    always @(posedge co,negedge clr_n) //TFF

        if(!clr_n)

        q<=0;

    else 

        q<=~q;

 

endmodule

仿真结果:

 

 

 

总结:

最简单的是偶分频,难一点的是奇分频和半数分频。分别利用了两种边沿技巧。

 

参考:

  1. 张俊涛,陈晓莉.现代EDA技术及其应用.[M].北京,清华大学出版社。

 

posted on 2024-05-30 09:14  yf.x  阅读(75)  评论(0编辑  收藏  举报

导航