معاملات Bitwise
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 23 من 90.
تقوم عوامل التشغيل الثنائية (Bitwise operators) بإجراء عمليات على كل بت على حدة من الرقم. وعلى عكس العمليات الحسابية (+، -، *، /) التي تعامل الأرقام كقيم كاملة، تعمل عوامل التشغيل الثنائية بت تلو الآخر.
عوامل التشغيل الثنائية المتاحة
| العامل | العملية | الوظيفة |
|---|---|---|
& | AND | تكون بت المخرجات 1 فقط إذا كان كلا بتي المدخلات 1 |
| | OR | تكون بت المخرجات 1 إذا كان واحد على الأقل من بتات المدخلات 1 |
^ | XOR | تكون بت المخرجات 1 إذا كانت بتات المدخلات مختلفة |
~ | NOT | يقلب جميع البتات (يصبح 0 هو 1، ويصبح 1 هو 0) |
عندما تستخدم العوامل الثنائية (bitwise operators)، فإن Verilog يعامل الأرقام كأرقام ثنائية خلف الكواليس.
reg [3:0] a, b;
a = 4'd10; // عشري 10 = ثنائي 1010
b = 4'd12; // عشري 12 = ثنائي 1100
c = a & b; // يعمل بنفس الطريقة كما لو تم استخدام النظام الثنائي مباشرةيمكنك كتابة الأرقام بالنظام العشري، أو الست عشري، أو الثنائي—يقوم Verilog بتحويلها إلى النظام الثنائي من أجل العمليات على مستوى البت (bitwise operations).
كيف تعمل العمليات الثنائية (Bitwise)
يعمل كل عامل على أزواج من البتات (أو بتات مفردة لـ NOT):
مثال مع أرقام مكونة من 4 بتات:
a = 1010 (ثنائي)
b = 1100 (ثنائي)
AND: a & b = 1000
(1&1=1, 0&1=0, 1&0=0, 0&0=0)
OR: a | b = 1110
(1|1=1, 0|1=1, 1|0=1, 0|0=0)
XOR: a ^ b = 0110
(1^1=0, 0^1=1, 1^0=1, 0^0=0)
NOT: ~a = 0101
(~1=0, ~0=1, ~1=0, ~0=1)مثال على الكود
module bitwise_demo;
reg [3:0] a, b;
reg [3:0] and_res, or_res, xor_res, not_res;
initial begin
a = 4'b1010;
b = 4'b1100;
and_res = a & b; // 1010 & 1100 = 1000
or_res = a | b; // 1010 | 1100 = 1110
xor_res = a ^ b; // 1010 ^ 1100 = 0110
not_res = ~a; // ~1010 = 0101
$display("a = %b", a);
$display("b = %b", b);
$display("a & b = %b", and_res);
$display("a | b = %b", or_res);
$display("a ^ b = %b", xor_res);
$display("~a = %b", not_res);
$finish;
end
endmoduleالمخرجات:
a = 1010
b = 1100
a & b = 1000
a | b = 1110
a ^ b = 0110
~a = 0101التحدي
احسب نتائج العمليات الثنائية (bitwise) للقيم المعطاة.
ما يجب القيام به:
- احسب
a & bوقم بتخزينها فيand_res - احسب
a | bوقم بتخزينها فيor_res - احسب
a ^ bوقم بتخزينها فيxor_res - احسب
~aوقم بتخزينها فيnot_res
ورقة مرجعية
تعمل العمليات على مستوى البت على كل بت فردي من الرقم:
| المعامل | العملية | بت المخرجات يكون 1 عندما... |
|---|---|---|
& | AND | يكون كلا بتي المدخلات 1 |
| | OR | يكون واحد على الأقل من بتات المدخلات 1 |
^ | XOR | تكون بتات المدخلات مختلفة |
~ | NOT | يقلب جميع البتات (أحادي) |
// a = 1010, b = 1100
a & b = 1000 // AND
a | b = 1110 // OR
a ^ b = 0110 // XOR
~a = 0101 // NOT
جرّب بنفسك
module bitwise_challenge;
reg [3:0] a, b;
reg [3:0] and_res, or_res, xor_res, not_res;
initial begin
a = 4'b1101;
b = 4'b1011;
and_res = ______; // a & b
or_res = ______; // a | b
xor_res = ______; // a ^ b
not_res = ______; // ~a
$display("a = %b", a);
$display("b = %b", b);
$display("a & b = %b", and_res);
$display("a | b = %b", or_res);
$display("a ^ b = %b", xor_res);
$display("~a = %b", not_res);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة