
module real_time_clk(clk,reset,hour1,hour2,minute1,minute2,second1,second2, 
hr_A2, min_A1, sec_A0, load, data_in);


input clk,reset;
output reg [6:0]hour1,hour2,minute1,minute2,second1,second2;
input load;
input hr_A2,min_A1,sec_A0;
input [7:0]data_in;reg clk_sec,clk_ms;
reg [7:0]sec,min,hr;

integer timer_counter1=0,timer_counter2=0;


		always @(posedge clk)
		
		begin
			if(timer_counter1 == 3999)
				begin
					timer_counter1 = 0;
					clk_ms = 1'b1;
				end	
			else
				begin 
					timer_counter1 = timer_counter1 + 1;
					clk_ms = 1'b0;
				end		
		end
				
		always @(posedge clk_ms)
		
		begin
			if(timer_counter2 == 999)
				begin
					timer_counter2 = 0;
					clk_sec = 1'b1;
				end	
			else
				begin 
					timer_counter2 = timer_counter2 + 1;
					clk_sec = 1'b0;
				end		
		end		
				
		always @(posedge clk_sec)
		
		begin
		
			if(~reset)
				begin
					sec = 0;
					min = 0;
					hr = 0;
				end
		    else
			
			if(~load)
				begin
					if(hr_A2)
						begin
							if(hr[7:4] == 4'b0010)
								begin
									if(hr[3:0] < 4'b0100)
									   hr = data_in;
								end
							else if(hr[7:4] < 4'b0010)
									hr = data_in;
									else
									hr = 8'b0;
						end			
									
					if(min_A1)
						begin
							if(min[7:4] < 4'b0110)
									min = data_in;
									else
									min = 8'b0;
						end
				
						if(sec_A0)
						begin
							if(min[7:4] < 4'b0110)
									min = data_in;
									else
									sec = 1'b0;
						end
				end
				
			else

				begin
					
					if(sec[3:0] == 4'b1001)
						begin		
							sec[3:0] = 4'b0;
							if(sec[7:4] == 4'b0101)
								begin
								sec[7:4] = 4'b0;
								if(min[3:0] == 4'b0101)
								begin
									min[3:0] = 4'b0;
									if(min[7:4] == 4'b1001)
										begin
											min[7:4] = 4'b0;	
											if(hr == 8'b00100011)
											hr = 0;
											else if(hr[3:0] == 4'b1001)
											begin
												hr[3:0] = 4'b0;
												hr[7:4] = hr[7:4] +1 ;
											end	
				                    else
											hr[3:0] = hr[3:0] + 1;
									end
									else
											min[7:4] = hr[7:4] + 1;
							    end
								else
											min[3:0] = min[3:0] + 1;
								end
								else
											sec[7:4] = sec[7:4] + 1;
								end
								else
								
								sec[3:0] = sec[3:0] + 1;

					end
			end				

			
			always@(sec)
				begin
				case (sec[3:0])
				4'b0000: second1=7'b1111110;
				4'b0001: second1=7'b0110000;
				4'b0010: second1=7'b1101101;
				4'b0011: second1=7'b1111001;
				4'b0100: second1=7'b0110011;
				4'b0101: second1=7'b1011011;
				4'b0110: second1=7'b1011111;
				4'b0111: second1=7'b1110000;
				4'b1000: second1=7'b1111111;
				4'b1001: second1=7'b1111011;
				default: second1=7'b0;
				endcase
			end
			
			always@(sec)
				begin
				case(sec[7:4])
				4'b0000: second2=7'b1111110;
				4'b0001: second2=7'b0110000;
				4'b0010: second2=7'b1101101;
				4'b0011: second2=7'b1111001;
				4'b0100: second2=7'b0110011;
				4'b0101: second2=7'b1011011;
				4'b0110: second2=7'b1011111;
				4'b0111: second2=7'b1110000;
				4'b1000: second2=7'b1111111;
			  4'b1001: second2=7'b1111011;
				default: second2=7'b0;
			    endcase
			end

			always@(min)
				begin
				case(min[3:0])
				4'b0000: minute1=7'b1111110;
				4'b0001: minute1=7'b0110000;
				4'b0010: minute1=7'b1101101;
				4'b0011: minute1=7'b1111001;
				4'b0100: minute1=7'b0110011;
				4'b0101: minute1=7'b1011011;
				4'b0110: minute1=7'b1011111;
				4'b0111: minute1=7'b1110000;
				4'b1000: minute1=7'b1111111;
				4'b1001: minute1=7'b1111011;
				default: minute1=7'b0;
				endcase
			end
			
			always@(min)
				begin
				case(min[7:4])
				4'b0000: minute2=7'b1111110;
				4'b0001: minute2=7'b0110000;
				4'b0010: minute2=7'b1101101;
				4'b0011: minute2=7'b1111001;
				4'b0100: minute2=7'b0110011;
				4'b0101: minute2=7'b1011011;
				4'b0110: minute2=7'b1011111;
				4'b0111: minute2=7'b1110000;
				4'b1000: minute2=7'b1111111;
				4'b1001: minute2=7'b1111011;
				default: minute2=7'b0;
				endcase
			end


			always@(hr)
				begin
				case(hr[3:0])
				4'b0000: hour1=7'b1111110;
				4'b0001: hour1=7'b0110000;
				4'b0010: hour1=7'b1101101;
				4'b0011: hour1=7'b1111001; 
				4'b0100: hour1=7'b0110011;
				4'b0101: hour1=7'b1011011;
				4'b0110: hour1=7'b1011111;
				4'b0111: hour1=7'b1110000;
				4'b1000: hour1=7'b1111111;
				4'b1001: hour1=7'b1111011;
				default: hour1=7'b1111110;
				endcase
			end

			always@(hr)
				begin
				case(hr[7:4])
				4'b0000: hour2=7'b1111110;
				4'b0001: hour2=7'b0110000;
				4'b0010: hour2=7'b1101101;
				default: hour2=7'b1111110;
				endcase
			end

endmodule


module eval_rtc();

   reg               clk;
   reg               reset;
  
   
  // wire [6:0]hour1,hour2,minute1,minute2,second1,second2;
   
   
   reg              load;
 
  /* real_time_clk DUT( .clk(clk),
                      .reset(reset), 
                      .hour1(hour1),
                      .hour2(hour2),
                      .minute1(minute1),
                      .minute2(minute2),
                      .second1(second1),
                      .second2(second2), 
                      .hr_A2(hr_A2), 
                      .min_A1(min_A1), 
                      .sec_A0(sec_A0), 
                      .load(load), 
                      .data_in(data_in));*/
   
//   clk,reset,hour1,hour2,minute1,minute2,second1,second2, 
//hr_A2, min_A1, sec_A0, load, data_in);
  
  
   
   initial
   begin
   clk = 1'b0;              
   reset = 1'b0;
   load = 1'b0;
   end
  
    always #10 clk = ~clk;
  
endmodule  
//module real_time_clk(clk,reset,hour1,hour2,minute1,minute2,second1,second2, 
//hr_A2, min_A1, sec_A0, load, data_in);

