FPGA学习笔记整理_1_时钟分频

FPGA学习笔记整理_1_时钟分频

1. 偶数时钟分频

时钟偶数分频的关键就是计数器。

以四分频时钟为例:四分频时钟就是把原来的四个时钟周期变成一个时钟周期。也就是说,两个时钟周期作为低电平,两个时钟周期作为高电平。

1.1时序图如下:

 

1.2代码如下:

module div_clk_4(
    input wire clk,
    input wire rst,

    output reg clk_4
    );
//div counter
reg [1:0] div_cnt;
always @(posedge clk) begin
    if (rst == 1'b1) begin//高电平的时候复位,xilinx官方提倡的,低电平的时候有效,进行工作
        // reset
        div_cnt <= 2'b0;
    end
    else if(div_cnt == 2'd3)begin
        div_cnt <= 'd0;
    end
    else begin
        div_cnt <= div_cnt + 1'b1;
    end
end

always @(posedge clk) begin
    if (rst == 1'b1) begin
        clk_4 <= 1'b0;
    end
    else if (div_cnt == 1) begin
        clk_4 <= 1'b1;
    end
    else if(div_cnt == 3)begin
        clk_4 <= 1'b0;
    end
end
endmodule

 1.3仿真波形图如下:

 

2.计数分频

以五分频为例:

奇数分频的问题在于将原来的五个时钟周期作为新时钟的一个时钟周期,那么新时钟的高低电平各是2.5个原来的周期,无法直接用计数器计数形成。

那么其中一个解决办法就是产生两个 占空比不是50%的时钟,并且这两个时钟之间有错位,然后将两个时钟进行与并等操作产生50%占空比的五分频时钟。

2.1时序图如下:

图中pos_clk 和 neg_clk分别是clk上升沿和下降沿为敏感边沿作为触发,产生的两个错位的时钟,由于是五分频,这两个错位的时钟的占空比不是50%,

二者相与,就会产生占空比是50%的五分频时钟。

2.2代码如下:

module div_clk_5(
    input    wire clk,
    input     wire rst,
    output  wire clk_5
    );
reg[2:0]cnt_clk_pos;
reg[2:0]cnt_clk_neg;
reg clk_pos,clk_neg;
always @(posedge clk) begin
     if (rst) begin
         // reset
         cnt_clk_pos <= 3'b0;
     end
     else if (cnt_clk_pos == 3'd4) begin
         cnt_clk_pos <= 'b0;
     end
     else begin
         cnt_clk_pos <= cnt_clk_pos + 1;
     end
 end 

 always @(negedge clk) begin
     if (rst) begin
         // reset
         cnt_clk_neg <= 3'b0;
     end
     else if (cnt_clk_neg == 3'd4) begin
         cnt_clk_neg <= 'b0;
     end
     else begin
         cnt_clk_neg <= cnt_clk_neg + 1;
     end
 end 

always @(posedge clk) begin
    if (rst) begin
        // reset
        clk_pos <= 'b0;
    end
    else if (cnt_clk_pos == 'b0) begin
        clk_pos <= 1'b1;
    end
    else if (cnt_clk_pos == 'd3) begin
        clk_pos <= 1'b0;
    end
end

always @(negedge clk) begin
    if (rst) begin
        // reset
        clk_neg <= 1'b0;
    end
    else if (cnt_clk_neg == 'b0) begin
        clk_neg <= 1'b1;
    end
    else if (cnt_clk_neg == 'd3) begin
        clk_neg <= 1'b0;
    end
end
assign clk_5 = clk_pos && clk_neg;
endmodule

2.3 仿真波形图如下:

 

posted on 2021-09-14 21:30  xxXxMa  阅读(679)  评论(0)    收藏  举报

导航