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 werden wir die nicht-blockierende Zuweisung (<=) behandeln, die alle gleichzeitig ausgeführt wird – parallel.
Nicht-blockierende Zuweisungen verwenden den <=-Operator. Sie werden als „nicht-blockierend“ bezeichnet, da sie die Ausführung der nächsten Anweisung nicht blockieren. Alle nicht-blockierenden Zuweisungen in einem Block werden gleichzeitig ausgeführt.
Syntax:
variable <= expression;Wann man nicht-blockierende Zuweisungen verwendet
Die nicht-blockierende Zuweisung (<=) wird für sequenzielle Logik verwendet — Schaltungen, die einen Takt verwenden und über Speicher verfügen. Ausgänge ändern sich nur bei einer Taktflanke (normalerweise die steigende Flanke).
Beispiele für sequentielle Logik:
- Flipflops
- 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
endAlle drei Zuweisungen erfolgen gleichzeitig unter Verwendung der alten Werte. Am Ende des Zeitschritts erfolgen alle Aktualisierungen gemeinsam.
Non-Blocking in Always-Blöcken (sequenzielle Logik)
Non-Blocking wird für sequenzielle Logik verwendet — Schaltungen, die einen Takt verwenden und Speicher besitzen (Flipflops, Register, Zähler).
always @(posedge clk) begin
q <= d; // q erhält d bei der Taktflanke
count <= count + 1; // count erhöht sich bei der Taktflanke
endBeide Zuweisungen erfolgen gleichzeitig und verwenden die Werte von vor der Taktflanke.
Zusammenfassung
| Regel | Erklärung |
|---|---|
Verwenden Sie <= für sequentielle Logik | always @(posedge clk) |
Verwenden Sie = für kombinatorische Logik | always @(*) |
| Nicht-blockierende Zuweisungen werden parallel ausgeführt | Alle Zuweisungen erfolgen gleichzeitig |
| Werte werden am Ende des Zeitschritts aktualisiert | Nicht sofort |
Aufgabe
Vervollständigen Sie die nicht-blockierende Zuweisung
Fügen Sie die fehlenden nicht-blockierenden Zuweisungen hinzu, damit dieses 2-Bit-Schieberegister funktioniert.
Wie es funktioniert:
- Bei jeder Taktflanke erhält
q1den Wert vond q2erhält den alten Wert vonq1
Was zu tun ist:
- Weisen Sie
danq1zu (nicht-blockierend) - Weisen Sie
q1anq2zu (nicht-blockierend)
Spickzettel
Nicht-blockierende Zuweisung (<=) führt alle Anweisungen parallel aus — unter Verwendung alter Werte, die am Ende des Zeitschritts aktualisiert werden.
// Alle verwenden ALTE Werte von a und b
a <= 5;
b <= a + 2; // verwendet altes a
c <= b * 3; // verwendet altes bVerwenden Sie <= für sequentielle Logik (Flip-Flops, Register, Zähler) innerhalb von getakteten always-Blöcken:
always @(posedge clk) begin
q <= d; // nicht-blockierend
count <= count + 1; // nicht-blockierend
end| Zuweisung | Verwendung für | Ausführung |
|---|---|---|
<= | Sequentielle Logik (posedge clk) | Parallel |
= | Kombinatorische Logik (always @(*)) | Schritt für Schritt |
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: d an q1 zuweisen (nicht-blockierend)
// Schritt 2: q1 an q2 zuweisen (nicht-blockierend)
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