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. Nun behandeln wir die nicht blockierende Zuweisung (<=), die auf einmal, parallel, ausgeführt wird.

Nicht blockierende Zuweisungen verwenden den Operator <=. Sie werden „nicht blockierend“ genannt, weil sie die Ausführung der nächsten Anweisung nicht blockieren. Alle nicht blockierenden Zuweisungen in einem Block werden zur gleichen Zeit ausgeführt.

Syntax:

variable <= expression;

Wann eine nicht blockierende Zuweisung verwendet wird

Eine nicht blockierende 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 (üblicherweise 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

Alle drei Zuweisungen finden gleichzeitig unter Verwendung der alten Werte statt. Am Ende des Zeitschritts werden alle Aktualisierungen gemeinsam durchgeführt.

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

Die nicht blockierende Zuweisung wird für sequentielle Logik verwendet: Schaltungen, die einen Takt nutzen und über einen Speicher verfügen (Flip-Flops, Register, Zähler).

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

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

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

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 von d
  • q2 erhält den alten Wert von q1

Das ist zu tun:

  1. Weise d q1 zu (nicht-blockierend)
  2. Weise q1 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: 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