Always-Block
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 46 von 90.
Ein prozeduraler Block ist ein Codeblock, in dem Anweisungen nacheinander in einer Sequenz ausgeführt werden — genau wie in Software-Programmiersprachen wie C oder Python. Verilog besitzt zwei prozedurale Blöcke: initial (führt einmal aus) und always (führt kontinuierlich aus). Beginnen wir mit dem always-Block.
Der always-Block läuft kontinuierlich — er wiederholt sich endlos, sobald die Simulation startet. Er wird verwendet, um Hardware zu beschreiben, die dauerhaft laufen muss, wie z. B. Flipflops, Zähler und kombinatorische Logik.
Grundlegende Syntax:
always @(sensitivity_list) begin
// Code, der wiederholt ausgeführt wird
endDie @(sensitivity_list) gibt dem Block an, wann er ausgeführt werden soll. Ohne sie (und ohne Verzögerung wie #5 darin) würde der Block endlos schleifen und die Simulation aufhängen.
Always-Block-Beispiel: Counter
Hier ist ein Beispiel dafür, wie wir den always-Block verwenden können, um einen Counter zu erstellen.
module counter (
input clk,
output reg [3:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleWie dieser Code funktioniert
| Teil | Bedeutung |
|---|---|
always | Führe diesen Code wiederholt und dauerhaft aus |
@(posedge clk) | Warte darauf, dass der Takt von 0 auf 1 wechselt (steigende Flanke) |
count <= count + 1 | Nimm den aktuellen Wert von count, addiere 1 und speichere ihn zurück |
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 an, nur bei Taktflanken ausgeführt zu werden, nicht kontinuierlich. Ohne dies würde die Schleife ohne Verzögerung ewig laufen.
Always Block mit mehreren Signalen
Sie können spezifische Signale auflisten:
always @(a or b) begin
out = a & b;
enda oder b sich ändert.Aufgabe
Füge den fehlenden always-Block hinzu, damit dieses Modul funktioniert.
So funktioniert es:
- Bei jeder steigenden Taktflanke wechselt (toggelt)
out1von 0 auf 1 oder von 1 auf 0 out2folgtout1(gleicher Wert wieout1)
Was zu tun ist:
- Füge einen
always @(posedge clk)-Block hinzu - Lass im Inneren
out1toggeln (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. 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