【Verilog】创建12小时时钟的计数器
我的学记|刘航宇的博客

【Verilog】创建12小时时钟的计数器

刘航宇
3年前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2022年07月15日,已超过952天没有更新,若内容或图片失效,请留言反馈。

题目描述

创建一组适合用作12小时时钟的计数器(带有am / pm指示器)。您的计数器由快速运行的时钟提供时钟,每当您的时钟增加(即每秒一次)时,便会在ena上产生一个脉冲。
重置将时钟重置为12:00 AM。 pm对于AM是0,对于PM是1。 hh,mm和ss是两个BCD(二进制-编码的十进制数字分别代表小时(01-12),分钟(00-59)和秒(00-59)。Reset的优先级比enable的优先级高。

以下时序图显示了从11:59:59 AM到12:00:00 PM的过渡行为以及同步复位和启用行为。
图片[1] - 【Verilog】创建12小时时钟的计数器 - 我的学记|刘航宇的博客
请注意,11:59:59 PM前进至12:00:00 AM,12:59:59 PM前进至01:00:00 PM。没有00:00:00。从图中知道,hh、mm、ss都是8位二进制数,且分为前四位和后四位,如果前四位满足了要求,后四位就加一个数;8位都满足了要求,就复位。

解答

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 
    
    wire [3:0] enable;
    assign enable[0] = ena;
    assign enable[1] = ena & (ss==8'h59);
    assign enable[2] = ena & (ss==8'h59) & (mm==8'h59);
    assign enable[3] = ena & (hh==8'h11) & (ss==8'h59) & (mm==8'h59);
    
    count60 second  (clk,reset,enable[0],ss);
    count60 minute  (clk,reset,enable[1],mm);
    count12 hour    (clk,reset,enable[2],hh);
    count2  halfday (clk,reset,enable[3],pm);
    
endmodule

module count12(
    input clk,
    input reset,
    input ena,
    output [7:0] q);
    
    always @(posedge clk) begin
        if (reset)
            q <= 8'h12;
        else if (ena) begin
            if (q == 8'h12)
                q <= 8'h1;
            else if (q[3:0] == 4'h9) begin
                q[3:0] <= 0;
                q[7:4] <= 1;
            end
            else
                q[3:0] <= q[3:0] + 1;
        end
        else
            q <= q;
    end
    
endmodule
    
module count60(
    input clk,
    input reset,
    input ena,
    output [7:0] q);
    
    always @(posedge clk) begin
        if (reset)
            q <= 0;
        else if (ena) begin
            if (q == 8'h59)
                q <= 0;
            else if (q[3:0] == 4'h9) begin
                q[3:0] <= 0;
                q[7:4] <= q[7:4] + 1;
            end
            else
                q[3:0] <= q[3:0] + 1;
        end
        else
            q <= q;
    end
    
endmodule

module count2(
    input clk,
    input reset,
    input ena,
    output q);
    
    always @(posedge clk) begin
        if (reset)
            q <= 0;
        else if (ena) begin
            if (q < 1'b1)
                q <= q + 1;
            else
                q <= 0;
        end
        else
            q <= q;
    end
    
endmodule
© 版权声明
THE END
喜欢就支持一下吧
点赞 1 分享 赞赏
评论 共1条
取消
  1. 头像
    楠楠
     · 
    回复

    太秀了