Real Time Clock
Real Time Clock
TOP MODULE:-
module upcounter #(parameter max_value = 15, count_size = 4)
(input clk, rst, en, clr,
output reg [count_size-1 : 0] count );
always@(posedge clk or posedge rst or posedge clr)
begin
if(rst)
count <= 4'b0000;
else if (en)
begin
if (count == max_value)
count <= 4'b0000;
else
count <= count + 1;
end
end
endmodule
wire SECM_EN;
assign SECM_EN = (SECL == 4'b1001);
wire MINL_EN;
assign MINL_EN = ((SECM == 4'b0101) && (SECL == 4'b1001));
wire MINM_EN;
assign MINM_EN = ((MINL == 4'b1001) && (SECM == 4'b0101) && (SECL == 4'b1001));
wire HRL_EN;
assign HRL_EN = ((MINM == 4'b0101) && (MINL == 4'b1001) && (SECM == 4'b0101) && (SECL
== 4'b1001));
wire HRM_EN;
assign HRM_EN = ((HRL == 4'b1001) && (MINM == 4'b0101) && (MINL == 4'b1001) && (SECM
== 4'b0101) && (SECL == 4'b1001));
wire clrs;
assign clrs = ((HRL == 4'b0010) && (HRM == 4'b0011) && (MINM == 4'b0101) && (MINL ==
4'b1001) && (SECM == 4'b0101) && (SECL == 4'b1001));
Test module:-
module testbench;
reg clk, rst, en, clr;
wire [6:0] secl, secm, minl, minm, hrl, hrm;
real_time_clock rtc (
.clk(clk),
.rst(rst),
.en(en),
.clr(clr),
.secl(secl),
.secm(secm),
.minl(minl),
.minm(minm),
.hrl(hrl),
.hrm(hrm)
);
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
rst = 1;
en = 0;
clr = 0;
#15;
rst = 0;
en = 1;
#1000000;
clr = 1;
#10;
clr = 0;
#100
$stop();
end
initial begin
$monitor("Time: %0t | SECL: %b | SECM: %b | MINL: %b | MINM: %b | HRL: %b | HRM: %b",
$time, secl, secm, minl, minm, hrl, hrm);
end
endmodule
OUTPUT:-