Menu
Coddy logo textTech

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
end

Die @(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;
endmodule

Wie dieser Code funktioniert

TeilBedeutung
alwaysFühre diesen Code wiederholt und dauerhaft aus
@(posedge clk)Warte darauf, dass der Takt von 0 auf 1 wechselt (steigende Flanke)
count <= count + 1Nimm 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;
end
Dies wird ausgeführt, wenn a oder b sich ändert.
challenge icon

Aufgabe

Füge den fehlenden always-Block hinzu, damit dieses Modul funktioniert.

So funktioniert es:

  • Bei jeder steigenden Taktflanke wechselt (toggelt) out1 von 0 auf 1 oder von 1 auf 0
  • out2 folgt out1 (gleicher Wert wie out1)

Was zu tun ist:

  1. Füge einen always @(posedge clk)-Block hinzu
  2. Lass im Inneren out1 toggeln (verwende out1 = ~out1)
  3. Setze out2 gleich out1

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

endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen