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 und in einer bestimmten Reihenfolge ausgeführt werden, genau wie in Programmiersprachen wie C oder Python. Verilog verfügt über 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 kontinuierlich. Er wiederholt sich für immer, sobald die Simulation startet. Er wird verwendet, um Hardware zu beschreiben, die ständig laufen muss, beispielsweise Flip-Flops, Zähler und kombinatorische Logik.
Grundlegende Syntax:
always @(sensitivity_list) begin
// Code, der wiederholt ausgeführt wird
end@(sensitivity_list) teilt dem Block mit, wann er ausgeführt werden soll. Ohne ihn (und ohne eine Verzögerung wie #5 darin) würde der Block endlos laufen und die Simulation aufhängen.
Beispiel für einen Always-Block: Zähler
Hier ist 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 | Führe diesen Code wiederholt und für immer aus |
@(posedge clk) | Warte, bis der Takt von 0 auf 1 wechselt (steigende Flanke) |
count <= count + 1 | Nimm den aktuellen Wert von count, addiere 1 und speichere ihn wieder |
Der Block wird bei jeder steigenden Flanke des Takts ausgeführt. Jedes Mal erhöht sich count um 1.
Die Sensitivitätsliste @(posedge clk) weist es an, nur bei Taktflanken ausgeführt zu werden, nicht kontinuierlich. 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(springt) von 0 auf 1 oder von 1 auf 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: Always-Block mit posedge clk hinzufügen
// out1 toggelt bei jedem Takt
// 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