常见计数器

这篇博客来介绍一些常见的计数器。话不多少,直接上代码。

第一种:

rtl可综合电路

//**************************************************************************
// *** 名称 : count.v
// *** 作者 : 南明离火hk
// *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/
// *** 日期 : 2021-07-08
// *** 描述 : 计数器模块
//**************************************************************************

module count (clk,rst_n,led)    ;
    input               clk     ;                    //输入50M的时钟
    input               rst_n   ;                    //输入复位信号
    output  reg        led     ;                    //输出ied信号

    reg     [1:0]    cnt        ;                    //定义变量cnt的数据类型和数据位

//--------------------------------------------------------------- 
//                      计数模块
//---------------------------------------------------------------
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)                                       //复位信号拉低
      cnt <= 2b0;                                  //复位时,变量cnt置为0
    else if(cnt==3)                                  //当变量cnt为3时
        cnt <= 2b0;                                 //变量cnt置为0
    else                                             //其它情况
        cnt <= cnt + 2b1;                           //变量cnt+1
end

//--------------------------------------------------------------- 
//                      led模块
//---------------------------------------------------------------
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)                                       //复位信号拉低
        led <= 1b0;                                 //复位时,变量led置为0
    else if(cnt==2d3)                               //当变量cnt为3时
        led <= 1b1;                                 //变量led置为1
    else                                             //其它情况
        led <= 1b0;                                 //变量led置为1
end

endmodule 

 

testbench

//**************************************************************************
// *** 名称 : count_tb.v
// *** 作者 : 南明离火hk
// *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/
// *** 日期 : 2021-07-08
// *** 描述 : 计数器仿真模块
//**************************************************************************

`timescale 1ns/1ps            //·timescale 定义仿真时间单位与精度,1ns是时间单位,即在仿真中用#10表示延迟10ns
                              //1ps表示时间精度,比如你写 #3.5547968525 a <= 1;c <= 1;,那么它时间精度也只会有1ps(即在3.555ns时赋值语句便生效)。
`define clock_period 20       //时钟周期为20ns,也就是频率为50MHz

module count_tb;              //在testbench中,输入都是要自己定义的,所以输入信号都是reg,而输出则是wire信号

    reg clk;                  //定义reg型的clk
    reg rst_n;                //定义reg型的rst_n
    
    wire led;                 //定义wire型的rst_n

    count u_count(            //把写好的计数器模块例化进来
        .clk(clk),
        .rst_n(rst_n),
        .led(led)
    );
    
    initial clk = 1;                         //定义clk信号的初始值为1
    always #(`clock_period/2) clk = ~clk;    //每隔半个时钟周期,clk的值变化一次
    
    initial begin
        rst_n = 1b0;                        //一开始,令复位信号rst_n拉低,表示复位状态有效
        #(`clock_period *10);                //经过10个时钟周期之后
        rst_n = 1b1;                        //令复位信号rst_n拉高,表示复位状态无效
        #(`clock_period *10);                //经过10个时钟周期之后
        $stop;                               //停止
    end
    
endmodule

 

对应的modesim仿真

常见计数器

常见计数器

上一篇:开发常用工具


下一篇:git删除远程分支