Menu
Coddy logo textTech

Операторы редукции

Часть раздела Основы путешествия по 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
challenge icon

Задание

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

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

  1. Проверьте, являются ли все биты a единицами, и сохраните результат в all_ones
  2. Проверьте, является ли хотя бы один бит b единицей, и сохраните результат в any_one
  3. Проверьте, содержит ли 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
quiz iconПроверьте себя

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

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