Instrukcja case
Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 55 z 90.
Instrukcja case pozwala wybrać spośród wielu różnych działań na podstawie wartości pojedynczego wyrażenia. Jest bardziej przejrzystą alternatywą dla wielu instrukcji if-else, gdy porównujesz tę samą zmienną z wieloma różnymi wartościami.
Instrukcja case porównuje wyrażenie z listą wartości i wykonuje pasujący blok. Działa jak rozgałęzienie wielokierunkowe.
Składnia:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseZdecydowanie zaleca się, aby zawsze umieszczać <strong>default</strong> w kombinacyjnym wyrażeniu <strong>case</strong>. Bez default, jeśli sel przyjmie nieoczekiwaną wartość (taką jak X lub Z), out nie zostanie przypisane i będzie zatrzaskiwać swoją poprzednią wartość. Powoduje to powstanie niezamierzonej pamięci (zatrzasku) zamiast czystej logiki kombinacyjnej.
Prosty przykład
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcaseJeśli sel ma wartość 00, out otrzymuje a. Jeśli sel ma wartość 01, out otrzymuje b. Jeśli sel ma wartość 10, out otrzymuje c.
W przeciwnym razie out otrzymuje 0.
Wiele instrukcji w jednym przypadku
Użyj begin i end dla wielu instrukcji:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseWażne zasady
| Zasada | Wyjaśnienie |
|---|---|
| Wartości przypadków powinny być unikalne | W przypadku duplikatów wykonuje się tylko pierwsza pasująca gałąź |
| Wartości muszą odpowiadać szerokości bitowej | 2'b01, a nie 1'b1 |
default jest opcjonalne, ale zalecane | Obsługuje nieprzypisane wartości |
Bez default nieprzypisane wartości powodują zatrzaski | W logice kombinacyjnej |
Case a If-Else
| Case | If-Else | |
|---|---|---|
| Najlepsze zastosowanie | Jedna zmienna, wiele wartości | Złożone warunki |
| Czytelność | Bardzo czytelne | Może stać się nieczytelne |
| Przykład | Multiplekser, dekoder | Komparator, sprawdzanie zakresów |
Wyzwanie
Uzupełnij instrukcję case
Co zrobić:
Dodaj brakującą instrukcję case, aby ten multiplekser działał.
Jak to działa:
- Gdy
select = 2'b00,result = in0 - Gdy
select = 2'b01,result = in1 - Gdy
select = 2'b10,result = in2 - Gdy
select = 2'b11,result = in3
Spróbuj swoich sił
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: Dodaj instrukcję case
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
end
endmoduleTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Wprowadzenie
Czym jest VerilogSprzęt a oprogramowanieTwój pierwszy modułKomentarzePoziomy abstrakcji projektu4Operatory, część 1
Operatory arytmetyczneOperator moduloOperatory porównaniaPowtórka — prosta matematykaOperatory bitowe7Przypisania i bramki
Przypisanie ciągłePrzypisanie z operatoramiWbudowane prymitywy bramekBramki AND, OR i NOTBramki XOR i XNORPodsumowanie — układ z bramek logicznych10Podejmowanie decyzji
Instrukcja ifIf-elsePowtórka – prosty komparatorInstrukcja caseCaseX i CaseZPowtórka – projektowanie ALU13Odmierzanie czasu i opóźnienia
Czym są opóźnieniaOpóźnienia bramekOpóźnienia przypisańDyrektywa timescaleGenerowanie zegaraPodsumowanie — kontrola czasu2Typy danych
Typ WireTyp RegLiczby całkowite i rzeczywisteWektoryTabliceParametryPowtórka — deklarowanie sygnałów5Operatory — część 2
Operatory logiczneOperatory redukcjiOperatory przesunięciaOperator konkatenacjiOperator warunkowyPowtórzenie — wyzwanie z operatorami11Pętle
Pętla forPętla whilePętla repeatPętla nieskończonaInstrukcja wyłączaniaPowtórka — wzorce pętli3System liczbowy
Reprezentacja binarnaLiczby o określonej szerokościLiczby o nieokreślonej szerokościLiczby ujemneWartości specjalne X i ZPodsumowanie — formaty liczb6Moduły
Struktura modułuPorty wejściowe i wyjściowePorty dwukierunkoweInstancjonowanie modułuMapowanie portów według nazwMapowanie portów według kolejnościPodsumowanie — zbuduj moduł9Bloki proceduralne
Blok alwaysBlok initialLista czułościPrzypisanie blokującePrzypisanie nieblokującePodsumowanie — always a initial12Projekt multipleksera
Projekt multipleksera 2 do 1Projekt multipleksera 4 do 115Sterownik sygnalizacji świetlnej
Definiowanie stanówLogika maszyny stanówPoćwicz samodzielnie: Kompilator Verilog online