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
endBlockierende Zuweisungen in Always-Blöcken (Kombinationslogik)
always @(*) begin
temp = a & b; // Schritt 1
out = temp | c; // Schritt 2 (verwendet temp aus Schritt 1)
endDie Reihenfolge ist wichtig. Das ist für kombinatorische Logik in Ordnung.
Blockierend vs. nicht blockierend
Blockierend (=) | Nicht blockierend (<=) | |
|---|---|---|
| Ausführung | Nacheinander | Alles gleichzeitig |
| Wartet die nächste Zeile? | Ja | Nein |
| Verwendung | Kombinatorische Logik | Sequenzielle Logik (Flip-Flops) |
Wichtig: Verwende keine blockierenden Zuweisungen für Flip-Flops
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:
- Weise den Wert von
xtempzu (speichere x in temp) - Weise den Wert von
yxzu (verschiebe y nach x) - Weise den Wert von
tempyzu (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
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellen9Prozedurale Blöcke
Always-BlockInitial-BlockSensitivitätslisteBlockierende ZuweisungNicht blockierende ZuweisungZusammenfassung – Always vs. InitialÜbe selbstständig: Online-Verilog-Compiler