Menu
CoddyTech

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
end

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

So funktioniert dieser Code

TeilBedeutung
alwaysDiesen Code wiederholt und unbegrenzt ausführen
@(posedge clk)Warten, bis die Uhr von 0 auf 1 wechselt (steigende Flanke)
count <= count + 1Den 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;
end

Dies wird ausgeführt, wenn sich a oder b ändert.

challenge icon

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.
  • out2 folgt out1 (hat denselben Wert wie out1).

Was zu tun ist:

  1. Füge einen always @(posedge clk)-Block hinzu.
  2. Lass darin out1 wechseln (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: Füge einen always-Block mit posedge clk hinzu
  // out1 wechselt bei jedem Takt seinen Zustand
  // 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

Übe selbstständig: Online-Verilog-Compiler