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, also sequenziell, ausgeführt werden – genau wie in Software-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 kontinuierlich — er wiederholt sich ewig, sobald die Simulation startet. Er wird verwendet, um Hardware zu beschreiben, die ständig laufen muss, wie Flipflops, Zähler und Kombinationslogik.
Grundlegende Syntax:
always @(sensitivity_list) begin
// Code, der wiederholt ausgeführt wird
endDie @(sensitivity_list) teilt dem Block mit, wann er ausgeführt werden soll. Ohne sie würde der Block in einer Endlosschleife laufen und die Simulation aufhängen.
Always-Block-Beispiel: 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;
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 geht (steigende Flanke) |
count = count + 1 | Nimm den aktuellen Wert von count, addiere 1 und speichere ihn wieder ab |
Der Block wird bei jeder steigenden Flanke des Takts ausgeführt. Jedes Mal erhöht sich count um 1.
Die Sensitivity-Liste @(posedge clk) weist es 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;
endDies wird ausgeführt, wenn sich a oder b ändert.
Aufgabe
Fügen Sie den fehlenden always-Block hinzu, damit dieses Modul funktioniert.
Wie es funktioniert:
- Bei jeder steigenden Taktflanke wechselt (toggled)
out1von 0 auf 1 oder von 1 auf 0 out2folgtout1(gleicher Wert wieout1)
Was zu tun ist:
- Fügen Sie einen
always @(posedge clk)-Block hinzu - Lassen Sie im Inneren
out1toggeln (verwenden Sieout1 = ~out1) - Setzen Sie
out2gleichout1
Spickzettel
Der always-Block läuft kontinuierlich und wird verwendet, um Hardware wie Flip-Flops und Zähler zu beschreiben.
always @(sensitivity_list) begin
// Code, der wiederholt ausgeführt wird
end@(posedge clk) löst bei der steigenden Taktflanke aus; @(a or b) löst aus, wenn sich eines der aufgeführten Signale ändert.
// Zähler: erhöht sich bei jeder steigenden Taktflanke
always @(posedge clk) count = count + 1;
// Kombinatorisch: läuft, wenn sich a oder b ändert
always @(a or b) begin
out = a & b;
endHinweis: Ausgänge, die von always-Blöcken gesteuert werden, müssen als reg deklariert werden.
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 schaltet bei jedem Takt um
// 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