אופרטורים ביטיים
חלק מהיחידה יסודות במסלול ה-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אתגר
חשב את התוצאות של פעולות הסיביות עבור הערכים הנתונים.
מה לעשות:
- חשב את
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השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגייםאופרטורי צמצוםאופרטורי הזזהאופרטור שרשוראופרטור תנאיסיכום – אתגר האופרטורים3שיטת המספרים
ייצוג בינארימספרים בעלי גודל מוגדרמספרים ללא גודל מוגדרמספרים שלילייםהערכים המיוחדים X ו־Zסיכום – תבניות מספרים6מודולים
מבנה מודוליציאות קלט ופלטיציאות קלט-פלטיצירת מופע של מודולמיפוי יציאות לפי שםמיפוי יציאות לפי סדרסיכום – בניית מודולתרגלו בעצמכם: קומפיילר Verilog אונליין