Menu
CoddyTech

Toán tử rút gọn

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 25 trên 90.

Các toán tử rút gọn tác động lên mọi bit của một vector duy nhất và rút chúng gọn thành kết quả một bit. Khác với các toán tử thao tác trên bit, vốn so sánh hai số từng bit một, toán tử rút gọn nhận một số và thực hiện phép toán trên tất cả các bit của số đó để tạo ra một kết quả duy nhất.

 

Toán tửPhép toánKết quả
&Phép AND rút gọn1 nếu tất cả các bit đều là 1
|Phép OR rút gọn1 nếu ít nhất một bit là 1
^Phép XOR rút gọn1 nếu số lượng bit là 1 là số lẻ
~&Phép NAND rút gọn0 nếu tất cả các bit đều là 1
~|Phép NOR rút gọn0 nếu có ít nhất một bit là 1
~^Phép XNOR rút gọn1 nếu số lượng bit là 1 là số chẵn

Cách chúng hoạt động

Phép AND rút gọn (&):

&4'b1111 = 1   // all bits are 1
&4'b1011 = 0   // Không phải tất cả các bit đều là 1
&4'b0000 = 0   // all bits are 0

Phép OR rút gọn (|):

|4'b0000 = 0   // no bits are 1
|4'b0100 = 1   // ít nhất một bit bằng 1
|4'b1111 = 1   // all bits are 1

XOR rút gọn (^):

^4'b1010 = 0   // two 1's (even) → 0
^4'b1000 = 1   // one 1 (odd) → 1
^4'b1111 = 0   // bốn số 1 (chẵn) → 0

Ví dụ code

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

Đầu ra:

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

Các cách dùng phổ biến

Kiểm tra xem tất cả các bit đều là 1:

all_ones = &data;   // 1 nếu data == 8'b11111111

Kiểm tra xem có bit nào bằng 1 không:

any_one = |data;    // 1 nếu data != 0

Kiểm tra tính chẵn lẻ (số lượng bit 1 là số lẻ):

odd_parity = ^data; // 1 nếu số lượng chữ số 1 là số lẻ

Kiểm tra xem tất cả các bit có bằng 0 không:

all_zeros = ~|data; // 1 nếu data == 0
challenge icon

Thử thách

Viết các biểu thức rút gọn đúng cho từng yêu cầu.

Cần làm:

  1. Kiểm tra xem tất cả các bit của a có bằng 1 không và lưu kết quả vào all_ones
  2. Kiểm tra xem có bit nào của b bằng 1 không và lưu kết quả vào any_one
  3. Kiểm tra xem c có số lượng bit 1 lẻ không và lưu kết quả vào odd_parity

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online