Menu
Coddy logo textTech

Условный оператор

Часть раздела Основы путешествия по Verilog на Coddy — урок 28 из 90.

Условный оператор ? : выбирает между двумя значениями на основе условия. Его также называют тернарным оператором. Условный оператор вычисляет условие и возвращает одно из двух значений:

condition ? value_if_true : value_if_false

Если условие истинно (1), возвращается первое значение. Если ложно (0), возвращается второе значение.

Зачем использовать условный оператор

Это компактный способ записи простой логики if-else в одну строку. Распространенные варианты использования включают:

  • Выбор между двумя сигналами
  • Создание мультиплексоров
  • Установка значений по умолчанию
  • Встроенные условные присваивания

Синтаксис и примеры

Базовый пример:

result = (a > b) ? a : b;   // result получает большее из a и b

Выбор между значениями:

data_out = (enable) ? data_in : 8'b00000000;   // Вывод данных, если включено, иначе 0

Инвертировать сигнал по условию:

out = (invert) ? ~in : in;   // Если invert равен 1, выход инвертирован; иначе без изменений

Пример кода

module conditional_demo;
  reg [3:0] a, b, max;
  reg enable;
  reg [3:0] data_in, data_out;
  
  initial begin
    a = 4'd7;
    b = 4'd9;
    enable = 1;
    data_in = 4'b1010;
    
    max = (a > b) ? a : b;           // 9
    data_out = (enable) ? data_in : 4'b0000;   // 1010
    
    $display("max = %d", max);
    $display("data_out = %b", data_out);
    $finish;
  end
endmodule

Вывод:

max = 9
data_out = 1010

Вложенные условные операторы

Вы можете вкладывать условные операторы для выбора из нескольких вариантов:

result = (a > b) ? a : (b > c) ? b : c;   // Найти наибольшее из трех значений

Используйте круглые скобки, чтобы сделать вложенные условия понятными.

Важные примечания

  • Условие должно быть однобитным (или выражением, которое вычисляется как 0 или 1)
  • Оба варианта значения должны иметь одинаковую разрядность
  • Оператор может использоваться в непрерывных назначениях (assign) и процедурных блоках (always, initial)
challenge icon

Задание

Напишите правильные условные выражения для каждой задачи.

Что нужно сделать:

  1. Установите max равным большему из x и y
  2. Установите abs равным абсолютному значению val (если отрицательное, сделайте положительным)
  3. Установите output_data равным data , если enable равно 1, в противном случае — 8'b0

Шпаргалка

Условный (тернарный) оператор ? : выбирает между двумя значениями на основе условия:

condition ? value_if_true : value_if_false

Примеры:

max      = (a > b) ? a : b;                  // большее из a и b
data_out = (enable) ? data_in : 8'b0;        // вывод данных, если включено, иначе 0
out      = (invert) ? ~in : in;              // условная инверсия сигнала

Вложенные условные операторы:

result = (a > b) ? a : (b > c) ? b : c;     // наибольшее из трех значений

Примечания:

  • Условие должно принимать значение 0 или 1
  • Оба варианта значения должны иметь одинаковую разрядность
  • Можно использовать в блоках assign, always и initial

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

module conditional_challenge;
  reg [3:0] x, y;
  reg [3:0] max;
  reg signed [3:0] val;
  reg [3:0] abs;
  reg enable;
  reg [7:0] data;
  reg [7:0] output_data;
  
  initial begin
    x = 4'd12;
    y = 4'd8;
    val = -4'sd5;
    enable = 1;
    data = 8'b10101010;
    
    max = ______;          // большее из x и y
    abs = ______;          // абсолютное значение val
    output_data = ______;  // data, если enable, иначе 0
    
    $display("max = %d", max);
    $display("abs = %d", abs);
    $display("output_data = %b", output_data);
    $finish;
  end
endmodule
quiz iconПроверьте себя

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

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