Menu
Coddy logo textTech

Non Blocking Assignment

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

In der vorherigen Lektion haben wir die blocking assignment (=) behandelt, die Schritt für Schritt ausgeführt wird. Nun behandeln wir die non-blocking assignment (<=), die auf einmal, parallel, ausgeführt wird.

Eine Non-blocking-Zuweisung verwendet den Operator <=. Sie wird „non-blocking“ genannt, weil sie die Ausführung der nächsten Anweisung nicht blockiert. Alle Non-blocking-Zuweisungen in einem Block werden zur gleichen Zeit ausgeführt.

Syntax:

variable <= expression;

Wann eine Non-Blocking-Zuweisung verwendet wird

Eine Non-Blocking-Zuweisung (<=) wird für sequentielle Logik verwendet: Schaltungen, die einen Takt verwenden und über einen Speicher verfügen. Ausgänge ändern sich nur an einer Taktflanke (normalerweise an der steigenden Flanke).

Beispiele für sequenzielle Logik:

  • Flip-Flops
  • 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

All drei Zuweisungen geschehen zur gleichen Zeit unter Verwendung der old values. Am Ende des Zeitschritts erfolgen alle Aktualisierungen gemeinsam.

Nicht-blockierend in Always-Blöcken (sequentielle Logik)

Nicht-blockierend wird für sequentielle Logik verwendet: Schaltungen, die einen Takt verwenden und über einen Speicher verfügen (Flip-Flops, Register, Zähler).

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

Beide Zuweisungen erfolgen gleichzeitig und verwenden values von vor der clock edge.

Zusammenfassung

RegelErklärung
Verwende <= für sequenzielle Logikalways @(posedge clk)
Verwende = für kombinatorische Logikalways @(*)
Nicht blockierende Zuweisungen werden parallel ausgeführtAll assignments happen at once
Werte werden am Ende des Zeitschritts aktualisiertNicht sofort
challenge icon

Aufgabe

Die Non-Blocking-Zuweisung vervollständigen

Füge die fehlenden non-blocking assignments hinzu, damit dieses 2-Bit-Schieberegister funktioniert.

So funktioniert es:

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

Aufgabe:

  1. Weise d q1 zu (non-blocking)
  2. Weise q1 q2 zu (non-blocking)

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: Shift-Logik hinzufügen
      // Schritt 1: Weise d q1 zu (nicht-blockierend)
      // Schritt 2: Weise q1 q2 zu (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

Übe selbstständig: Online-Verilog-Compiler