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;
endcaseEs 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;
endcaseWenn 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;
endcaseWichtige Regeln
| Regel | Erklärung |
|---|---|
| Case-Werte sollten eindeutig sein | Bei Duplikaten wird nur der erste passende Zweig ausgeführt |
| Werte sollten zur Bitbreite passen | Schreibe 2'b01, nicht 1'b1 (ein kürzerer Wert wird mit Nullen aufgefüllt) |
default ist optional, aber empfohlen | Fängt nicht zugeordnete Werte ab |
Ohne default führen nicht zugeordnete Werte zu Latches | In kombinatorischer Logik |
Case vs. If-Else
| Case | If-Else | |
|---|---|---|
| Am besten geeignet für | Eine Variable, viele Werte | Komplexe Bedingungen |
| Lesbarkeit | Sehr übersichtlich | Kann unübersichtlich werden |
| Beispiel | Multiplexer, Decoder | Komparator, Bereichsprüfungen |
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
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. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellenÜbe selbstständig: Online-Verilog-Compiler