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 مع الأرقام على أنها 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
challenge icon

التحدي

احسب نتائج العمليات على مستوى البتات للقيم المعطاة.

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

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

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

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