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.
构建一个4位BCD(二进制编码的十进制)计数器。每个十进制数字使用4位进行编码:q[3:0]是个位,q[7:4]是十位,以此类推。各进制上的进位时也需输出一个使能信号,指示三位数字何时应该增加。
答案:
module top_module (
input clk,
input reset, // Synchronous active-high reset
output [3:1] ena,
output [15:0] q);
wire [3:0]midena;
wire [15:0] midq;
//例化
genvar i;
generate
for(i=0;i<4;i=i+1) begin:bcd1uut
bcd1 uut1(
.clk1(clk),
.reset1(reset),
.ena1(midena[i]),
.q1(midq[4*i +:4])
);
end
endgenerate
//输出
assign midena[0]=1'b1;
assign midena[1]=(midq[3:0]==4'd9); //个位满9,十位启用
assign midena[2]=(midq[3:0]==4'd9 && midq[7:4]==4'd9);
assign midena[3]=(midq[3:0]==4'd9 && midq[7:4]==4'd9 && midq[11:8]==4'd9);
assign ena = {midena[3],midena[2],midena[1]}; // 十 百 千
assign q=midq;
endmodule
// bcd计数器
module bcd1 (
input clk1,
input reset1,
input ena1,
output [3:0] q1);
always @(posedge clk1) begin
if(reset1)
q1<=0;
else if(ena1) begin
if(q1==4'd9)
q1<= 0;
else
q1<=q1+1'b1;
end
else
q1<=q1;
end
endmodule
结果: