Projektdaten für das ESY1B Praktikum im Sommersemester 2022
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

timer_top.sv 3.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*Timer soll signalisieren, wenn 10 Sekunden vorbei sind.
  2. Zusätzlich soll der Taster abgefragt werden. Wenn der Taster für 1 Sekunde aktiv ist, soll es signalisiert werden.
  3. inClk: Eingang für Clock 12MHz
  4. inTaste: Eingang Taster
  5. inEN: Enable Pin, wenn HIGH dann stoppt Timer
  6. outReadTemp: signalisiert, dass 10 Sekunden vorbei sind
  7. outTasteAktiv: signalisiert, dass der Taster betätigt wurde
  8. */
  9. module timer(input inClk, inTaste, inEN, output reg outReadTemp, outTasteAktiv);
  10. //Wird genutzt um den Eingangstakt zu teilen.
  11. int divide1 = 30000000;
  12. int divide2 = 60000;
  13. //Interne Zwischenspeicher;
  14. logic state = 0;
  15. logic [31:0] count1 = 32'b0;
  16. logic [31:0] count2 = 32'b0;
  17. //Initialisierung
  18. initial begin
  19. outReadTemp = 0;
  20. outTasteAktiv = 0;
  21. end
  22. always @(posedge inClk or posedge inEN) begin
  23. //Bei positiver Flanke und inEN auf HIGH wird Timer gestoppt
  24. if(inEN) begin
  25. count1 <= 0;
  26. count2 <= 0;
  27. outReadTemp <= 0;
  28. end
  29. //sonst wird counter1 inkrementiert
  30. else begin
  31. count1 <= count1 +1;
  32. if(count1>=((2**32)-1))
  33. count1 <= 32'b0;
  34. //wenn counter1 durch divide1 teilbar ist, so wird outReadTemp getoggelt --> es erfolgt ca. alle 5 Sekunden ein toggeln
  35. //outReadTemp ist für 5 Sekunden HIGH und 5 Sekunden LOW
  36. if(count1 % divide1 == 0)
  37. outReadTemp <= ~outReadTemp;
  38. //Bei positiver Flanke wird Taster abgefragt
  39. //Solange Taster HIGH ist wird counter2 erhöht
  40. if(inTaste) begin
  41. count2 <= count2 +1;
  42. //Sobald counter2 den Wert 6 000 000 übersteigt, wird outTasteAktiv auf HIGH gesetzt --> Taster wurde 1 Sekunde betätigt
  43. if(count2 >= 6000000)
  44. outTasteAktiv = 1;
  45. end
  46. //Wenn Taster losgelassen wird, dann wird Ausgang und counter2 zurück gesetzt.
  47. else begin
  48. outTasteAktiv <= 0;
  49. count2 <= 0;
  50. end
  51. end
  52. end
  53. endmodule // clk_divider
  54. /*Parallelport, soll die Daten des ADC alle 10 Sekunden auslesen und auf den Bus legen.
  55. inClk: Eingang für Clock 12MHz
  56. inTimerMeas: Eingang des 10 Sekunden Takt des Timers
  57. inEndOdConv: Eingang vom ADC; Signalisiert valide Daten im ADC
  58. [7:0] inData: Eingang der Daten (parallel)
  59. outDataValid: Signalisiert, dass Daten auf Bus vaild sind
  60. [7:0] outData: Ausgang der Daten (parallel)
  61. */
  62. module parallelport(input inClk, inTimerMeas, inEndOfConv, [7:0] inData, output reg outDataValid, [7:0] outData);
  63. //Zwischenspeicher der Daten
  64. logic [7:0] storage = 8'b0;
  65. //Initalisierung
  66. initial begin
  67. outDataValid <= 0;
  68. outData <= 8'b0;
  69. end
  70. always @(posedge inClk) begin
  71. //Wenn inEndOfConv HIGH ist, dann werden die Daten in den Zwischenspeicher gelegt
  72. if(inEndOfConv)
  73. storage <= inData;
  74. //Wenn inTimerMeas HIGH ist, dann werden die Daten aus dem Zwischenspeicher in das Ausgangsregister gelegt
  75. //Außerdem wird outDataValid auf HIGH gesetzt, was dem Bus signalisiert, dass die Daten gelesen werden können
  76. if(inTimerMeas == 1 && outDataValid == 0) begin
  77. outData = storage;
  78. outDataValid <= 1;
  79. end
  80. //Wenn inTimerMeas LOW ist, dann wird outDataValid auf LOW gesetzt
  81. else if(inTimerMeas == 0)
  82. outDataValid <= 0;
  83. end
  84. endmodule