侧边栏壁纸
    • 累计撰写 302 篇文章
    • 累计收到 527 条评论
    【Verilog】创建12小时时钟的计数器
    我的学记|刘航宇的博客

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

    刘航宇
    2022-07-15 / 1 评论 / 769 阅读 / 正在检测是否收录...

    题目描述

    创建一组适合用作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的过渡行为以及同步复位和启用行为。
    Test
    请注意,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
    
    1
    ASIC与FPGA设计哪个前景更好
    « 上一篇 2022-07-19
    [Verilog]ASIC/FPGA实现边沿检测电路(上升/下降沿)
    下一篇 » 2022-07-14

    评论 (1)

    取消
    1. 头像
      楠楠
      Android · Google Chrome

      太秀了

      回复