Menu
Coddy logo textTech

Case-Anweisung

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 55 von 90.

Die case-Anweisung ermöglicht es Ihnen, basierend auf dem Wert eines einzelnen Ausdrucks zwischen vielen verschiedenen Aktionen zu wählen. Sie ist eine übersichtlichere Alternative zu mehreren if-else-Anweisungen, wenn dieselbe Variable mit vielen verschiedenen Werten verglichen wird.

Die case-Anweisung vergleicht einen Ausdruck mit einer Liste von Werten und führt den entsprechenden Block aus. Sie verhält sich wie eine Mehrfachverzweigung.

Syntax:

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

Es wird dringend empfohlen, immer <strong>default</strong> in einer kombinatorischen <strong>case</strong>-Anweisung anzugeben. Ohne default wird out nicht zugewiesen und speichert seinen vorherigen Wert (Latch-Bildung), falls sel einen unerwarteten Wert (wie X oder Z) annimmt. Dies erzeugt einen unbeabsichtigten Speicher (einen Latch) anstelle von rein kombinatorischer Logik.

Einfaches Beispiel

case (sel)
  2'b00: out = a;
  2'b01: out = b;
  2'b10: out = c;
  default: out = 0;
endcase

Wenn sel 00 ist, erhält out a. Wenn sel 01 ist, erhält out b. Wenn sel 10 ist, erhält out c.

Andernfalls erhält out 0.

Mehrere Anweisungen pro Case

Verwenden Sie begin und end für mehrere Anweisungen:

case (state)
  2'b00: begin
    out = a;
    flag = 1;
  end
  2'b01: begin
    out = b;
    flag = 0;
  end
  default: out = 0;
endcase

Wichtige Regeln

RegelErklärung
Alle Case-Werte müssen eindeutig seinKeine doppelten Werte
Werte müssen der Bitbreite entsprechen2'b01 nicht 1'b1
default ist optional, wird aber empfohlenErfasst nicht zugewiesene Werte
Ohne default verursachen nicht zugewiesene Werte LatchesIn kombinatorischer Logik

Case vs. If-Else

 CaseIf-Else
Ideal fürEine Variable, viele WerteKomplexe Bedingungen
LesbarkeitSehr übersichtlichKann unübersichtlich werden
BeispielMultiplexer, DecoderComparator, Bereichsprüfungen
challenge icon

Aufgabe

Vervollständigen Sie das Case-Statement

Was zu tun ist:

Fügen Sie das fehlende case-Statement hinzu, damit dieser Multiplexer funktioniert.

Wie es funktioniert:

  • Wenn select = 2'b00, dann result = in0
  • Wenn select = 2'b01, dann result = in1
  • Wenn select = 2'b10, dann result = in2
  • Wenn select = 2'b11, dann result = in3

Spickzettel

Die case-Anweisung wählt basierend auf einem einzelnen Ausdruck zwischen mehreren Aktionen aus – eine übersichtlichere Alternative zu verketteten if-else-Anweisungen.

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

Verwenden Sie für mehrere Anweisungen pro Zweig begin/end:

case (sel)
  2'b00: out = a;
  2'b01: begin
    out = b;
    flag = 1;
  end
  default: out = 0;
endcase

Fügen Sie in der Kombinatorik immer default hinzu. Ohne diesen führen nicht übereinstimmende Werte (z. B. X, Z) dazu, dass der Ausgang seinen vorherigen Wert beibehält, was einen unbeabsichtigten Latch erzeugt.

Wichtige Regeln:

  • Alle Case-Werte müssen eindeutig sein
  • Werte müssen der Bitbreite des Ausdrucks entsprechen (z. B. 2'b01, nicht 1'b1)
  • Verwenden Sie case für eine Variable gegenüber vielen Werten; verwenden Sie if-else für komplexe Bedingungen oder Bereichsabfragen

Probier es selbst

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: Case-Anweisung hinzufügen
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // default -> result = 0
  end
  
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