当前位置:   article > 正文

FPGA _Verilog HDL_计数器实现数字钟60秒计数设计实验_verilog数码管计时60秒

verilog数码管计时60秒

一、题目

计数器实现数字钟60秒计数设计实验

二、源代码

说明:本实验实现了数字钟60秒计数设计;可以输出定时时间eg:11.22s,即11s、22ms,两个参数通过COUTS、COUTMS输出;同时,可以输出溢出位,当60s定时到达时,OV输出1,反之,OV输出0。本实验的时钟频率为50MHz。

顶层文件:

//----------------------------------------------------------------------------------------
// File name:           Timer60s
// Last modified Date:  2020年5月30日11点10分
// Last Version:        V1.1
// Descriptions:        定时60s,可以输出ms及s数据,精度可达10ms
//----------------------------------------------------------------------------------------
module Timer60s(CLK,RST,EN,COUTS,COUTMS,OV);
    input CLK,RST,EN;//时钟,复位,输入使能
    output [5:0] COUTS;//s输出
    output [6:0] COUTMS;//ms输出
    output OV;  //计数进位输出
    wire [5:0] Q1s;//reg OV;
    wire [6:0] Q1ms;
    
    wire COUT10ms;
    wire COUT1s;
    wire COUT60s;
    assign COUTS = Q1s;//将内部寄存器的计数结果输出至COUTS
    assign COUTMS = Q1ms;
    assign OV = COUT60s;

   //定时10ms模块例化 
    Timer10ms u_Timer10ms(
    .CLK                    (CLK),
    .RST                    (RST),
    .EN                      (EN),
    .COUT10ms          (COUT10ms),
    );
    
    //定时1s模块例化
    Timer1s u_Timer1s(
    .CLK1ms        (COUT10ms),
    .RST              (RST),
    .EN                (EN),
    .COUT1s        (COUT1s),
    .CNTS             (Q1ms),
    );
    
    //定时60s模块例化
    Timer60sby1s u_Timer60sby1s(
    .CLK1s        (COUT1s),
    .RST           (RST),
    .EN             (EN),
    .COUT60s    (COUT60s),
    .CNT60S      (Q1s),
    );
    
 endmodule

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

60s定时器模块:需要1s定时器模块的支持

//----------------------------------------------------------------------------------------
// File name:           Timer10ms
// Last modified Date:  2020年5月30日10点50分
// Last Version:        V1.1
// Descriptions:        定时60s,本模块需基于1s定时模块的基础上进行
//----------------------------------------------------------------------------------------
module Timer60sby1s(CLK1s,RST,EN,COUT60s,CNT60S);
    input CLK1s,EN,RST;//时钟,时钟使能,复位;EN == 1有效
    output COUT60s;  //计数进位输出
    output [5:0] CNT60S;//计数值输出
    reg [5:0] Q60s;reg COUT60s;
    assign CNT60S = Q60s;
    
    always @(posedge CLK1s or negedge RST)   //时序过程
        begin
        if(!RST)  Q60s <= 0;   //RST=0时,对内部寄存器单元异步清0
        else if (EN)            //同步使能EN = 1;则允许计数
            begin 
            if(Q60s < 60)  
                Q60s <= Q60s +1;//当Q1小于60时,允许累加
            else
                Q60s <= 6'b0;  //否则一个时钟后清0返回初值
            end 
         end
         
     always @(Q60s)   //组合逻辑
        if (Q60s==6'd60) 
            COUT60s = 1'b1;
        else
            COUT60s = 1'b0;
endmodule

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

1s定时器模块:需要10ms定时器模块的支持

//----------------------------------------------------------------------------------------
// File name:           Timer10ms
// Last modified Date:  2020年5月30日10点35分
// Last Version:        V1.1
// Descriptions:        定时1s,本模块需基于10ms定时模块的基础上进行
//----------------------------------------------------------------------------------------
module Timer1s(CLK1ms,RST,EN,COUT1s,CNTS);
    input CLK1ms,EN,RST;//时钟,时钟使能,复位;EN == 1有效
    output COUT1s;  //计数进位输出
    output [6:0] CNTS;  //计数器数值输出,单位:ms
    reg [6:0] Q1s;reg COUT1s;
    assign CNTS = Q1s;
    
    always @(posedge CLK1ms or negedge RST)   //时序过程
        begin
        if(!RST)  Q1s <= 0;   //RST=0时,对内部寄存器单元异步清0
        else if (EN)            //同步使能EN = 1;则允许计数
            begin 
            if(Q1s < 100)  
                Q1s <= Q1s +1;//当Q1小于100时,允许累加
            else
                Q1s <= 7'b0;  //否则一个时钟后清0返回初值
            end 
         end
         
     always @(Q1s)   //组合逻辑
        if (Q1s==7'd100) 
            COUT1s = 1'b1;
        else
            COUT1s = 1'b0;
endmodule

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

10ms定时器模块:

//----------------------------------------------------------------------------------------
// File name:           Timer10ms
// Last modified Date:  2020年5月30日10点20分
// Last Version:        V1.1
// Descriptions:        定时10ms
//----------------------------------------------------------------------------------------
module Timer10ms(CLK,RST,EN,COUT10ms);
    input CLK,EN,RST;//时钟,时钟使能,复位;EN == 1有效
    output COUT10ms;  //计数进位输出
    reg [18:0] Q10ms;reg COUT10ms;
    
    always @(posedge CLK or negedge RST)   //时序过程
        begin
        if(!RST)  Q10ms <= 0;   //RST=0时,对内部寄存器单元异步清0
        else if (EN)            //同步使能EN = 1;则允许计数
            begin 
            if(Q10ms < 500000)  
                Q10ms <= Q10ms +1;//当Q10ms小于500000时,允许累加
            else
                Q10ms <= 19'b0;  //否则一个时钟后清0返回初值
            end 
         end
         
     always @(Q10ms)   //组合逻辑
        if (Q10ms==19'd500000) 
            COUT10ms = 1'b1;
        else
            COUT10ms= 1'b0;
endmodule

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

三、仿真波形图

在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/411117
推荐阅读
相关标签
  

闽ICP备14008679号