Menu
CoddyTech

معاملات الاختزال

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

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

 

العاملالعمليةالنتيجة
&AND اختزالي1 إذا كانت كل البتات تساوي 1
|OR اختزالي1 إذا كان بت واحد على الأقل يساوي 1
^XOR اختزالي1 إذا كان عدد فردي من البتات يساوي 1
~&NAND اختزالي0 إذا كانت كل البتات تساوي 1
~|NOR اختزالي0 إذا كان بت واحد على الأقل يساوي 1
~^XNOR اختزالي1 إذا كان عدد زوجي من البتات يساوي 1

كيف تعمل

AND الاختزالي (&):

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

عملية OR الاختزالية (|):

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

اختزال XOR (^):

^4'b1010 = 0   // two 1's (even) → 0
^4'b1000 = 1   // one 1 (odd) → 1
^4'b1111 = 0   // أربع خانات من 1 (عدد زوجي) → 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 فرديًا

تحقّق مما إذا كانت جميع البتات 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 عبر الإنترنت