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. Nun behandeln wir die nicht blockierende Zuweisung (<=), die auf einmal, parallel, ausgeführt wird.
Nicht blockierende Zuweisungen verwenden den Operator <=. Sie werden „nicht blockierend“ genannt, weil sie die Ausführung der nächsten Anweisung nicht blockieren. Alle nicht blockierenden Zuweisungen in einem Block werden zur gleichen Zeit ausgeführt.
Syntax:
variable <= expression;Wann eine nicht blockierende Zuweisung verwendet wird
Eine nicht blockierende Zuweisung (<=) wird für sequentielle Logik verwendet: Schaltungen, die einen Takt verwenden und über einen Speicher verfügen. Ausgänge ändern sich nur an einer Taktflanke (üblicherweise an der steigenden Flanke).
Beispiele für sequenzielle Logik:
- Flip-Flops
- 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 finden gleichzeitig unter Verwendung der alten Werte statt. Am Ende des Zeitschritts werden alle Aktualisierungen gemeinsam durchgeführt.
Nicht blockierend in Always-Blöcken (sequentielle Logik)
Die nicht blockierende Zuweisung wird für sequentielle Logik verwendet: Schaltungen, die einen Takt nutzen und über einen Speicher verfügen (Flip-Flops, Register, Zähler).
always @(posedge clk) begin
q <= d; // q erhält d an der Taktflanke
count <= count + 1; // count wird an der Taktflanke inkrementiert
endBeide Zuweisungen erfolgen gleichzeitig und verwenden die Werte von vor der Taktflanke.
Zusammenfassung
| Regel | Erklärung |
|---|---|
Verwende <= für sequenzielle Logik | always @(posedge clk) |
Verwende = für kombinatorische Logik | always @(*) |
| Nicht blockierende Zuweisungen werden parallel ausgeführt | All assignments happen at once |
| Werte werden am Ende des Zeitschritts aktualisiert | 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 Wert vond q2erhält den alten Wert vonq1
Das ist zu tun:
- Weise
dq1zu (nicht-blockierend) - Weise
q1q2zu (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: Shift-Logik hinzufügen
// Schritt 1: Weise d q1 zu (nicht-blockierend)
// Schritt 2: Weise q1 q2 zu (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. 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