Verilog之分频电路设计

728 阅读3分钟

Verilog之分频电路设计

一.
一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率较高)进行分频。比如在进行流水灯、数码管动态扫描设计时不能直接使用系统时钟(太快而肉眼无法识别),或者需要进行通信时,由于通信速度不能太高(由不同的标准限定),这样就需要对系统时钟分频以得到较低频率的时钟。
分频器主要分为偶数分频、奇数分频,如果在设计过程中采用参数化设计,就可以随时改变参量以得到不同的分频需要。
在对时钟要求不是很严格的FPGA系统中,分频通常都是通过计数器的循环计数来实现的。


偶数分频(2N)

偶数分频更为简单,很容易用模为N的计数器实现50%占空比的时钟信号,即每次计数满(计到N/2-1)时输出时钟信号翻转。

奇数分频(2N+1)

奇数分频的难点就在于对50%占空比的处理,其核心思想就在于要学会利用寄存器的不同捕获边沿进行分频操作。

将得到的上升沿触发计数的奇数分频输出信号CLK1,和得到的下降沿触发计数的相同(时钟翻转值相同)奇数分频输出信号CLK2,最后将CLK1和CLK2相或之后输出,就可以得到占空比为50%的奇数分频器。

假设奇数分频的值为2N+1,为了实现占空比为50%的奇数分频,需要用到一个计数器和2路分频信号,第1路根据计数器的值在上升沿分频,即分别在计数器走到N-1和2N时,进行时钟信号的反转;而第2路则根据计数器的值在下降沿分频,同样是在计数器走到N-1和2N时,进行时钟信号反转。因为,一个时钟的上升沿和下降沿之间的时间差正好是50%的时钟周期,所以将两路信号进行或逻辑运算,就可以实现50%占空比的奇数分频。
在这里插入图片描述


//奇数分频的verilog设计实例
module Div_three(    
    input       clk,
    input       rst_n,
    output      div_three    //以三分频来设计
);

reg     [1:0]   cnt;    //分频计数器,因为是三分频,两位00,01,10,就能表示十进制的计数0,1,2
reg             div_clk1; //上升沿分频
reg             div_clk2;  //下降沿分频
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin   //实现复位清零    
        cnt <= 0;     
    end
    else if(cnt == 2)   //如果计数满了,则清零,没满则进行自加1的操作,实现分频计数
        cnt <= 0;
    else begin
        cnt <= cnt + 1;
    end
end

//上升沿分频
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        div_clk1 <= 0;
    end
    else if(cnt == 0)begin   //在cnt==0时对信号进行翻转
        div_clk1 <= ~div_clk1;
    end
    else 
        div_clk1 <= div_clk1;
end

//下降沿分频
always @(negedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        div_clk2 <= 0;
    end 
    else if(cnt == 2)begin   //在cnt==2时对信号进行翻转
        div_clk2 <= ~div_clk2;
    end
    else 
        div_clk2 <= div_clk2;
end
//两部分的上升下降沿相或,刚好是0到2,实现三分频
assign  div_three = div_clk2 ^ div_clk1; //上升沿与下降沿分频信号,相或输出最终 50% 占空比时钟,用或逻辑来实现奇数分频的技术

endmodule