Case Statement
Часть раздела Основы путешествия по Verilog на Coddy. Урок 55 из 90.
Инструкция case позволяет выбирать между множеством различных действий в зависимости от значения одного выражения. Это более понятная альтернатива нескольким инструкциям if-else, когда одна и та же переменная сравнивается с множеством различных значений.
Оператор case сравнивает expression со списком значений и выполняет соответствующий блок. Он подобен многовариантному ветвлению.
Синтаксис:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseНастоятельно рекомендуется всегда включать <strong>default</strong> в комбинационный <strong>case</strong> statement. Без 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.
Несколько операторов для одного варианта
Используйте 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 несопоставленные значения приводят к защёлкам | В комбинационной логике |
Case vs 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Аппаратное обеспечение и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Operators 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Потренируйтесь самостоятельно: Онлайн-компилятор Verilog