Menu
Coddy logo textTech

אופרטורים ביטיים

חלק מהיחידה יסודות במסלול ה-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 אונליין