https://hdlbits.01xz.net/wiki/Count_clock
module top_module(
input clk,
input reset,
input ena,
output pm,
output [7:0] hh,
output [7:0] mm,
output [7:0] ss);
reg [7:0] Q0, Q1, Q2;
reg enable_s;
reg enable_m;
reg enable_h;
cnt_60 u_s(.clk(clk),.reset(reset),.ena(enable_s),.Q(Q0));
cnt_60 u_m(.clk(clk),.reset(reset),.ena(enable_m),.Q(Q1));
cnt_12 u_h(.clk(clk),.reset(reset),.ena(enable_h),.Q(Q2));
always@(*) begin
if(reset) begin
enable_s = 1'b0;
enable_m = 1'b0;
enable_h = 1'b0;
end
else if(ena)begin
enable_s = 1'b1;
if(Q0 == 8'h59)
enable_m = 1'b1;
else
enable_m = 1'b0;
if(Q0 == 8'h59 && Q1 == 8'h59)
enable_h = 1'b1;
else
enable_h = 1'b0;
end
else begin
enable_s = 1'b0;
enable_m = 1'b0;
enable_h = 1'b0;
end
end
//pm
always @(posedge clk) begin
if(reset)
pm <= 0;
else if(Q0 == 8'h59 && Q1 == 8'h59 && Q2 == 8'h11)
pm <= ~pm;
end
assign ss = Q0;
assign mm = Q1;
assign hh = Q2;
endmodule
module cnt_60(
input clk,
input reset,
input ena,
output reg [7:0] Q
);
always @(posedge clk) begin
if(reset) Q <= 0;
else if(ena) begin
if(Q == 8’h59) Q <= 8’h00;
else if(Q[3:0] < 4’d9)
Q[3:0] <= Q[3:0] + 1;
else begin
Q[3:0] <= 0;
Q[7:4] <= Q[7:4] + 1;
end
end
end
endmodule
module cnt_12(
input clk,
input reset,
input ena,
output reg [7:0] Q
);
always @(posedge clk) begin
if(reset) Q <= 8’h12;
else if(ena) begin
if(Q == 8’h12) Q <= 8’h01;
else if(Q[3:0] < 4’d9)
Q[3:0] <= Q[3:0] + 1;
else begin
Q[3:0] <= 0;
Q[7:4] <= Q[7:4] + 1;
end
end
end
endmodule