题目
地址: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);
分析
- 很明显,从波形图看,第一个decade counter计数9次(q0==8)后一个周期,ena[1]有效;再下一个周期第二个decade counter计数1次;
- 第二个decade counter计数10次(q1==9),还需要第一个decade counter计数满10次后,才会再次变化。所以ena[2]有效的时间为满足q1==9,q0==8的下一周期;则再下一周期,第三个decade counter计数一次;
- 依次类推。
代码
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

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


4848

被折叠的 条评论
为什么被折叠?



