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;
endcaseEs 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;
endcaseWenn 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;
endcaseWichtige Regeln
| Regel | Erklärung |
|---|---|
| Alle Case-Werte müssen eindeutig sein | Keine doppelten Werte |
| Werte müssen der Bitbreite entsprechen | 2'b01 nicht 1'b1 |
default ist optional, wird aber empfohlen | Erfasst nicht zugewiesene Werte |
Ohne default verursachen nicht zugewiesene Werte Latches | In kombinatorischer Logik |
Case vs. If-Else
| Case | If-Else | |
|---|---|---|
| Ideal für | Eine Variable, viele Werte | Komplexe Bedingungen |
| Lesbarkeit | Sehr übersichtlich | Kann unübersichtlich werden |
| Beispiel | Multiplexer, Decoder | Comparator, Bereichsprüfungen |
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, dannresult = in0 - Wenn
select = 2'b01, dannresult = in1 - Wenn
select = 2'b10, dannresult = in2 - Wenn
select = 2'b11, dannresult = 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;
endcaseVerwenden 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;
endcaseFü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, nicht1'b1) - Verwenden Sie
casefür eine Variable gegenüber vielen Werten; verwenden Sieif-elsefü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
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen