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, 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
end

Die @(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;
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 geht (steigende Flanke)
count = count + 1Nimm 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;
end

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

challenge icon

Aufgabe

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

Wie es funktioniert:

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

Was zu tun ist:

  1. Fügen Sie einen always @(posedge clk)-Block hinzu
  2. Lassen Sie im Inneren out1 toggeln (verwenden Sie out1 = ~out1)
  3. Setzen Sie out2 gleich out1

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;
end

Hinweis: 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

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