Case Statement
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 Designs4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicÜbe selbstständig: Online-Verilog-Compiler