Blockierende Zuweisung
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 49 von 90.
Verilog hat zwei Arten von prozeduralen Zuweisungen: blocking (=) und non-blocking (<=). In dieser Lektion konzentrieren wir uns auf blocking assignment.
Blockierende Zuweisung (Blocking assignment) verwendet den =-Operator. Sie wird „blockierend“ genannt, weil sie die Ausführung der nächsten Anweisung blockiert, bis die aktuelle Zuweisung abgeschlossen ist. Der Code läuft Schritt für Schritt in Reihenfolge ab.
Syntax:
variable = expression;Wann Blocking Assignment verwendet wird
Blocking Assignment (=) 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:
- AND- / OR- / XOR-Gatter
- Addierer und Subtrahierer
- Multiplexer
- Decoder
Verilog-Beispiel:
always @(*) begin
sum = a + b; // blockierende Zuweisung
carry = a & b; // blockierende Zuweisung
endBlocking in Always-Blöcken (Kombinatorische Logik)
always @(*) begin
temp = a & b; // Schritt 1
out = temp | c; // Schritt 2 (verwendet temp aus Schritt 1)
endDie Reihenfolge ist wichtig. Für Kombinationslogik ist das in Ordnung.
Blocking vs Non-Blocking
Blocking (=) | Non-blocking (<=) | |
|---|---|---|
| Execution | Nacheinander | Alle auf einmal |
| Next line waits? | Ja | Nein |
| Uses | Kombinatorische Logik | Sequenzielle Logik (Flipflops) |
Wichtig: Verwenden Sie kein Blocking für Flip-Flops
Aufgabe
Füge die fehlenden blockierenden Zuweisungen hinzu, um die Werte von x und y mithilfe einer temporären Variable zu vertauschen.
Was zu tun ist:
- Weise den Wert von
xder Variabletempzu (speichere x in temp) - Weise den Wert von
yder Variablexzu (verschiebe y nach x) - Weise den Wert von
tempder Variableyzu (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. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen9Prozedurale Blöcke
Always-BlockInitial-BlockSensitivitätslisteBlockierende ZuweisungNicht-blockierende ZuweisungZusammenfassung – Always vs. Initial