Menu
CoddyTech

Case-Anweisung

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

Die case-Anweisung ermöglicht es dir, abhängig vom 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 passenden Block aus. Sie ähnelt einer Mehrfachverzweigung.

Syntax:

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

Es wird dringend empfohlen, in einer kombinatorischen case-Anweisung immer default anzugeben. Ohne default wird out nicht zugewiesen und behält seinen vorherigen Wert, wenn sel einen Wert annimmt, der in keinem case-Element aufgeführt ist. Wenn ein Wert von sel, der nur aus 0- und 1-Bits besteht, keinem Zweig zugeordnet ist, erzeugt die Synthese unbeabsichtigt einen Speicher (ein Latch) statt rein kombinatorischer Logik. Ein X oder Z an sel lässt out in der Simulation ebenfalls unverändert, erzeugt aber kein Latch.

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 den Wert von a. Wenn sel 01 ist, erhält out den Wert von b. Wenn sel 10 ist, erhält out den Wert von c.

Andernfalls erhält out den Wert 0.

Mehrere Anweisungen pro Fall

Verwende 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 passende Zweig ausgeführt
Werte sollten zur Bitbreite passenSchreibe 2'b01, nicht 1'b1 (ein kürzerer Wert wird mit Nullen aufgefüllt)
default ist optional, aber empfohlenFängt nicht zugeordnete Werte ab
Ohne default führen nicht zugeordnete Werte zu LatchesIn kombinatorischer Logik

Case vs. If-Else

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

Aufgabe

Vervollständige die case-Anweisung

Aufgabe:

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

Übe selbstständig: Online-Verilog-Compiler