Оператор case
Часть раздела Основы путешествия по Verilog на Coddy. Урок 55 из 90.
Оператор case позволяет выбирать между множеством различных действий в зависимости от значения одного выражения. Это более простой вариант, чем несколько операторов if-else, когда нужно сравнить одну и ту же переменную со множеством различных значений.
Оператор case сравнивает выражение со списком значений и выполняет соответствующий блок. Он похож на ветвление по нескольким вариантам.
Синтаксис:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseНастоятельно рекомендуется всегда включать default в оператор case для комбинационной логики. Без default, если sel принимает значение, которое не указано ни в одном элементе case, out не присваивается новое значение и сохраняет предыдущее. Если для значения sel, состоящего только из битов 0 и 1, нет ветви, синтезатор создаёт непредусмотренную память (защёлку) вместо чисто комбинационной логики. Значение X или Z на sel также оставляет out без изменений при симуляции, но не создаёт защёлку.
Простой пример
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.
Несколько инструкций в одном варианте
Используй begin и end для нескольких инструкций:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseВажные правила
| Правило | Пояснение |
|---|---|
| Значения вариантов должны быть уникальными | При дубликатах выполняется только первая совпавшая ветвь |
| Разрядность значений должна совпадать | Пишите 2'b01, а не 1'b1 (более короткое значение дополняется нулями) |
default необязателен, но рекомендуется | Обрабатывает значения, для которых не задано соответствие |
Без default значения, для которых не задано соответствие, приводят к защёлкам | В комбинационной логике |
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
Попробуйте сами
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Введение
Что такое VerilogАппаратное и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Операторы. Часть 1
Арифметические операторыОператор взятия остаткаОператоры сравненияПовторение — простая математикаПобитовые операторы7Присваивание и логические элементы
Непрерывное присваиваниеПрисваивание с операторамиВстроенные примитивы логических элементовЭлементы И, ИЛИ и НЕЭлементы XOR и XNORПовторение — схема на логических элементах10Принятие решений
Оператор ifif—elseПовторение — простой компараторОператор casecaseх и casezПовторение — проектирование ALU5Операторы, часть 2
Логические операторыОператоры свёрткиОператоры сдвигаОператор конкатенацииУсловный операторПовторение — задание на операторы11Циклы
Цикл forЦикл whileЦикл повторенияБесконечный циклОператор отключенияПовторение — шаблоны циклов3Система счисления
Двоичное представлениеЧисла заданной разрядностиЧисла без указания разрядностиОтрицательные числаСпециальные значения X и ZПовторение — форматы чисел6Модули
Структура модуляВходные и выходные портыДвунаправленные портыСоздание экземпляра модуляПодключение портов по имениПодключение портов по порядкуПовторение — создание модуля9Процедурные блоки
Блок AlwaysБлок InitialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеПовторение: Always и InitialПотренируйтесь самостоятельно: Онлайн-компилятор Verilog