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

معاملات 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
challenge icon

التحدي

احسب نتائج العمليات الثنائية (bitwise) للقيم المعطاة.

ما يجب القيام به:

  1. احسب a & b وقم بتخزينها في and_res
  2. احسب a | b وقم بتخزينها في or_res
  3. احسب a ^ b وقم بتخزينها في xor_res
  4. احسب ~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
quiz iconاختبر نفسك

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

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