Menu
Coddy logo textTech

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

 CaseIf-Else
Лучше всего подходит дляОдной переменной, множества значенийСложных условий
ЧитаемостьОчень понятныйМожет стать запутанным
ПримерМультиплексор, декодерКомпаратор, проверка диапазонов
challenge icon

Задание

Завершите оператор 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog