Menu
Coddy logo textTech

Operatory redukcji

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 25 z 90.

Operatory redukcji działają na wszystkich bitach pojedynczego wektora i redukują je do wyniku będącego pojedynczym bitem. W przeciwieństwie do operatorów bitowych, które porównują dwie liczby bit po bicie, operatory redukcji przyjmują jedną liczbę i wykonują operację na wszystkich jej bitach, aby uzyskać pojedynczy wynik.

 

OperatorDziałanieWynik
&Redukcyjne AND1, jeśli wszystkie bity mają wartość 1
|Redukcyjne OR1, jeśli co najmniej jeden bit ma wartość 1
^Redukcyjne XOR1, jeśli nieparzysta liczba bitów ma wartość 1
~&Redukcyjne NAND0, jeśli wszystkie bity mają wartość 1
~|Redukcyjne NOR0, jeśli co najmniej jeden bit ma wartość 1
~^Redukcyjne XNOR1, jeśli parzysta liczba bitów ma wartość 1

Jak działają

Redukcyjne AND (<strong>&</strong>):

&4'b1111 = 1   // all bits are 1
&4'b1011 = 0   // nie wszystkie bity mają wartość 1
&4'b0000 = 0   // all bits are 0

Redukcja OR (<strong>|</strong>):

|4'b0000 = 0   // no bits are 1
|4'b0100 = 1   // co najmniej jeden bit ma wartość 1
|4'b1111 = 1   // all bits are 1

Redukcja XOR (<strong>^</strong>):

^4'b1010 = 0   // two 1's (even) → 0
^4'b1000 = 1   // one 1 (odd) → 1
^4'b1111 = 0   // cztery jedynki (parzysta liczba) → 0

Przykład kodu

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

Wynik:

&4'b1111 = 1
|4'b1010 = 1
^4'b1000 = 1

Typowe zastosowania

Sprawdź, czy wszystkie bity mają wartość 1:

all_ones = &data;   // 1, jeśli data == 8'b11111111

Sprawdź, czy którykolwiek bit ma wartość 1:

any_one = |data;    // 1, jeśli data != 0

Sprawdź parzystość (nieparzysta liczba jedynek):

odd_parity = ^data; // 1, jeśli liczba jedynek jest nieparzysta

Sprawdź, czy wszystkie bity mają wartość 0:

all_zeros = ~|data; // 1, jeśli data == 0
challenge icon

Wyzwanie

Zapisz poprawne wyrażenia redukcyjne dla każdego zadania.

Co należy zrobić:

  1. Sprawdź, czy wszystkie bity a mają wartość 1, i zapisz wynik w all_ones
  2. Sprawdź, czy którykolwiek bit b ma wartość 1, i zapisz wynik w any_one
  3. Sprawdź, czy c zawiera nieparzystą liczbę jedynek, i zapisz wynik w odd_parity

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online