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 eine nach der anderen und in einer bestimmten Reihenfolge ausgeführt werden, genau wie in Programmiersprachen wie C oder Python. Verilog verfügt über zwei prozedurale Blöcke: initial (wird einmal ausgeführt) und always (wird kontinuierlich ausgeführt). Beginnen wir mit dem always-Block.

Der always block runs kontinuierlich. Er wiederholt sich für immer, sobald die Simulation startet. Er wird verwendet, um Hardware zu beschreiben, die weiterlaufen muss, beispielsweise Flip-Flops, Zähler und kombinatorische Logik.

Grundlegende Syntax:

always @(sensitivity_list) begin
  // Code, der wiederholt ausgeführt wird
end

@(sensitivity_list) teilt dem Block mit, wann er ausgeführt werden soll. Ohne ihn (und ohne eine Verzögerung wie #5 darin) würde der Block endlos laufen und die Simulation aufhängen.

Beispiel für einen always-Block: Counter

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

So funktioniert dieser Code

TeilBedeutung
alwaysFühre diesen Code wiederholt und für immer aus
@(posedge clk)Warte, bis der Takt von 0 auf 1 wechselt (steigende Flanke)
count <= count + 1Nimm den aktuellen Wert von count, addiere 1 und speichere ihn wieder

Der block runs an jeder rising edge der clock. Jedes Mal erhöht sich count um 1.

Die Sensitivitätsliste @(posedge clk) weist es an, nur bei Taktflanken ausgeführt zu werden, nicht kontinuierlich. 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 changes.

challenge icon

Aufgabe

Add den fehlenden always block hinzu, damit dieses module funktioniert.

So funktioniert es:

  • Bei jeder rising clock edge toggelt out1 (wechselt) von 0 zu 1 oder von 1 zu 0
  • out2 follows out1 (derselbe Wert wie out1)

Was zu tun ist:

  1. Füge einen always @(posedge clk) block hinzu
  2. Lasse darin 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

Übe selbstständig: Online-Verilog-Compiler