Условный оператор
Часть раздела Основы путешествия по 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)
Задание
Напишите правильные условные выражения для каждой задачи.
Что нужно сделать:
- Установите
maxравным большему изxиy - Установите
absравным абсолютному значениюval(если отрицательное, сделайте положительным) - Установите
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial