Menu
Coddy logo textTech

Оператор 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

 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

Шпаргалка

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

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

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