Menu
Coddy logo textTech

אופרטורי הזזה

חלק מהיחידה יסודות במסלול ה-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;
challenge icon

אתגר

כתוב את ביטויי ההזזה הנכונים לכל משימה.

מה צריך לעשות:

  1. הזז את a שמאלה ב־3 ביטים ושמור ב־left_result
  2. הזז את a ימינה בביט אחד ושמור ב־right_result
  3. הזז את 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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: קומפיילר Verilog אונליין