|
|
|
|
|
|
|
|
//clock divider |
|
|
|
|
|
|
|
|
/*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); |
|
|
module timer(input inClk, inTaste, inEN, output reg outReadTemp, outTasteAktiv); |
|
|
int divide1 = 30000000; |
|
|
|
|
|
int divide2 = 60000; |
|
|
|
|
|
|
|
|
//Wird genutzt um den Eingangstakt zu teilen. |
|
|
|
|
|
int divide1 = 30000000; |
|
|
|
|
|
int divide2 = 60000; |
|
|
|
|
|
|
|
|
|
|
|
//Interne Zwischenspeicher; |
|
|
logic state = 0; |
|
|
logic state = 0; |
|
|
logic [31:0] count1 = 32'b0; |
|
|
logic [31:0] count1 = 32'b0; |
|
|
logic [31:0] count2 = 32'b0; |
|
|
logic [31:0] count2 = 32'b0; |
|
|
|
|
|
|
|
|
|
|
|
//Initialisierung |
|
|
initial begin |
|
|
initial begin |
|
|
outReadTemp = 0; |
|
|
outReadTemp = 0; |
|
|
outTasteAktiv = 0; |
|
|
outTasteAktiv = 0; |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
always @(posedge inClk or posedge inEN) begin |
|
|
always @(posedge inClk or posedge inEN) begin |
|
|
|
|
|
//Bei positiver Flanke und inEN auf HIGH wird Timer gestoppt |
|
|
if(inEN) begin |
|
|
if(inEN) begin |
|
|
count1 <= 0; |
|
|
count1 <= 0; |
|
|
count2 <= 0; |
|
|
count2 <= 0; |
|
|
outReadTemp <= 0; |
|
|
outReadTemp <= 0; |
|
|
end |
|
|
end |
|
|
|
|
|
//sonst wird counter1 inkrementiert |
|
|
else begin |
|
|
else begin |
|
|
count1 <= count1 +1; |
|
|
count1 <= count1 +1; |
|
|
if(count1>=((2**32)-1)) |
|
|
if(count1>=((2**32)-1)) |
|
|
count1 <= 32'b0; |
|
|
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) |
|
|
if(count1 % divide1 == 0) |
|
|
outReadTemp <= ~outReadTemp; |
|
|
outReadTemp <= ~outReadTemp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Bei positiver Flanke wird Taster abgefragt |
|
|
|
|
|
//Solange Taster HIGH ist wird counter2 erhöht |
|
|
if(inTaste) begin |
|
|
if(inTaste) begin |
|
|
count2 <= count2 +1; |
|
|
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) |
|
|
if(count2 >= 6000000) |
|
|
outTasteAktiv = 1; |
|
|
outTasteAktiv = 1; |
|
|
end |
|
|
end |
|
|
|
|
|
//Wenn Taster losgelassen wird, dann wird Ausgang und counter2 zurück gesetzt. |
|
|
else begin |
|
|
else begin |
|
|
outTasteAktiv <= 0; |
|
|
outTasteAktiv <= 0; |
|
|
count2 <= 0; |
|
|
count2 <= 0; |
|
|
end |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
end |
|
|
|
|
|
end |
|
|
end |
|
|
end |
|
|
endmodule // clk_divider |
|
|
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); |
|
|
module parallelport(input inClk, inTimerMeas, inEndOfConv, [7:0] inData, output reg outDataValid, [7:0] outData); |
|
|
|
|
|
|
|
|
|
|
|
//Zwischenspeicher der Daten |
|
|
logic [7:0] storage = 8'b0; |
|
|
logic [7:0] storage = 8'b0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Initalisierung |
|
|
initial begin |
|
|
initial begin |
|
|
outDataValid <= 0; |
|
|
outDataValid <= 0; |
|
|
outData <= 8'b0; |
|
|
outData <= 8'b0; |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
always @(posedge inClk) begin |
|
|
always @(posedge inClk) begin |
|
|
|
|
|
//Wenn inEndOfConv HIGH ist, dann werden die Daten in den Zwischenspeicher gelegt |
|
|
if(inEndOfConv) |
|
|
if(inEndOfConv) |
|
|
storage <= inData; |
|
|
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 |
|
|
if(inTimerMeas == 1 && outDataValid == 0) begin |
|
|
outData = storage; |
|
|
outData = storage; |
|
|
outDataValid <= 1; |
|
|
outDataValid <= 1; |
|
|
end |
|
|
end |
|
|
|
|
|
//Wenn inTimerMeas LOW ist, dann wird outDataValid auf LOW gesetzt |
|
|
else if(inTimerMeas == 0) |
|
|
else if(inTimerMeas == 0) |
|
|
outDataValid <= 0; |
|
|
outDataValid <= 0; |
|
|
end |
|
|
end |