/*Timer soll signalisieren, wenn 10 Sekunden vorbei sind. 
Zusätzlich soll der Taster abgefragt werden. Wenn der Taster für 1 Sekunde aktiv ist, soll es signalisiert werden.

inClk: Eingang für Clock 12MHz
inTaste: Eingang Taster
inEN: Enable Pin, wenn HIGH dann stoppt Timer
outReadTemp: signalisiert, dass 10 Sekunden vorbei sind
outTasteAktiv: signalisiert, dass der Taster betätigt wurde
*/


module timer(input inClk, inTaste, inEN, output reg outReadTemp, outTasteAktiv);
  //Wird genutzt um den Eingangstakt zu teilen.
  int divide1 = 30000000;	
  int divide2 = 60000;		
  
  //Interne Zwischenspeicher; 
  logic 			state = 0;
  logic [31:0] 		count1 = 32'b0;
  logic [31:0]		count2 = 32'b0;
  
  //Initialisierung
  initial begin
    outReadTemp = 0;
	outTasteAktiv = 0;
  end

   always @(posedge inClk or posedge inEN) begin
	//Bei positiver Flanke und inEN auf HIGH wird Timer gestoppt
	   if(inEN) begin
      count1 <= 0;
	  count2 <= 0;
	  outReadTemp <= 0;
	   end
	//sonst wird counter1 inkrementiert
	else begin
      count1 <= count1 +1;
     if(count1>=((2**32)-1))
		count1 <= 32'b0;
	//wenn counter1 durch divide1 teilbar ist, so wird outReadTemp getoggelt --> es erfolgt ca. alle 5 Sekunden ein toggeln
	//outReadTemp ist für 5 Sekunden HIGH und 5 Sekunden LOW
     if(count1 % divide1 == 0)
       outReadTemp <= ~outReadTemp;

	//Bei positiver Flanke wird Taster abgefragt
	//Solange Taster HIGH ist wird counter2 erhöht	
	if(inTaste) begin
		count2 <= count2 +1;
	//Sobald counter2 den Wert 6 000 000 übersteigt, wird outTasteAktiv auf HIGH gesetzt --> Taster wurde 1 Sekunde betätigt
		if(count2 >= 6000000) 
			outTasteAktiv = 1;
		end
	//Wenn Taster losgelassen wird, dann wird Ausgang und counter2 zurück gesetzt.
		else begin
			outTasteAktiv <= 0;
			count2 <= 0;
		end	
		end
	end
endmodule // clk_divider


/*Parallelport, soll die Daten des ADC alle 10 Sekunden auslesen und auf den Bus legen. 

inClk: Eingang für Clock 12MHz
inTimerMeas: Eingang des 10 Sekunden Takt des Timers
inEndOdConv: Eingang vom ADC; Signalisiert valide Daten im ADC
[7:0] inData: Eingang der Daten (parallel)
outDataValid: Signalisiert, dass Daten auf Bus vaild sind
[7:0] outData: Ausgang der Daten (parallel)
*/

module parallelport(input inClk, inTimerMeas, inEndOfConv, [7:0] inData, output reg outDataValid, [7:0] outData);

	//Zwischenspeicher der Daten
	logic [7:0] 		storage = 8'b0;
	
	//Initalisierung
	initial begin
		outDataValid <= 0;
		outData <= 8'b0;
		end
		
		always @(posedge inClk) begin
			//Wenn inEndOfConv HIGH ist, dann werden die Daten in den Zwischenspeicher gelegt
			if(inEndOfConv)
				storage <= inData;
			//Wenn inTimerMeas HIGH ist, dann werden die Daten aus dem Zwischenspeicher in das Ausgangsregister gelegt
			//Außerdem wird outDataValid auf HIGH gesetzt, was dem Bus signalisiert, dass die Daten gelesen werden können
			if(inTimerMeas == 1 && outDataValid == 0) begin
				outData = storage;
				outDataValid <= 1;
			end
			//Wenn inTimerMeas LOW ist, dann wird outDataValid auf LOW gesetzt
			else if(inTimerMeas == 0)
				outDataValid <= 0;
		end	
endmodule