Case-Anweisung
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 55 von 90.
Mit der case-Anweisung kannst du anhand des Werts eines einzelnen Ausdrucks zwischen vielen verschiedenen Aktionen 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 expression mit einer Liste von Werten und führt den passenden Block aus. Sie ist wie eine Mehrwegeverzweigung.
Syntax:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseEs wird dringend empfohlen, in einer kombinatorischen <strong>case</strong>-Anweisung immer <strong>default</strong> einzuschließen. Ohne default wird out nicht zugewiesen, wenn sel einen unerwarteten Wert annimmt (wie X oder Z), und behält seinen vorherigen Wert durch ein Latch bei. Dadurch entsteht unbeabsichtigter Speicher (ein Latch) anstelle einer rein kombinatorischen 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 den Wert a. Wenn sel 01 ist, erhält out den Wert b. Wenn sel 10 ist, erhält out den Wert 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 müssen zur Bitbreite passen | 2'b01 nicht 1'b1 |
default ist optional, wird aber empfohlen | Fängt nicht zugeordnete Werte ab |
Ohne default verursachen nicht zugeordnete Werte 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
case-Anweisung vervollständigen
Aufgabe:
Add 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