分频电路实现


1.整数分频电路,无占空比要求

   对于偶数,N分频电路,只需实现一个N/2个状态的计数器即可,触发器 采到计数器为N/2-1时,将clk_out取反。

 

  对于奇数,N分频电路,可用状态机实现,前几个状态输出0,后几个状态输出1;也可用计数器实现,比如7分频电路,计数器从0到6循环计数,触发器采到2和6时,将clk_out取反。

 

2.整数分频电路,50%占空比

  对于偶数,保证50%占空比很简单。

  对于奇数,N分频时钟,可用两个差90°相位的2N分频时钟异或得到。如3分频时钟,可以用两个6分频的时钟异或得到,如何保证两个6分频时钟相位差为90°呢?也很简单,先生成一个上升沿触发的计数器cnt,第一个时钟clk1使用上升沿触发器产生,当触发器采到cnt为2或5时,将clk1取反;第二个时钟使用下降沿触发器产生,当触发器采到cnt为1或4时,将clk2取反。这样便得到了两个差90°相位的6分频时钟,如下图所示。

3.小数分频

 如3.5分频电路,意味着7个周期产生2个对称的脉冲,生成一个可以简单划分下前1.5个周期输出1(0),1.5~3.5输出0(1),3.5~5输出1(0),5~7输出0(1),那么怎么去实现半个周期呢?,可以注意到上升沿和下降沿就差半个周期。我们生成一个7bit的上升沿的环形计数器,那么cnt[0]就可以实现第一个时钟周期输出1(0),前面的分析说到要在前1.5个时钟周期输出0(1),那剩下0.5个时钟周期怎么实现呢?我们产生一个下降沿触发的clk1,让clk1在采到cnt[0]为1时输出1,其他情况输出0. 再cnt[0]和clk1相或,就可以得到前1.5个周期clk_out输出1,其他输出0;同样的方法对3.5~5这1.5个周期进行同样处理,就可以让clk_out在这1.5个周期输出1。最终得到了3.5分频的时钟。此种方法还可以用来得到前面的50%占空比的奇数分频时钟。

代码如下:

module main (
);
    reg clk,rst;
    initial begin
        clk = 1'b0;
        forever #5 clk = ~clk;
    end

    initial begin
        rst = 1'b1;
        #20 rst = 1'b0;
        #1000;
        $finish;
    end

    reg clk_p_div6,clk_n_div6;
    wire clk_div;
    reg [6:0] cnt;
    reg clk1;

    always @(posedge clk ) begin
        if (rst) begin
            cnt <= 7'b0000001;
        end
        else begin
            cnt <= {cnt[5:0],cnt[6]};
        end
    end

    always @(negedge clk ) begin
        if (rst) begin
            clk1 <= 1'b0;
        end
        else if (cnt == 7'b0000001 || cnt==7'b0001000) begin
            clk1 <= 1'b1;
        end
        else begin
            clk1 <= 1'b0;
        end
    end

    assign clk_div = cnt[0] | clk1 | cnt[4];

endmodule


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM