当前位置:首页 > FPGA > 正文内容

Verilog实现时钟分频(奇数分频,偶数分频)二分频 三分频 四分频 五分频

chanra1n3年前 (2022-04-21)FPGA6157

完整工程文件:clkdiv.zip

//------------------------------------------------------

// File Name        : clkdiv.v
// Author           : ChanRa1n
// Description      : clk divider
// Called by        : TopModule
// Revision History : 2022-04-21
// Revision         : 1.0
// Email            : [email protected]
// Copyright(c) 2018-Now, MYFPGA.CN, All right reserved.
//------------------------------------------------------

module clkdiv (
    input   wire   [0:0]   Sys_clk
    ,input   wire   [0:0]   Sys_rst_n
    ,output  wire   [0:0]   Sig_clk_div2
    ,output  wire   [0:0]   Sig_clk_div3
    ,output  wire   [0:0]   Sig_clk_div4
    ,output  wire   [0:0]   Sig_clk_div5
);
//------------------------------------------------------
    function integer log2;
        input integer number;
        begin
            log2=0;
            while(2**log2<number) begin
                log2=log2+1;
            end
        end
    endfunction
//------------------------------------------------------
//Divided by 2
    reg    [0:0]   Sig_clk_div2_reg;
    assign Sig_clk_div2 = Sig_clk_div2_reg ;

    always@(posedge Sys_clk or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_clk_div2_reg <= 0;
        end
        else begin
            Sig_clk_div2_reg <= ~Sig_clk_div2_reg;
        end
    end
//------------------------------------------------------
//Divided by 3
    `define CLK_DIV_3 3
    reg    [0:0]   Sig_clk_div3_p;
    reg    [0:0]   Sig_clk_div3_n;
    reg    [log2(`CLK_DIV_3-1):0]   Sig_clk_div3_p_cnt;
    reg    [log2(`CLK_DIV_3-1):0]   Sig_clk_div3_n_cnt;

    assign Sig_clk_div3 = Sig_clk_div3_p && Sig_clk_div3_n ;

    always@(posedge Sys_clk or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_clk_div3_p     <= 1;
            Sig_clk_div3_p_cnt <= 0;
        end
        else begin      
            if(Sig_clk_div3_p_cnt < ( `CLK_DIV_3>>1 ))
                Sig_clk_div3_p <= 0;
            else
                Sig_clk_div3_p <= 1;

            if(Sig_clk_div3_p_cnt < `CLK_DIV_3-1)
                Sig_clk_div3_p_cnt <= Sig_clk_div3_p_cnt + 1;
            else
                Sig_clk_div3_p_cnt <= 0;
        end
    end

    always@(negedge Sys_clk or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_clk_div3_n     <= 1;
            Sig_clk_div3_n_cnt <= 0;
        end
        else begin
            if(Sig_clk_div3_n_cnt < ( `CLK_DIV_3>>1 ))
                Sig_clk_div3_n <= 0;
            else
                Sig_clk_div3_n <= 1;

            if(Sig_clk_div3_n_cnt < `CLK_DIV_3-1)
                Sig_clk_div3_n_cnt <= Sig_clk_div3_n_cnt + 1;
            else
                Sig_clk_div3_n_cnt <= 0;
        end
    end
//------------------------------------------------------
//Divided by 4
    reg    [0:0]   Sig_clk_div4_reg;
    reg    [0:0]   Sig_clk_div4_reg1;
    assign Sig_clk_div4 = Sig_clk_div4_reg ;

    always@(posedge Sys_clk or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_clk_div4_reg <= 0;
            Sig_clk_div4_reg1 <= 1;
        end
        else begin
            Sig_clk_div4_reg <= Sig_clk_div4_reg1;
            Sig_clk_div4_reg1 <= ~Sig_clk_div4_reg;
        end
    end
//------------------------------------------------------
//Divided by 5
    `define CLK_DIV_5 5
    reg    [0:0]   Sig_clk_div5_p;
    reg    [0:0]   Sig_clk_div5_n;
    reg    [log2(`CLK_DIV_5-1):0]   Sig_clk_div5_p_cnt;
    reg    [log2(`CLK_DIV_5-1):0]   Sig_clk_div5_n_cnt;

    assign Sig_clk_div5 = Sig_clk_div5_p && Sig_clk_div5_n ;

    always@(posedge Sys_clk or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_clk_div5_p     <= 1;
            Sig_clk_div5_p_cnt <= 0;
        end
        else begin      
            if(Sig_clk_div5_p_cnt < ( `CLK_DIV_5>>1 ))
                Sig_clk_div5_p <= 0;
            else
                Sig_clk_div5_p <= 1;

            if(Sig_clk_div5_p_cnt < `CLK_DIV_5-1)
                Sig_clk_div5_p_cnt <= Sig_clk_div5_p_cnt + 1;
            else
                Sig_clk_div5_p_cnt <= 0;
        end
    end

    always@(negedge Sys_clk or negedge Sys_rst_n)begin
        if(~Sys_rst_n)begin
            Sig_clk_div5_n     <= 1;
            Sig_clk_div5_n_cnt <= 0;
        end
        else begin
            if(Sig_clk_div5_n_cnt < ( `CLK_DIV_5>>1 ))
                Sig_clk_div5_n <= 0;
            else
                Sig_clk_div5_n <= 1;

            if(Sig_clk_div5_n_cnt < `CLK_DIV_5-1)
                Sig_clk_div5_n_cnt <= Sig_clk_div5_n_cnt + 1;
            else
                Sig_clk_div5_n_cnt <= 0;
        end
    end

endmodule


image.png


//------------------------------------------------------
// File Name        : clkdiv_tb.v
// Author           : ChanRa1n
// Description      : Testbench file for clkdiv_tb
// Called by        : Simulation
// Revision History : 2022-04-21
// Revision         : 1.0
// Email            : [email protected]
// Copyright(c) 2018-Now, MYFPGA.CN, All right reserved.
//------------------------------------------------------

`default_nettype wire
`timescale 1ns/1ns

module clkdiv_tb ();
    reg Sys_clk;
    reg Sys_rst_n;
    localparam CLK_PERIOD = 10;

    always #(CLK_PERIOD/2) Sys_clk=~Sys_clk;

    clkdiv clkdiv(
        .Sys_clk(Sys_clk),
        .Sys_rst_n(Sys_rst_n)
    );

    initial begin
        #1 Sys_rst_n<=1'b0;Sys_clk<=1'b0;
        #(CLK_PERIOD*3) Sys_rst_n<=1;
        #(CLK_PERIOD*3000);
        $stop;
    end

endmodule

 image.png


扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:https://world.myfpga.cn/index.php/post/241.html

分享给朋友:

“Verilog实现时钟分频(奇数分频,偶数分频)二分频 三分频 四分频 五分频” 的相关文章

ALGO C4MB V11引脚参照表(持续更新)

ALGO C4MB V11引脚参照表(持续更新)

功能:常用引脚CLKPIN_E1LED0PIN_G15LED1PIN_F16LED2PIN_F15LED3PIN_D16KEY1PIN_E15KEY2PIN_E16KEY3PIN_M15KEY4PIN_M16RXDPIN_M2TXDPIN_G1功能:VGA引脚VGA_BLUE[0]PIN_C15VG...

Verilog实现串并转换

Verilog实现串并转换

项目文件:SIPO.zip//------------------------------------------------------// File Name        : SIPO.v// Author       &n...

CDC 单脉冲信号处理

CDC 单脉冲信号处理

代码中的Sys_clk其实是没有用到的,项目文件:cdc_single.zip//------------------------------------------------------// File Name        : cdc.v// Autho...

多路选择器

多路选择器

多路选择器:在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路。二选一多路选择器 --- 模块框图in_1:输入信号in_2:输入信号sel:控制选择信号out:输出信号二选一多路选择器 --- 波形图in_1、in_2、sel 的波形是随机的。out 的波形根据控制选通信号而定。当 se...

半加器

半加器

半加器:两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。即两个一位二进制数的加法运算电路。半加器 模块框图:sum:结果位count:进位半加器 真值表:半加器 波形图:代码部分:选择器代码:在Src文件夹中新建 half_adder.v文件module half_adder...