题目:
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.
题目大意:
计数器的倒数第二题。
题目要求为设计一个16位的十进制计数器,每4位代表一个十进制位数,16位对应千百十个位。
并且在每个时钟周期输出一个3位的使能控制计数器是否进位。
解法思路:
按实现方式可分为两种。
1.直接设计功能,不实例化其他模块。
2.先设计4位BCD计数器模块,通过实例化4个模块来实现计数器功能。
这里给出法2的解法。
module top_module (
input clk,
input reset, // Synchronous active-high reset
output [3:1] ena,
output [15:0] q);
assign ena[1]=(q[3:0]==4'd9);
assign ena[2]=(q[7:4]==4'd9&&q[3:0]==4'd9);
assign ena[3]=(q[11:8]==4'd9&&q[7:4]==4'd9&&q[3:0]==4'd9);
//实例化模块
decade_counter u1(.clk(clk),.reset(reset),.ena(1),.q(q[3:0]));
decade_counter u2(.clk(clk),.reset(reset),.ena(ena[1]),.q(q[7:4]));
decade_counter u3(.clk(clk),.reset(reset),.ena(ena[2]),.q(q[11:8]));
decade_counter u4(.clk(clk),.reset(reset),.ena(ena[3]),.q(q[15:12]));
endmodule
//4位BCD计数器
module decade_counter (
input clk,
input reset,
input ena,
output [3:0] q
);
always@(posedge clk) begin
if(reset)
q<=4'b0;
else if(ena) begin
if(q==4'd9)
q<=4'd0;
else
q<=q+1'b1;
end
end
endmodule