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 не получит значения и защёлкнет своё предыдущее значение. Это создаёт непреднамеренную память (защёлку) вместо чистой комбинационной логики.

Простой пример

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

Попробуйте сами

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Проверьте себя

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

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