Countbcd HDLbits

题目:
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.
答案

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

    wire [3:0] valid,q0,q1,q2,q3;
    assign valid = {{(q2 == 9)&&(q1 == 9)&&(q0 == 9)},{(q[7:4] == 9)&&(q[3:0] == 9)},{q0 == 9},1'b1};
    assign ena = {{(q2 == 9)&&(q1 == 9)&&(q0 == 9)},{(q[7:4] == 9)&&(q[3:0] == 9)},q[3:0] == 9};
    assign q = {q3,q2,q1,q0};
    
    count count0(clk,reset,q0,valid[0],1'b1);
    count count1(clk,reset,q1,valid[1],{(q[7:4] == 9)&&(q[3:0] == 9)});
    count count2(clk,reset,q2,valid[2],{(q2 == 9)&&(q1 == 9)&&(q0 == 9)});
    count count3(clk,reset,q3,valid[3],{(q3 == 9)&&(q2 == 9)&&(q1 == 9)&&(q0 == 9)});
        
    
endmodule

module count(clk,reset,q_a,vld,ena);
    input clk;
    input reset;
    input vld;
    input ena;
    output [3:0] q_a;
    
    always@(posedge clk) begin
        if(reset)
            q_a <= 4'd0;
        else if((q_a == 4'd9)&&(ena))
            q_a <= 0;
        else if (vld)begin
            q_a <= q_a + 1'b1;
        end
    end
endmodule

在这里插入图片描述
若例化如下:

count count0(clk,reset,q[3:0],valid[0],1'b1);

则有
在这里插入图片描述
这是因为count count0(clk,reset,q[3:0],valid[0],1’b1)与assign q = {q3,q2,q1,q0}重复赋值导致的
下面这么用没问题

 assign ena = {{(q2 == 9)&&(q1 == 9)&&(q0 == 9)},{(q[7:4] == 9)&&(q[3:0] == 9)},q[3:0] == 9};
module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);

    wire [3:0] valid,q0,q1,q2,q3;
    assign valid = {{(q2 == 9)&&(q1 == 9)&&(q0 == 9)},{(q1 == 9)&&(q0 == 9)},{q0 == 9},1'b1};
    assign ena = {{(q2 == 9)&&(q1 == 9)&&(q0 == 9)},{(q1 == 9)&&(q0 == 9)},q0 == 9};
    //assign q = {q3,q2,q1,q0};
    assign {q3,q2,q1,q0} = q;
    
    count count0(clk,reset,q[3:0],valid[0],1'b1);
    count count1(clk,reset,q[7:4],valid[1],{(q1 == 9)&&(q0 == 9)});
    count count2(clk,reset,q[11:8],valid[2],{(q2 == 9)&&(q1 == 9)&&(q0 == 9)});
    count count3(clk,reset,q[15:12],valid[3],{(q3 == 9)&&(q2 == 9)&&(q1 == 9)&&(q0 == 9)});
        
    
endmodule

module count(clk,reset,q_a,vld,ena);
    input clk;
    input reset;
    input vld;
    input ena;
    output [3:0] q_a;
    
    always@(posedge clk) begin
        if(reset)
            q_a <= 4'd0;
        else if((q_a == 4'd9)&&(ena))
            q_a <= 0;
        else if (vld)begin
            q_a <= q_a + 1'b1;
        end
    end
endmodule

收获:

  1. 拼接时,要表明常数的位宽
{{(q2 == 9)&&(q1 == 9)&&(q0 == 9)},{(q[7:4] == 9)&&(q[3:0] == 9)},{q0 == 9},1'b1}
不是
{{(q2 == 9)&&(q1 == 9)&&(q0 == 9)},{(q[7:4] == 9)&&(q[3:0] == 9)},{q0 == 9},1}
  1. count count0(clk,reset,q[3:0],valid[0],1’b1)是可以的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值