معاملات الاختزال
جزء من قسم الأساسيات في رحلة 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 // جميع البتات قيمتها 1XOR الاختزالي (<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التحدي
اكتب تعبيرات الاختزال (reduction expressions) الصحيحة لكل مهمة.
ماذا تفعل:
- تحقق مما إذا كانت جميع بتات
aهي 1 وقم بتخزينها فيall_ones - تحقق مما إذا كان أي بت من
bهو 1 وقم بتخزينها فيany_one - تحقق مما إذا كان
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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة