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. Jetzt behandeln wir die nicht-blockierende Zuweisung (<=), die alles auf einmal ausführt — also parallel.
Die non-blocking Zuordnung verwendet den Operator <=. Sie wird "non-blocking" genannt, weil sie die Ausführung der nächsten Anweisung nicht blockiert. Alle non-blocking Zuordnungen in einem Block werden zur gleichen Zeit ausgeführt.
Syntax:
variable <= expression;Wann Non-blocking-Zuweisungen verwendet werden
Non-blocking-Zuweisungen (<=) werden für sequenzielle Logik verwendet — Schaltungen, die einen clock nutzen und Speicher haben. Ausgänge ändern sich nur an einer clock edge (in der Regel die steigende Flanke).
Beispiele für sequenzielle Logik:
- Flip-Flops
- Register
- Zähler
- Zustandsmaschinen
- 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
endAlle drei Zuweisungen erfolgen zur selben Zeit unter Verwendung der old-Werte. Am Ende des Zeitschritts erfolgen alle Aktualisierungen zusammen.
Non-blocking in Always-Blöcken (Sequenzielle Logik)
Non-blocking wird für sequenzielle Logik verwendet — Schaltungen, die einen Takt (Clock) nutzen und über Speicher verfügen (Flipflops, Register, Zähler).
always @(posedge clk) begin
q <= d; // q erhält d bei Taktflanke
count <= count + 1; // count inkrementiert bei Taktflanke
endBeide Zuweisungen erfolgen gleichzeitig unter Verwendung von values von vor der clock edge.
Zusammenfassung
| Regel | Erklärung |
|---|---|
Verwende <= für sequentielle Logik | always @(posedge clk) |
Verwende = für kombinatorische Logik | always @(*) |
| Non-blocking wird parallel ausgeführt | Alle Zuweisungen erfolgen gleichzeitig |
| Werte aktualisieren am Ende des Zeitschritts | Nicht sofort |
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
q1den Wertd q2erhält den alten Wert vonq1
Was zu tun ist:
- Weise
danq1zu (nicht-blockierend) - Weise
q1anq2zu (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: Schiebelogik hinzufügen
// Schritt 1: Weise d q1 zu (non-blocking)
// Schritt 2: Weise q1 q2 zu (non-blocking)
end
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