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;
endcaseEs 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;
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 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;
endcaseWichtige Regeln
| Regel | Erklärung |
|---|---|
| Case-Werte sollten eindeutig sein | Bei Duplikaten wird nur der erste übereinstimmende Zweig ausgeführt |
| Werte müssen mit der Bitbreite übereinstimmen | 2'b01 nicht 1'b1 |
default ist optional, wird aber empfohlen | Fängt nicht zugewiesene Werte ab |
Ohne default verursachen nicht zugewiesene Werte Latches | In kombinatorischer Logik |
Case vs If-Else
| Case | If-Else | |
|---|---|---|
| Am besten für | Eine Variable, viele Werte | Komplexe Bedingungen |
| Lesbarkeit | Sehr übersichtlich | Kann unübersichtlich werden |
| Beispiel | Multiplexer, Dekodierer | Komparator, Bereichsprüfungen |
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
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