Several Requirements For This Topic
Several Requirements For This Topic
Several Requirements For This Topic
Create a set of counters suitable for use as a 12-hour clock (with am/pm indicator). Your
counters are clocked by a fast-running clk, with a pulse on ena whenever your clock should
increment (i.e., once per second).
reset: resets the clock to 12:00 AM. pm is 0 for AM and 1 for PM. hh, mm, and ss are two BCD
(Binary-Coded Decimal) digits each for hours (01-12), minutes (00-59), and seconds (00-59).
Reset has higher priority than enable, and can occur even when not enabled.
The following timing diagram shows the rollover behaviour from 11:59:59 AM to 12:00:00 PM
and the synchronous reset and enable behaviour.
Hint:
Note that 11:59:59 PM advances to 12:00:00 AM, and 12:59:59 PM advances to 01:00:00 PM.
There is no 00:00:00.
Code
The clock cycle in the question has been given as 1s, so it can be directly used for
counting.
Let us first design a BCD counter modulo 60 and a BCD counter modulo 12.
module counter_60 (
input clk,
input en,
input reset,
);
if(reset)
cout_out <= 0;
if (cout_out == 8'h59)
cout_out <= 0;
else begin
if(cout_out[3:0] == 9) begin
cout_out[3:0] <= 0;
end
else
end
end
end
endmodule
module counter_12 (
input clk,
input en,
input reset,
);
if (cout_out == 8'h12)
cout_out <= 1;
else begin
if(cout_out[3:0] == 9) begin
cout_out[3:0] <= 0;
end
else
end
end
end
endmodule
module top_module(
input clk,
input reset,
input ena,
output pm,
counter_12 counter1(
.clk(clk),
.reset(reset),
.cout_out(hh)
);
counter_60 counter2(
.clk(clk),
.reset(reset),
.en(ena&(ss == 8'h59)),
.cout_out(mm)
);
counter_60 counter3(
.clk(clk),
.reset(reset),
.en(ena),
.cout_out(ss)
);
if(reset) pm <= 0;
else ;
end
endmodule
Note that in the top-level module, the hour bit, that is, the counting enable en of
counter1, should be set to:
The minute bit, that is, the count enable en of counter2 should be set to:
.en(ena&(ss == 8'h59))
The meaning of this paragraph is: when the number of seconds is 59, the minute can
only be counted once, and when the number of minutes is 59, the hour can only be
counted once.