Several Requirements For This Topic

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 7

12 Hour Clock

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.

Several requirements for this topic:

1.Able to count for 12 hours, it requires seconds, minutes, and hours;

2. Use BCD counter to achieve;

3. When reset is effective, reset to 12 o'clock;

4. Able to distinguish between morning and afternoon, morning pm is 0, afternoon pm is 1;


5. Reset has a higher priority than enable;

6. Since it is a clock, it is from 1 o'clock to 12 o'clock;

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.

The BCD counter code of modulo 60 is as follows:

module counter_60 (

input clk,

input en,

input reset,

output reg[7:0] cout_out

);

always @(posedge clk) begin

if(reset)

cout_out <= 0;

else if(en) begin

if (cout_out == 8'h59)

cout_out <= 0;

else begin
if(cout_out[3:0] == 9) begin

cout_out[3:0] <= 0;

cout_out[7:4] <= cout_out[7:4] + 1;

end

else

cout_out[3:0] <= cout_out[3:0] + 1;

end

end

end

endmodule

The BCD counter code of modulo 12 is as follows:

module counter_12 (

input clk,

input en,

input reset,

output reg[7:0] cout_out

);

always @(posedge clk) begin


if(reset)

cout_out <= 8'h12;

else if(en) begin

if (cout_out == 8'h12)

cout_out <= 1;

else begin

if(cout_out[3:0] == 9) begin

cout_out[3:0] <= 0;

cout_out[7:4] <= cout_out[7:4] + 1;

end

else

cout_out[3:0] <= cout_out[3:0] + 1;

end

end

end

endmodule

Finally, the top-level module:

module top_module(

input clk,
input reset,

input ena,

output pm,

output [7:0] hh,

output [7:0] mm,

output [7:0] ss);

counter_12 counter1(

.clk(clk),

.reset(reset),

.en(ena&(ss == 8'h59)&(mm == 8'h59)),

.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)

);

always@(posedge clk) begin

if(reset) pm <= 0;

else if(hh == 8'h11 && ss == 8'h59&& mm == 8'h59) pm <= ~pm;

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:

.en(ena&(ss == 8'h59)&(mm == 8'h59))

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.

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy