Menu
Coddy logo textTech

Nicht-blockierende Zuweisung

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 50 von 90.

In der vorherigen Lektion haben wir die blockierende Zuweisung (=) behandelt, die Schritt für Schritt ausgeführt wird. Jetzt behandeln wir die nicht-blockierende Zuweisung (<=), die alles auf einmal ausführt — also parallel.

Die non-blocking Zuordnung verwendet den Operator <=. Sie wird "non-blocking" genannt, weil sie die Ausführung der nächsten Anweisung nicht blockiert. Alle non-blocking Zuordnungen in einem Block werden zur gleichen Zeit ausgeführt.

Syntax:

variable <= expression;

Wann Non-blocking-Zuweisungen verwendet werden

Non-blocking-Zuweisungen (<=) werden für sequenzielle Logik verwendet — Schaltungen, die einen clock nutzen und Speicher haben. Ausgänge ändern sich nur an einer clock edge (in der Regel die steigende Flanke).

Beispiele für sequenzielle Logik:

  • Flip-Flops
  • Register
  • Zähler
  • Zustandsmaschinen
  • Schieberegister

Verilog-Beispiel:

initial begin
  a <= 5;      // Geplant, aber noch nicht ausgeführt
  b <= a + 2;  // Geplant, verwendet den ALTEN Wert von a
  c <= b * 3;  // Geplant, verwendet den ALTEN Wert von b
end

Alle drei Zuweisungen erfolgen zur selben Zeit unter Verwendung der old-Werte. Am Ende des Zeitschritts erfolgen alle Aktualisierungen zusammen.

Non-blocking in Always-Blöcken (Sequenzielle Logik)

Non-blocking wird für sequenzielle Logik verwendet — Schaltungen, die einen Takt (Clock) nutzen und über Speicher verfügen (Flipflops, Register, Zähler).

always @(posedge clk) begin
  q <= d;           // q erhält d bei Taktflanke
  count <= count + 1; // count inkrementiert bei Taktflanke
end

Beide Zuweisungen erfolgen gleichzeitig unter Verwendung von values von vor der clock edge.

Zusammenfassung

RegelErklärung
Verwende <= für sequentielle Logikalways @(posedge clk)
Verwende = für kombinatorische Logikalways @(*)
Non-blocking wird parallel ausgeführtAlle Zuweisungen erfolgen gleichzeitig
Werte aktualisieren am Ende des ZeitschrittsNicht sofort
challenge icon

Aufgabe

Vervollständige die nicht-blockierende Zuweisung

Füge die fehlenden nicht-blockierenden Zuweisungen hinzu, damit dieses 2-Bit-Schieberegister funktioniert.

So funktioniert es:

  • Bei jeder Taktflanke erhält q1 den Wert d
  • q2 erhält den alten Wert von q1

Was zu tun ist:

  1. Weise d an q1 zu (nicht-blockierend)
  2. Weise q1 an q2 zu (nicht-blockierend)

Probier es selbst

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: Schiebelogik hinzufügen
      // Schritt 1: Weise d q1 zu (non-blocking)
      // Schritt 2: Weise q1 q2 zu (non-blocking)
    end
  end
endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen