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

Bitwise Operators

جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 23 من 90.

تُجري المعاملات على مستوى البِت عمليات على كل بِت على حدة من العدد. وعلى خلاف المعاملات الحسابية (+، -، *، /) التي تتعامل مع الأعداد كقيم كاملة، تعمل المعاملات على مستوى البِت بِتًا بِتًا.

عوامل التشغيل المتاحة على مستوى البتات

العاملالعمليةما الذي يفعله
&ANDبت الناتج يساوي 1 فقط إذا كان كلا بتّي الإدخال يساوي 1
|ORبت الناتج يساوي 1 إذا كان بت إدخال واحد على الأقل يساوي 1
^XORبت الناتج يساوي 1 إذا كان بتّا الإدخال مختلفين
~NOTيقلب جميع البتات (يصبح 0 هو 1، ويصبح 1 هو 0)

عند استخدام العوامل على مستوى البتات، يتعامل Verilog مع الأرقام على أنها ثنائية في الخلفية.

reg [3:0] a, b;

a = 4'd10;      // Decimal 10 = binary 1010
b = 4'd12;      // عشري 12 = ثنائي 1100
c = a & b;      // يعمل بنفس الطريقة عند استخدام الثنائي مباشرة

يمكنك كتابة الأرقام بالنظام العشري أو السداسي عشري أو الثنائي: يحوّلها Verilog إلى النظام الثنائي لإجراء العمليات على مستوى البتات.

كيف تعمل العمليات على مستوى البِتّات

يعمل كل عامل على أزواج من البِتّات (أو على بِتّات مفردة بالنسبة إلى 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اختبر نفسك

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

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

تدرّب بنفسك: مترجم Verilog عبر الإنترنت