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