Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Reduction Operators

جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 25 من 90.

تعمل عوامل الاختزال على جميع البتات في متجه واحد وتختزلها إلى نتيجة من بت واحد. وعلى عكس العوامل على مستوى البت التي تقارن بين عددين بتًا بتًا، تأخذ عوامل الاختزال عددًا واحدًا وتُجري عملية على جميع بتاته لإنتاج نتيجة واحدة.

 

المعاملالعمليةالنتيجة
&اختزال AND1 إذا كانت all bits تساوي 1
|اختزال OR1 إذا كان at least one bit يساوي 1
^اختزال XOR1 إذا كان odd number من bits يساوي 1
~&اختزال NAND0 إذا كانت all bits تساوي 1
~|اختزال NOR0 إذا كان at least one bit يساوي 1
~^اختزال XNOR1 إذا كان even number من bits يساوي 1

كيفية عملها

و AND الاختزالي (<strong>&</strong>):

&4'b1111 = 1   // all bits are 1
&4'b1011 = 0   // ليست كل البتات 1
&4'b0000 = 0   // all bits are 0

OR الاختزالي (<strong>|</strong>):

|4'b0000 = 0   // no bits are 1
|4'b0100 = 1   // بت واحد على الأقل هو 1
|4'b1111 = 1   // all bits are 1

اختزال XOR (<strong>^</strong>):

^4'b1010 = 0   // two 1's (even) → 0
^4'b1000 = 1   // one 1 (odd) → 1
^4'b1111 = 0   // أربعة 1's (زوجي) → 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

تحقّق من التكافؤ (عدد فردي من 1):

odd_parity = ^data; // 1 إذا كان عدد الـ 1's فرديًا

تحقّق مما إذا كانت جميع البتات تساوي 0:

all_zeros = ~|data; // 1 إذا data == 0
challenge icon

التحدي

اكتب تعبيرات الاختزال الصحيحة لكل مهمة.

ما يجب فعله:

  1. تحقّق مما إذا كانت جميع بتات a تساوي 1، وخزّن النتيجة في all_ones
  2. تحقّق مما إذا كان أي بت من b يساوي 1، وخزّن النتيجة في any_one
  3. تحقّق مما إذا كان c يحتوي على عدد فردي من 1، وخزّن النتيجة في odd_parity

جرّب بنفسك

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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات

تدرّب بنفسك: مترجم Verilog عبر الإنترنت