Always-Block
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 46 von 90.
Ein prozeduraler Block ist ein Codeblock, in dem Anweisungen eine nach der anderen der Reihe nach ausgeführt werden, genau wie in Programmiersprachen wie C oder Python. Verilog hat zwei prozedurale Blöcke: initial (wird einmal ausgeführt) und always (wird kontinuierlich ausgeführt). Beginnen wir mit dem always-Block.
Der always-Block läuft ständig. Sobald die Simulation startet, wiederholt er sich für immer. Er wird verwendet, um Hardware zu beschreiben, die ständig laufen muss, wie Flipflops, Zähler und kombinatorische Logik.
Grundlegende Syntax:
always @(sensitivity_list) begin
// Code, der wiederholt ausgeführt wird
endDie @(sensitivity_list) legt fest, wann der Block ausgeführt wird. Ohne sie (und ohne eine Verzögerung wie #5 darin) würde der Block in einer Endlosschleife laufen und die Simulation zum Stillstand bringen.
Beispiel für einen Always-Block: Zähler
Hier siehst du ein Beispiel dafür, wie wir den always-Block verwenden können, um einen Zähler zu erstellen.
module counter (
input clk,
output reg [3:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleSo funktioniert dieser Code
| Teil | Bedeutung |
|---|---|
always | Diesen Code wiederholt und unbegrenzt ausführen |
@(posedge clk) | Warten, bis die Uhr von 0 auf 1 wechselt (steigende Flanke) |
count <= count + 1 | Den aktuellen Wert von count nehmen, 1 addieren und wieder speichern |
Der Block wird bei jeder steigenden Taktflanke ausgeführt. Jedes Mal erhöht sich count um 1.
Die Empfindlichkeitsliste @(posedge clk) weist es an, nur bei Taktflanken und nicht kontinuierlich ausgeführt zu werden. Ohne diese würde die Schleife ohne Verzögerung für immer laufen.
Always-Block mit mehreren Signalen
Du kannst bestimmte Signale auflisten:
always @(a or b) begin
out = a & b;
endDies wird ausgeführt, wenn sich a oder b ändert.
Aufgabe
Füge den fehlenden always-Block hinzu, damit dieses Modul funktioniert.
So funktioniert es:
- Bei jeder steigenden Taktflanke wechselt
out1(kippt) von 0 zu 1 oder von 1 zu 0. out2folgtout1(hat denselben Wert wieout1).
Was zu tun ist:
- Füge einen
always @(posedge clk)-Block hinzu. - Lass darin
out1wechseln (verwendeout1 = ~out1). - Setze
out2gleichout1.
Probier es selbst
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: Füge einen always-Block mit posedge clk hinzu
// out1 wechselt bei jedem Takt seinen Zustand
// out2 folgt out1
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