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 werden wir die nicht-blockierende Zuweisung (<=) behandeln, die alle gleichzeitig ausgeführt wird – parallel.

Nicht-blockierende Zuweisungen verwenden den <=-Operator. Sie werden als „nicht-blockierend“ bezeichnet, da sie die Ausführung der nächsten Anweisung nicht blockieren. Alle nicht-blockierenden Zuweisungen in einem Block werden gleichzeitig ausgeführt.

Syntax:

variable <= expression;

Wann man nicht-blockierende Zuweisungen verwendet

Die nicht-blockierende Zuweisung (<=) wird für sequenzielle Logik verwendet — Schaltungen, die einen Takt verwenden und über Speicher verfügen. Ausgänge ändern sich nur bei einer Taktflanke (normalerweise die steigende Flanke).

Beispiele für sequentielle Logik:

  • Flipflops
  • Register
  • Zähler
  • Zustandsautomaten
  • 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 gleichzeitig unter Verwendung der alten Werte. Am Ende des Zeitschritts erfolgen alle Aktualisierungen gemeinsam.

Non-Blocking in Always-Blöcken (sequenzielle Logik)

Non-Blocking wird für sequenzielle Logik verwendet — Schaltungen, die einen Takt verwenden und Speicher besitzen (Flipflops, Register, Zähler).

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

Beide Zuweisungen erfolgen gleichzeitig und verwenden die Werte von vor der Taktflanke.

Zusammenfassung

RegelErklärung
Verwenden Sie <= für sequentielle Logikalways @(posedge clk)
Verwenden Sie = für kombinatorische Logikalways @(*)
Nicht-blockierende Zuweisungen werden parallel ausgeführtAlle Zuweisungen erfolgen gleichzeitig
Werte werden am Ende des Zeitschritts aktualisiertNicht sofort
challenge icon

Aufgabe

Vervollständigen Sie die nicht-blockierende Zuweisung

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

Wie es funktioniert:

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

Was zu tun ist:

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

Spickzettel

Nicht-blockierende Zuweisung (<=) führt alle Anweisungen parallel aus — unter Verwendung alter Werte, die am Ende des Zeitschritts aktualisiert werden.

// Alle verwenden ALTE Werte von a und b
a <= 5;
b <= a + 2;  // verwendet altes a
c <= b * 3;  // verwendet altes b

Verwenden Sie <= für sequentielle Logik (Flip-Flops, Register, Zähler) innerhalb von getakteten always-Blöcken:

always @(posedge clk) begin
  q     <= d;           // nicht-blockierend
  count <= count + 1;   // nicht-blockierend
end
ZuweisungVerwendung fürAusführung
<=Sequentielle Logik (posedge clk)Parallel
=Kombinatorische Logik (always @(*))Schritt für Schritt

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: d an q1 zuweisen (nicht-blockierend)
      // Schritt 2: q1 an q2 zuweisen (nicht-blockierend)
    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