معاملات Bitwise
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 23 من 90.
تُجري العوامل على مستوى البت (Bitwise operators) العمليات على كل بت فردي من الرقم. وعلى عكس العوامل الحسابية (+، -، *، /) التي تتعامل مع الأرقام كقيم كاملة، تعمل العوامل على مستوى البت بت لابت.
عوامل التشغيل البتية المتاحة
| العامل | العملية | ماذا يفعل |
|---|---|---|
& | AND | بت المخرجات يكون 1 فقط إذا كان كلا بتي المدخلات 1 |
| | OR | بت المخرجات يكون 1 إذا كان بت واحد على الأقل من المدخلات 1 |
^ | XOR | بت المخرجات يكون 1 إذا كانت بتات المدخلات مختلفة |
~ | NOT | يعكس جميع البتات (الـ 0 يصبح 1، والـ 1 يصبح 0) |
عندما تستخدم العوامل البتية (bitwise operators)، يتعامل Verilog مع الأرقام على أنها binary خلف الكواليس.
reg [3:0] a, b;
a = 4'd10; // Decimal 10 = binary 1010
b = 4'd12; // عشري 12 = ثنائي 1100
c = a & b; // يعمل بنفس الطريقة كاستخدام الثنائي مباشرةيمكنك كتابة الأرقام بالنظام Decimal أو الست عشري (hex) أو binary—يقوم Verilog بتحويلها إلى binary للعمليات البتية (bitwise).
كيف تعمل العمليات على مستوى البتات (Bitwise)
كل معامل يعمل على أزواج من البتات (أو بتات فردية بالنسبة لـ NOT):
مثال مع أعداد مكونة من 4 بتات:
a = 1010 (binary)
b = 1100 (binary)
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التحدي
احسب نتائج العمليات على مستوى البتات للقيم المعطاة.
ما يجب القيام به:
- احسب
a & bوقم بتخزينه فيand_res - احسب
a | bوقم بتخزينه فيor_res - احسب
a ^ bوقم بتخزينه فيxor_res - احسب
~aوقم بتخزينه فيnot_res
جرّب بنفسك
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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة