Операторы редукции
Часть раздела Основы путешествия по Verilog на Coddy — урок 25 из 90.
Операторы редукции работают со всеми битами одного вектора и сводят их к однобитовому результату. В отличие от побитовых операторов, которые сравнивают два числа побитово, операторы редукции принимают одно число и выполняют операцию над всеми его битами для получения одного результата.
| Оператор | Операция | Результат |
|---|---|---|
& | Редукционное И (AND) | 1, если все биты равны 1 |
| | Редукционное ИЛИ (OR) | 1, если хотя бы один бит равен 1 |
^ | Редукционное исключающее ИЛИ (XOR) | 1, если нечетное количество бит равно 1 |
~& | Редукционное И-НЕ (NAND) | 0, если все биты равны 1 |
~| | Редукционное ИЛИ-НЕ (NOR) | 0, если хотя бы один бит равен 1 |
~^ | Редукционное исключающее ИЛИ-НЕ (XNOR) | 1, если четное количество бит равно 1 |
Как они работают
Редукционное И (<strong>&</strong>):
&4'b1111 = 1 // все биты равны 1
&4'b1011 = 0 // не все биты равны 1
&4'b0000 = 0 // все биты равны 0Редукционное ИЛИ (<strong>|</strong>):
|4'b0000 = 0 // ни один бит не равен 1
|4'b0100 = 1 // хотя бы один бит равен 1
|4'b1111 = 1 // все биты равны 1Редукционное XOR (<strong>^</strong>):
^4'b1010 = 0 // две единицы (четное) → 0
^4'b1000 = 1 // одна единица (нечетное) → 1
^4'b1111 = 0 // четыре единицы (четное) → 0Пример кода
module reduction_demo;
reg [3:0] a, b, c;
reg and_red, or_red, xor_red;
initial begin
a = 4'b1111;
b = 4'b1010;
c = 4'b1000;
and_red = &a; // 1111 → 1
or_red = |b; // 1010 → 1
xor_red = ^c; // 1000 → 1
$display("&4'b1111 = %d", and_red);
$display("|4'b1010 = %d", or_red);
$display("^4'b1000 = %d", xor_red);
$finish;
end
endmoduleРезультат:
&4'b1111 = 1
|4'b1010 = 1
^4'b1000 = 1Распространенные варианты использования
Проверка, все ли биты равны 1:
all_ones = &data; // 1, если data == 8'b11111111Проверить, равен ли какой-либо бит 1:
any_one = |data; // 1, если data != 0Проверка четности (нечетное количество единиц):
odd_parity = ^data; // 1, если нечетное количество единицПроверить, все ли биты равны 0:
all_zeros = ~|data; // 1, если data == 0Задание
Напишите правильные выражения редукции для каждой задачи.
Что нужно сделать:
- Проверьте, являются ли все биты
aединицами, и сохраните результат вall_ones - Проверьте, является ли хотя бы один бит
bединицей, и сохраните результат вany_one - Проверьте, содержит ли
cнечетное количество единиц, и сохраните результат вodd_parity
Шпаргалка
Операторы редукции воздействуют на все биты одного вектора и сворачивают их в однобитовый результат.
| Оператор | Операция | Результат |
|---|---|---|
& | Редукция И (AND) | 1, если все биты равны 1 |
| | Редукция ИЛИ (OR) | 1, если хотя бы один бит равен 1 |
^ | Редукция исключающее ИЛИ (XOR) | 1, если нечетное количество бит равны 1 |
~& | Редукция И-НЕ (NAND) | 0, если все биты равны 1 |
~| | Редукция ИЛИ-НЕ (NOR) | 0, если хотя бы один бит равен 1 |
~^ | Редукция исключающее ИЛИ-НЕ (XNOR) | 1, если четное количество бит равны 1 |
Типовые примеры использования:
all_ones = &data; // 1, если все биты равны 1
any_one = |data; // 1, если хотя бы один бит равен 1 (data != 0)
odd_parity = ^data; // 1, если нечетное количество единиц
all_zeros = ~|data; // 1, если data == 0Попробуйте сами
module reduction_challenge;
reg [3:0] a, b, c;
reg all_ones, any_one, odd_parity;
initial begin
a = 4'b1111;
b = 4'b0100;
c = 4'b1011;
all_ones = ______; // all bits 1?
any_one = ______; // any bit 1?
odd_parity = ______; // odd number of 1's?
$display("&4'b1111 = %d", all_ones);
$display("|4'b0100 = %d", any_one);
$display("^4'b1011 = %d", odd_parity);
$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