HDLBits在线练习题之Countbcd

这篇文章深入解析了如何使用HDL设计一个四位BCD计数器,通过实例展示了如何利用四个8位寄存器来表示十进制数字,并通过enable信号控制逐位递增。着重介绍了计数器触发条件和ena信号的逻辑处理。

题目

地址:HDLBits - Countbcd
详细:

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.
You may want to instantiate or modify some one-digit decade counters.
在这里插入图片描述

Module Declaration
module top_module (
input clk,
input reset, // Synchronous active-high reset
output [3:1] ena,
output [15:0] q);

分析

  1. 很明显,从波形图看,第一个decade counter计数9次(q0==8)后一个周期,ena[1]有效;再下一个周期第二个decade counter计数1次;
  2. 第二个decade counter计数10次(q1==9),还需要第一个decade counter计数满10次后,才会再次变化。所以ena[2]有效的时间为满足q1==9,q0==8的下一周期;则再下一周期,第三个decade counter计数一次;
  3. 依次类推。

代码

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);
    always @(posedge clk) begin
        if (reset)
            ena <= 3'b0;
        else begin 
            if (q[3:0]==4'd8)
                ena[1] <= 1'b1;
            else
                ena[1] <= 1'b0;
            if (q[3:0]==4'd8 && q[7:4]==4'd9)
                ena[2] <= 1'b1;
            else
                ena[2] <= 1'b0;
            if (q[3:0]==4'd8 && q[7:4]==4'd9 &&q[11:8]==4'd9)
                ena[3] <= 1'b1;
            else
                ena[3] <= 1'b0;
        end
    end
    decade_cnt cnt0(clk,reset,1'b1,q[3:0]);
    decade_cnt cnt1(clk,reset,ena[1],q[7:4]);
    decade_cnt cnt2(clk,reset,ena[2],q[11:8]);
    decade_cnt cnt3(clk,reset,ena[3],q[15:12]);

endmodule

module decade_cnt (
    input clk,
    input reset,
    input enable,
    output [3:0] q
);
    always @(posedge clk) begin
        if (reset)
            q <= 4'b0;
        else if (enable) begin
            if (q==4'd9)
                q <= 4'b0;
            else
                q <= q+1'b1;
        end
        else
            q <= q;
    end 
endmodule

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值