Menu
Coddy logo textTech

Blockierende Zuweisung

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

Verilog verfügt über zwei Arten prozeduraler Zuweisungen: blockierend (=) und nicht blockierend (<=). In dieser Lektion konzentrieren wir uns auf die blockierende Zuweisung.

Eine blockierende Zuweisung verwendet den Operator =. Sie wird als „blockierend“ bezeichnet, weil sie die Ausführung der nächsten Anweisung blockiert, bis die aktuelle Zuweisung abgeschlossen ist. Der Code wird Schritt für Schritt und der Reihe nach ausgeführt.

Syntax:

variable = expression;

Wann eine blockierende Zuweisung verwendet wird

Eine blockierende Zuweisung (=) wird für kombinatorische Logik verwendet: Schaltungen, bei denen sich die Ausgänge sofort ändern, wenn sich die Eingänge ändern, ohne Takt und ohne Speicher.

Beispiele für kombinatorische Logik:

  • UND-/ODER-/XOR-Gatter
  • Addierer und Subtrahierer
  • Multiplexer
  • Decoder

Verilog-Beispiel:

always @(*) begin
  sum = a + b;      // blockierende Zuweisung
  carry = a & b;    // blockierende Zuweisung
end

Blockierende Zuweisungen in Always-Blöcken (Kombinationslogik)

always @(*) begin
  temp = a & b;    // Schritt 1
  out = temp | c;  // Schritt 2 (verwendet temp aus Schritt 1)
end

Die Reihenfolge ist wichtig. Das ist für kombinatorische Logik in Ordnung.

Blockierend vs. nicht blockierend

 Blockierend (=)Nicht blockierend (<=)
AusführungNacheinanderAlles gleichzeitig
Wartet die nächste Zeile?JaNein
VerwendungKombinatorische LogikSequenzielle Logik (Flip-Flops)

Wichtig: Verwende keine blockierenden Zuweisungen für Flip-Flops

challenge icon

Aufgabe

Füge die fehlenden blockierenden Zuweisungen hinzu, um die Werte von x und y mithilfe einer temporären Variablen zu vertauschen.

Was zu tun ist:

  1. Weise den Wert von x temp zu (speichere x in temp)
  2. Weise den Wert von y x zu (verschiebe y nach x)
  3. Weise den Wert von temp y zu (verschiebe das gespeicherte x nach y)

Probier es selbst

module swap;
  reg x, y;
  reg temp;
  
  initial begin
    x = 1;
    y = 0;
    
    $display("Before swap: x=%d, y=%d", x, y);
    
    // TODO: Schritt 1 - Weise x temp zu
    
    // TODO: Schritt 2 - Weise y x zu
    
    // TODO: Schritt 3 - Weise temp y zu
    
    $display("After swap: x=%d, y=%d", x, y);
    $finish;
  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