Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog Always Blocks: Syntax & Sensitivity Lists verstehen

Ein always Block ist einer der prozeduralen Blöcke in Verilog. Statements darin werden sequenziell ausgeführt.

Syntax

always @ (event) [statement]
always @ (event) begin [multiple statements] end

Ausführung bei definiertem Event. Event wird durch Sensitivity List definiert.

Was ist die Sensitivity List?

Ausdruck nach @ in Klammern (). Enthält ein oder mehrere Signale, deren Wertänderung den Block triggert.

// Ausführung bei Wertänderung von a ODER b
always @ (a or b) begin [statements] end

Wozu dient der always Block?

Realisiert kombinatorische oder sequenzielle Elemente. Sequenzielles Element (Flipflop) wird bei Clock/Reset aktiv. Kombinatorischer Block bei Input-Änderung. Hardware-Blöcke arbeiten konkurrierend. always Block als kontinuierlicher Prozess, getriggert bei Signal-Änderung in Sensitivity List.

Beispiel: Ausführung bei jeder positiven Flanke von clk.

always @ (posedge clk) begin [statements] end

Was passiert ohne Sensitivity List?

always Block wiederholt sich kontinuierlich während der Simulation. Sensitivity List bringt Timing-Semantik. Ohne Timing-Control-Statements → Zero-Delay Infinite Loop → Simulation hängt!

Beispiel: Hängende Simulation

always clk = ~clk; // Ausführung alle 0 Zeit-Einheiten → Endlosschleife bei Zeit 0

Selbst bei leerer Sensitivity List: Zeitverzögerung nötig. Simulation Time durch Delay-Statement im always voranbringen:

always #10 clk = ~clk; // Clock-Inversion alle 10 Zeit-Einheiten
Hinweis: Explizite Delays sind nicht synthetisierbar in Logikgatter! Echtes Verilog-Design benötigt immer Sensitivity List.

Sequenzielles Element Design-Beispiel: T-Flipflop

Modul tff: Data Input d, Clock, Active-Low Reset rstn. Output invertiert wenn d==1 bei posedge Clock. always Block getriggert bei posedge clk ODER negedge rstn.

module tff (input d, clk, rstn, output reg q);
    always @ (posedge clk or negedge rstn) begin
        if (!rstn) q <= 0;
        else if (d) q <= ~q;
        else q <= q;
    end
endmodule

Bei posedge Clock:

  1. Prüfe rstn: 0 → q=0 (Reset), 1 → Default-Verhalten
  2. Prüfe d: 1 → q invertieren, 0 → q halten

Bei negedge Reset:

rstn Wert ist 0 → Reset angewendet → q=0.

Kombinatorisches Element Design-Beispiel

Digitaler Schaltkreis aus 3 Logikgattern → Output o.

module combo (input a,b,c,d, output reg o);
    always @ (a or b or c or d) begin
        o <= ~((a & b) | (c ^ d));
    end
endmodule

Output o als reg deklariert (nutzung in Prozeduralblock). o = 1 wenn RHS true, 0 wenn false.

Verilog

  1. Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
  2. Verilog Concatenation meistern: Praktischer Leitfaden
  3. Verilog Essentials: Kurzer Überblick
  4. Verilog Assignments verstehen: Typen, Syntax und Best Practices
  5. Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
  6. Verilog Functions meistern für effizientes RTL-Design
  7. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  8. Verilog Clock Generator: Design & Implementierungsleitfaden
  9. Verilog Math Functions meistern für effizientes Hardware-Design
  10. Verilog $timeformat meistern: Präzision und Anzeigesteuerung