Zuweisungsverzögerungen
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 69 von 90.
In den vorherigen Lektionen haben wir allgemeine Verzögerungen (#10 a = b;) und Verzögerungen an Gattern (and #5 (out, a, b);) behandelt. Jetzt behandeln wir Zuweisungsverzögerungen. Dabei handelt es sich um Verzögerungen, die innerhalb eines prozeduralen Blocks (wie initial oder always) als Teil einer Zuweisungsanweisung auftreten.
Eine Zuweisungsverzögerung wartet eine festgelegte Zeit und führt dann die Zuweisung aus. Die Verzögerung wird nach dem Symbol # und vor der Zuweisung platziert.
Syntax:
variable = #delay expression;Im Gegensatz zu einer allgemeinen Verzögerung #10 a = b; (verzögern, dann zuweisen) übernimmt eine Zuweisungsverzögerung a = #10 b; den Wert von b in diesem Moment, wartet 10 Zeiteinheiten und weist ihn dann a zu.
Allgemeine Verzögerung vs. Zuweisungsverzögerung
| Allgemeine Verzögerung | Zuweisungsverzögerung | |
|---|---|---|
| Syntax | #10 a = b; | a = #10 b; |
| Wann wird der Wert gelesen? | Zum Zeitpunkt der Zuweisung (nach der Verzögerung) | Sofort (vor der Verzögerung) |
| Welcher Wert wird zugewiesen? | Der Wert von b zu diesem Zeitpunkt | Der Wert von b zum Zeitpunkt 0 (oder zum Lesezeitpunkt) |
| Wann wird der Wert zugewiesen? | Nach der Verzögerung | Nach der Verzögerung |
Beispiel: Der Unterschied
initial begin
b = 1;
#5 b = 0;
// Allgemeine Verzögerung
#10 a1 = b; // Wartet 10, liest dann b (b=0) → a1=0
// Zuweisungsverzögerung
a2 = #10 b; // Liest b jetzt (b=0), wartet 10 und weist dann zu → a2=0
endBeide liefern hier dasselbe Ergebnis. Der Unterschied zeigt sich, wenn sich b während der Verzögerung ändert.
Beispiel für den entscheidenden Unterschied
To show b changing during the delay, we need two separate initial blocks that run in parallel:
initial begin
b = 1;
a1 = #10 b; // Liest b=1 zum Zeitpunkt 0, weist a1=1 zum Zeitpunkt 10 zu
end
initial begin
#5 b = 0; // Ändert b zum Zeitpunkt 5 auf 0 (während der Verzögerung)
end- Zum Zeitpunkt 0:
a1liestb = 1 - Zum Zeitpunkt 5:
bändert sich zu0(währenda1noch wartet) - Zum Zeitpunkt 10:
a1wird1zugewiesen (der zum Zeitpunkt 0 gelesene Wert), nicht0
Bei einer allgemeinen Verzögerung #10 a2 = b; in einem separaten Block würde b zum Zeitpunkt 10 gelesen (Wert 0).
Wichtige Regeln
| Regel | Erklärung |
|---|---|
= steht vor # | a = #10 b;, nicht a #10 = b; |
| Der Wert wird sofort gelesen | Die rechte Seite wird sofort ausgewertet |
| Die Zuweisung erfolgt nach einer Verzögerung | Die linke Seite erhält den Wert später |
| Nur für prozedurale Blöcke | Verwendet in initial oder always |
Aufgabe
Was zu tun ist:
Füge die fehlende Zuweisungsverzögerung hinzu, damit a nach 15 Zeiteinheiten den Wert von b erhält, b aber sofort gelesen wird.
Probier es selbst
module assignment_challenge;
reg a, b;
// Separater Block, um b während der Verzögerung zu ändern
initial begin
b = 1;
// TODO: Zuweisungsverzögerung hinzufügen
// a soll b nach 15 Zeiteinheiten erhalten
// b jetzt lesen, nach der Verzögerung zuweisen
end
initial begin
#5 b = 0; // Ändert b während der Verzögerung
#20 $display("Time %0t: a = %b", $time, a);
$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 erstellenÜbe selbstständig: Online-Verilog-Compiler