אופרטורי הזזה
חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 26 מתוך 90.
אופרטורי הזזה מזיזים ביטים שמאלה או ימינה בתוך וקטור.
אופרטורי הזזה זמינים
| אופרטור | פעולה | תיאור |
|---|---|---|
<< | הזזה לוגית שמאלה | מזיז ביטים שמאלה ומשלים באפסים |
>> | הזזה לוגית ימינה | מזיז ביטים ימינה ומשלים באפסים |
<<< | הזזה אריתמטית שמאלה | זהה להזזה לוגית שמאלה |
>>> | הזזה אריתמטית ימינה | מזיז ימינה ושומר על ביט הסימן |
איך הם עובדים
הזזה שמאלה (<strong><<</strong>):
8'b00001010 << 2 = 8'b00101000הביטים נעים שמאלה. אפסים ממלאים את הצד הימני.
הזזה ימינה (<strong>>></strong>):
8'b00001010 >> 2 = 8'b00000010הביטים זזים ימינה. אפסים ממלאים את הצד השמאלי.
דוגמת קוד
module shift_demo;
reg [7:0] original, left_shift, right_shift;
initial begin
original = 8'b00001010;
left_shift = original << 2; // 00001010 → 00101000
right_shift = original >> 2; // 00001010 → 00000010
$display("original = %b", original);
$display("<< 2 = %b", left_shift);
$display(">> 2 = %b", right_shift);
$finish;
end
endmoduleפלט:
original = 00001010
<< 2 = 00101000
>> 2 = 00000010הזזה אריתמטית ימינה (>>>)
עבור מספרים עם סימן, הזזה אריתמטית ימינה משמרת את ביט הסימן:
reg signed [7:0] a;
a = -5; // 11111011
a >>> 2 = 11111110 // Still negativeהזזה לוגית (>>) תמלא באפסים ותאבד את סימן המספר.
שימושים נפוצים
כפל בחזקה של 2 (הזזה שמאלה):
x << 1 // Multiply by 2
x << 2 // Multiply by 4
x << 3 // Multiply by 8חלוקה בחזקה של 2 (הזזה ימינה):
x >> 1 // Divide by 2
x >> 2 // Divide by 4
x >> 3 // Divide by 8חלץ שדה:
// Get bits 5-2 from an 8-bit value
field = (data >> 2) & 4'b1111;אתגר
כתוב את ביטויי ההזזה הנכונים לכל משימה.
מה צריך לעשות:
- הזז את
aשמאלה ב־3 ביטים ושמור ב־left_result - הזז את
aימינה בביט אחד ושמור ב־right_result - הזז את
bימינה ב־2 ביטים (אריתמטית) ושמור ב־arith_result
נסו בעצמכם
module shift_challenge;
reg [7:0] a;
reg signed [7:0] b;
reg [7:0] left_result, right_result;
reg signed [7:0] arith_result;
initial begin
a = 8'b00010001;
b = -8'sd16; // 11110000 בייצוג בינארי
left_result = ______; // הזז את a שמאלה ב-3 ביטים
right_result = ______; // הזז את a ימינה בביט אחד
arith_result = ______; // הזז את b ימינה ב-2 ביטים (הזזה אריתמטית)
$display("a = %b", a);
$display("a << 3 = %b", left_result);
$display("a >> 1 = %b", right_result);
$display("b = %b", b);
$display("b >>> 2 = %b", arith_result);
$finish;
end
endmoduleהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגייםאופרטורי צמצוםאופרטורי הזזהאופרטור שרשוראופרטור תנאיסיכום – אתגר האופרטורים3שיטת המספרים
ייצוג בינארימספרים בעלי גודל מוגדרמספרים ללא גודל מוגדרמספרים שלילייםהערכים המיוחדים X ו־Zסיכום – תבניות מספרים6מודולים
מבנה מודוליציאות קלט ופלטיציאות קלט-פלטיצירת מופע של מודולמיפוי יציאות לפי שםמיפוי יציאות לפי סדרסיכום – בניית מודולתרגלו בעצמכם: קומפיילר Verilog אונליין