Оператор case
Часть раздела Основы путешествия по Verilog на Coddy — урок 55 из 90.
Оператор case позволяет выбирать между множеством различных действий на основе значения одного выражения. Это более чистая альтернатива множественным операторам if-else при сравнении одной и той же переменной с множеством различных значений.
Оператор case сравнивает выражение со списком значений и выполняет соответствующий блок. Это похоже на многопутевое ветвление.
Синтаксис:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseНастоятельно рекомендуется всегда включать <strong>default</strong> в комбинационный оператор <strong>case</strong>. Без default, если sel принимает непредвиденное значение (например, X или Z), out не получит значения и защелкнет (latch) свое предыдущее значение. Это создает непреднамеренную память (защелку) вместо чистой комбинационной логики.
Простой пример
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcaseЕсли sel равен 00, out получает a. Если sel равен 01, out получает b. Если sel равен 10, out получает c.
В противном случае out получает 0.
Несколько операторов в одном варианте case
Используйте begin и end для нескольких операторов:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseВажные правила
| Правило | Объяснение |
|---|---|
| Все значения case должны быть уникальными | Без дублирующихся значений |
| Значения должны соответствовать разрядности | 2'b01, а не 1'b1 |
default необязателен, но рекомендуется | Перехватывает несопоставленные значения |
Без default несопоставленные значения вызывают защелки (latches) | В комбинационной логике |
Case против If-Else
| Case | If-Else | |
|---|---|---|
| Лучше всего подходит для | Одной переменной со многими значениями | Сложных условий |
| Читаемость | Очень понятная | Может стать запутанной |
| Пример | Мультиплексор, декодер | Компаратор, проверка диапазонов |
Задание
Завершите оператор Case
Что нужно сделать:
Добавьте недостающий оператор case, чтобы этот мультиплексор заработал.
Как это работает:
- Когда
select = 2'b00,result = in0 - Когда
select = 2'b01,result = in1 - Когда
select = 2'b10,result = in2 - Когда
select = 2'b11,result = in3
Шпаргалка
Оператор case выбирает между несколькими действиями на основе одного выражения — это более чистая альтернатива цепочке if-else.
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseДля нескольких операторов в одной ветке используйте begin/end:
case (sel)
2'b00: out = a;
2'b01: begin
out = b;
flag = 1;
end
default: out = 0;
endcaseВсегда включайте default в комбинационную логику. Без него несовпадающие значения (например, X, Z) заставляют выход сохранять свое предыдущее значение, создавая непреднамеренную защелку (latch).
Ключевые правила:
- Все значения case должны быть уникальными
- Значения должны соответствовать разрядности выражения (например,
2'b01, а не1'b1) - Используйте
caseдля сравнения одной переменной со многими значениями; используйтеif-elseдля сложных условий или диапазонов
Попробуйте сами
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: Добавить оператор case
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial