4-digit decimal counter

Build a 4-digit BCD (binary-coded decimal) counter. Each decimal digit is encoded using 4 bits: q[3:0] is the ones digit, q[7:4] is the tens digit, etc. For digits [3:1], also output an enable signal indicating when each of the upper three digits should be incremented.

timu
题目网站

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);
    reg [3:0]ones;
    reg [3:0]tens;
    reg [3:0]hundreds;
    reg [3:0]thousands;
    
    always@(posedge clk)begin
        if(reset)begin
            ones<=4'b0;
        end
        else begin
            if(ones==4'd9)begin
                ones<=4'b0;
            end
            else begin
                ones<=ones+4'd1;
            end
        end
    end
    
    always@(posedge clk)begin
        if(reset)begin
            tens<=4'b0;
        end
        else begin
            if(ones==4'd9&&tens==4'd9)begin
                tens<=4'b0;
            end
            else if(ones==4'd9)begin
                tens<=tens+4'd1;
            end
        end
    end
    
    always@(posedge clk)begin
        if(reset)begin
            hundreds<=4'b0;
        end
        else begin
            if(ones==4'd9&&tens==4'd9&&hundreds==4'd9)begin
                hundreds<=4'b0;
            end
            else if(ones==4'd9&&tens==4'd9)begin
                hundreds<=hundreds+4'd1;
            end
        end
    end
    
    always@(posedge clk)begin
        if(reset)begin
            thousands<=4'b0;
        end
        else begin
            if(ones==4'd9&&tens==4'd9&&hundreds==4'd9&&thousands==4'd9)begin
                thousands<=4'b0;
            end
            else if(ones==4'd9&&tens==4'd9&&hundreds==4'd9)begin
                thousands<=thousands+4'd1;
            end
        end
    end   //上面的四个模块分别是对个十百千位进行逐位递增判断
    
    assign q={thousands,hundreds,tens,ones};   //对最终输出开始赋值
    assign ena[1] = (ones == 4'd9) ? 1'b1 : 1'b0;
    assign ena[2] = ((ones == 4'd9) && (tens == 4'd9)) ? 1'b1 : 1'b0;
    assign ena[3] = ((ones == 4'd9) && (tens == 4'd9) && (hundreds == 4'd9)) ? 1'b1 : 1'b0;   //与上一题一致

endmodule

posted @ 2024-04-10 14:29  江左子固  阅读(10)  评论(0编辑  收藏  举报