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

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

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

تعمل عوامل الاختزال (Reduction operators) على جميع البتات لمتجه واحد وتختزلها إلى نتيجة من بت واحد. وعلى عكس العوامل الثنائية (bitwise operators) التي تقارن بين رقمين بت تلو الآخر، تأخذ عوامل الاختزال رقماً واحداً وتجري عملية عبر جميع بتاته لإنتاج نتيجة واحدة.

 

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

كيفية عملها

عملية AND الاختزالية (<strong>&</strong>):

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

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

|4'b0000 = 0   // لا توجد بتات قيمتها 1
|4'b0100 = 1   // بت واحد على الأقل قيمته 1
|4'b1111 = 1   // جميع البتات قيمتها 1

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

^4'b1010 = 0   // اثنان من الرقم 1 (زوجي) ← 0
^4'b1000 = 1   // واحد من الرقم 1 (فردي) ← 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

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

odd_parity = ^data; // 1 إذا كان عدد الواحدات فردياً

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

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

التحدي

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

ماذا تفعل:

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

ورقة مرجعية

تعمل معاملات الاختزال (Reduction operators) على جميع البتات في متجه واحد وتختزلها إلى نتيجة مكونة من بت واحد.

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

الاستخدامات الشائعة:

all_ones   = &data;   // 1 if all bits are 1
any_one    = |data;   // 1 if any bit is 1 (data != 0)
odd_parity = ^data;   // 1 if odd number of 1's
all_zeros  = ~|data;  // 1 if 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اختبر نفسك

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

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