hdlbits count clock 新手解答

题干

Create a set of counters suitable for use as a 12-hour clock (with am/pm indicator). Your counters are clocked by a fast-running clk, with a pulse on ena whenever your clock should increment (i.e., once per second).

reset resets the clock to 12:00 AM. pm is 0 for AM and 1 for PM. hh, mm, and ss are two BCD (Binary-Coded Decimal) digits each for hours (01-12), minutes (00-59), and seconds (00-59). Reset has higher priority than enable, and can occur even when not enabled.

The following timing diagram shows the rollover behaviour from 11:59:59 AM to 12:00:00 PM and the synchronous reset and enable behaviour.

Module Declaration

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 

解答:

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 
    wire en1,en2;
    cnt ss1 (clk, reset, ena, ss);
    cnt mm1 (clk, reset, en1, mm);
    cnt1 hh1 (clk, reset, en2, hh);
    assign en1 = (ss==8'b01011001)?1:0;
    assign en2 = (mm==8'b01011001&&ss==8'b01011001)?1:0;
    always @(posedge clk)begin
        if(reset)begin
            pm<=0;
        end
        else if(hh==8'b00010001&&mm==8'b01011001&&ss==8'b01011001)begin
            pm<=!pm;
        end
        else
            pm<=pm;
    end
            
endmodule

module cnt (
    input clk,
    input reset,
    input en ,
    output [7:0] out);
    reg[7:0] q,q1;
    always@(posedge clk)begin
        if(reset)begin
            q<=0;
        end
        else if(en) begin
            if(q==59)
                q<=0;
            else
                 q<=q+1;
        end
else
    q<=q;
    end
    bcd bb (q, q1);
    assign out = q1;
    
endmodule

module cnt1 (
    input clk,
    input reset,
    input en ,
    output [7:0] out);
    reg [7:0] q,q1;
    always@(posedge clk)begin
        if(reset)begin
            q<=12;
        end
        else if(en) begin
            if(q==12)
                q<=1;
            else
                 q<=q+1;
        end
else
    q<=q;
    end  
        bcd aa (q, q1);
        assign out = q1;
endmodule

module bcd (
    input [7:0] in,
    output [7:0] out);
    reg [3:0] ten, one;
    integer i;
    always@(*)begin
        one=0;
        ten=0;
        for(i=7;i>=0;i=i-1)begin
            if(one>=5) one=one+3;
            if(ten>=5) ten=ten+3;
            ten={ten[2:0],one[3]};
            one={one[2:0],in[i]};
           end
      end
                 assign out = {ten,one};
endmodule

思路:

用到0-59计数器和1-12计数器;

使用bin2bcd让计数器输出为bcd码;

pm每当hh11-12时翻转一次。

欢迎指正!谢谢!

  • 32
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值