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

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

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

تعمل عمليات التقليل (Reduction operators) على جميع الـ bits لمتجه واحد وتقوم بتقليلها إلى نتيجة من bit واحد. وعلى عكس العمليات على مستوى الـ bit (bitwise operators) التي تقارن بين رقمين bit-بـ-bit، تأخذ عمليات التقليل رقمًا واحدًا وتنفذ عملية عبر جميع الـ bits الخاصة به لإنتاج نتيجة واحدة.

 

المعاملالعمليةالنتيجة
&AND الاختزال1 إذا كانت جميع البتات (all bits) هي 1
|OR الاختزال1 إذا كانت بت واحدة على الأقل (at least one bit) هي 1
^XOR الاختزال1 إذا كان هناك عدد فردي (odd number) من البتات يساوي 1
~&NAND الاختزال0 إذا كانت جميع البتات (all bits) هي 1
~|NOR الاختزال0 إذا كانت بت واحدة على الأقل (at least one bit) هي 1
~^XNOR الاختزال1 إذا كان هناك عدد زوجي (even number) من البتات يساوي 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

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

التحقق مما إذا كانت جميع الـ bits تساوي 1:

all_ones = &data;   // 1 إذا كان data == 8'b11111111

التحقق مما إذا كانت أي bit هي 1:

any_one = |data;    // 1 إذا data != 0

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

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

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

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

التحدي

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

ما يجب فعله:

  1. تحقق مما إذا كانت جميع الـ bits في a هي 1 وقم بتخزين النتيجة في all_ones
  2. تحقق مما إذا كان أي bit في b هو 1 وقم بتخزين النتيجة في any_one
  3. تحقق مما إذا كان c يحتوي على number فردي من الـ 1's وقم بتخزين النتيجة في 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اختبر نفسك

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

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