分频器code

理论学习

数字电路中时钟占有非常重要的地位。时间的计算都依靠时钟信号作为基本单元。一般而言,一块板子只有一个晶振,即只有一种频率的时钟,但是数字系统中,经常需要对基准时钟进行不同倍数的分频,进而得到各模块所需的频率。

若想得到比系统时钟更慢的时钟,可以将基准时钟进行分频。

若想得到比系统时钟更快的时钟,可以将基准时钟进行倍频。

不管是分频还是倍频,都通过PLL实现或者用verilog描述实现。

我们用verilog实现的一般是分频电路,即分频器。分频电路是数字系统设计中常用的基本电路之一。

分频器分为偶数分频和奇数分频。

偶数分频demo1

复制代码
module    divider_sex
(
    input    wire    sys_clk      ,
    input    wire    sys_rst_n    ,

    output   reg     clk_out
);


    reg    [1:0]    cnt    ;

    always@( posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            cnt    <=    2'd0    ;
        end
        else if( cnt == 2'd2 )
        begin
            cnt    <=    2'd0    ;
        end
        else
        begin
            cnt    <=    cnt    + 1'b1    ;
        end
    end

    always@(posedge sys_clk or negedge sys_rst_n )
    begin
        if(  sys_rst_n == 1'b0 )
        begin
            clk_out    <=    1'b0    ;
        end 
        else if( cnt == 2'd2 )
        begin
            clk_out    <=    ~clk_out    ;
        end
    end


endmodule

偶数分频demo2

复制代码
module    divider_six
(
    input    wire    sys_clk      ,
    input    wire    sys_rst_n    ,

    outpur   reg     clk_out
);

    reg    [2:0]    cnt    ;
    
    always@( posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            cnt    <=    3'd0    ;
        end
        else    if( cnt == 3'd5 )
        begin
            cnt    <=    3'd0    ;
        end
        else
        begin
            cnt    <=    cnt    + 1'b1    ;
        end
    end

    always@( posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            clk_out    <=    1'b0    ;
        end
        else if( cnt == 3'd4 )
        begin
            clk_out    <=    1'b1    ;
        end
        else    
        begin
            clk_out    <=    1'b0    ;    
        end
    end


endmodule

偶数分频对应的tb

复制代码
`timescale    1ns/1ns


module    tb_divider_six();


    reg    sys_clk      ;
    reg    sys_rst_n    ;
    wire   clk_out      ;
 
    initial
    begin
        sys_clk    =    1'b1    ;
        sys_rst_n    <=    1'b0    ;
        #20    ;
        sys_rst_n    <=    1'b1    ;
    end

    always #10     sys_clk     <=    ~sys_clk    ;

    divider_six    divider_six_inst
    (
        .sys_clk      (sys_clk)      ,
        .sys_rst_n    (sys_rst_n)    ,

        .clk_out      (clk_out)
    );

endmodule

奇数分频

复制代码
module    divider_five
(
    input    wire    sys_clk      ,
    input    wire    sys_rst_n    ,

    output   wire    clk_out
);

    reg    [2:0]    cnt     ;
    reg             clk1    ;
    reg             clk2    ;


    always@( posedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            cnt    <=    3'd0    ;
        end
        else if( cnt == 3'd4 )
        begin
            cnt    <=    3'd0    ;
        end
        else
        begin
            cnt    <=    cnt    + 1'b1    ;
        end
    end
    
    //clk1
    always@( posedge sys_clk or negedge sys_rst_n )        
    begin
        if( sys_rst_n == 1'b0 )
        begin
            clk1    <=    1'b1    ;
        end
        else if( cnt == 3'd2 )
        begin
            clk1    <=    1'b0    ;
        end
        else
        begin
            clk1    <=    1'b1    ;
        end
    end


    //clk2
    always@( negedge sys_clk or negedge sys_rst_n )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            clk2    <=    1'b1    ;
        end
        else if( cnt    ==    3'd2 )
        begin
            clk2    <=    1'b0    ;
        end
        else
        begin
            clk2    <=    1'b1    ;
        end
    end


    assign    clk_out    =    clk1 & clk2    ;

endmodule

奇数分频的tb

复制代码
`timescale 1ns/1ns


module    tb_divider_five();


    reg    sys_clk      ; 
    reg    sys_rst_n    ;
    wire   clk_out      ;


    initial
    begin
        sys_clk    =    1'b1    ;
        sys_rst_n    <=    1'b0    ;
        #20    ;
        sys_rst_n    <=    1'b1    ;  
    end

    always #10    sys_clk    <=    ~sys_clk    ;

    divider_five    divider_five_inst
    (
        .sys_clk      (sys_clk)      ,
        .sys_rst_n    (sys_rst_n)    ,

        .clk_out      (clk_out)
    );


endmodule
相关推荐
Saniffer_SH2 小时前
【每日一题】PCIe答疑 - 接大量 GPU 时主板不认设备或无法启动和MMIO的可能关系?
运维·服务器·网络·人工智能·驱动开发·fpga开发·硬件工程
会编程是什么感觉...3 小时前
硬件 - 常见通信协议整合
单片机·嵌入式硬件·fpga开发
Saniffer_SH3 小时前
【每日一题】讲讲PCIe链路训练和枚举的前后关系
运维·服务器·网络·数据库·驱动开发·fpga开发·硬件工程
s09071368 小时前
ZYNQ 中 AXI BRAM 的使用详细的说明。
fpga开发·zynq
哎呦喂研究院12 小时前
FPGA:重构硬件逻辑的柔性算力核心,国产替代的破局关键
fpga开发
国科安芯21 小时前
国产RISC-V架构MCU在工控系统中的节能性分析
网络·单片机·嵌入式硬件·fpga开发·性能优化·架构·risc-v
博览鸿蒙1 天前
集成电路基础知识经典问答(面向 FPGA 工程师版)
fpga开发
s09071361 天前
Xilinx FPGA 中ADC 数据下变频+ CIC 滤波
算法·fpga开发·fpga·zynq
9527华安1 天前
FPGA纯verilog实现JESD204B协议,基于AD9208数据接收,提供工程源码和技术支持
fpga开发·xilinx·jesd204b·ad9208·uv9p·vcu118
范纹杉想快点毕业1 天前
FPGA面试百问:从基础到实战全解析
fpga开发