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 sauberere 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 passenden Block aus. Sie funktioniert 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 einzuschließen. Ohne default wird out, wenn sel einen unerwarteten Wert annimmt (wie X oder Z), nicht zugewiesen und behält (über einen Latch) seinen vorherigen Wert bei. Dies erzeugt unbeabsichtigten Speicher (einen Latch) anstelle von reiner 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 den Wert 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
Case-Werte sollten eindeutig seinBei Duplikaten wird nur der erste übereinstimmende Zweig ausgeführt
Werte müssen mit der Bitbreite übereinstimmen2'b01 nicht 1'b1
default ist optional, wird aber empfohlenFängt nicht zugewiesene Werte ab
Ohne default verursachen nicht zugewiesene Werte LatchesIn kombinatorischer Logik

Case vs If-Else

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

Aufgabe

Vervollständige die Case-Anweisung

Was zu tun ist:

Füge die fehlende case-Anweisung hinzu, damit dieser Multiplexer funktioniert.

So funktioniert es:

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

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