Assign с операторами
Часть раздела Основы путешествия по Verilog на Coddy — урок 38 из 90.
Как только вы разберетесь с непрерывным присваиванием, вы сможете комбинировать его с операторами для создания полезной логики. Инструкция assign может использовать любой оператор для управления сигналом (wire).
Базовый синтаксис
assign wire_name = expression;Выражение может включать:
- Арифметические операторы (
+,-,*,/) - Побитовые операторы (
&,|,^,~) - Логические операторы (
&&,||,!)
- Операторы сравнения (
>,<,==,!=) - Операторы сдвига (
<<,>>) - Условный оператор (
? :)
Примеры с различными операторами
Побитовое И (AND):
assign out = a & b;Сложение:
assign sum = a + b;Сравнение:
assign is_greater = (a > b);Условный оператор (мультиплексор):
assign out = sel ? a : b;Сдвиг:
assign shifted = data << 2;Конкатенация:
assign bus = {high_byte, low_byte};Пример кода
module assign_operators (
input [3:0] a, b,
input sel,
output [3:0] and_out,
output [4:0] sum_out,
output is_equal,
output mux_out
);
assign and_out = a & b; // Побитовое И
assign sum_out = a + b; // Сложение
assign is_equal = (a == b); // Сравнение
assign mux_out = sel ? a : b; // Условный оператор (мультиплексор)
endmoduleНесколько операторов в одном присваивании
Вы можете комбинировать операторы в одном выражении:
assign result = (a & b) | (c ^ d);
assign final = (a + b) > (c - d);
assign parity = ^data; // Редукционное XOR (нечетное количество единиц)Приоритет операторов
Verilog следует стандартному приоритету операторов. Используйте скобки ( ), чтобы сделать ваше намерение понятным:
// Неясно
assign out = a & b | c;
// Ясно
assign out = (a & b) | c;Задание
Добавьте недостающие инструкции assign на основе заданий.
Что нужно сделать:
- Сделайте
and_resultравнымinput_a AND input_b(побитовое) - Сделайте
or_resultравнымinput_a OR input_b(побитовое) - Сделайте
xor_resultравнымinput_a XOR input_b(побитовое) - Сделайте
not_resultравнымNOT input_a(побитовое)
Шпаргалка
Оператор assign поддерживает различные операторы для комбинационной логики:
assign wire_name = expression;Типы операторов:
- Побитовые:
&,|,^,~ - Арифметические:
+,-,*,/ - Логические:
&&,||,! - Сравнения:
>,<,==,!= - Сдвига:
<<,>> - Условные:
? : - Конкатенации:
{ }
assign and_out = a & b; // Побитовое И (AND)
assign sum_out = a + b; // Сложение
assign is_equal = (a == b); // Сравнение
assign mux_out = sel ? a : b; // Мультиплексор
assign bus = {high, low}; // Конкатенация
assign parity = ^data; // Редукция XORИспользуйте скобки для уточнения приоритета:
assign out = (a & b) | c;Попробуйте сами
module assign_challenge (
input input_a,
input input_b,
output and_result,
output or_result,
output xor_result,
output not_result
);
// TODO: Добавьте операторы назначения (assign) для:
// and_result = input_a & input_b
// or_result = input_a | input_b
// xor_result = input_a ^ input_b
// not_result = ~input_a
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