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

Shift Operators

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

تنقل معاملات Shift قيمة bits إلى left أو right داخل متجه.

معاملات Shift المتاحة

المعاملالعمليةالوصف
<<إزاحة left منطقيةتزيح bits إلى left، وتملؤها بالأصفار
>>إزاحة right منطقيةتزيح bits إلى right، وتملؤها بالأصفار
<<<إزاحة left حسابيةمثل الإزاحة left المنطقية
>>>إزاحة right حسابيةتزيح إلى right، وتحافظ على bit الإشارة sign

كيفية عملها

الإزاحة إلى اليسار (<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

الإزاحة الحسابية إلى اليمين (>>>)

بالنسبة إلى الأعداد signed، تحافظ الإزاحة الحسابية إلى اليمين على بت الإشارة:

reg signed [7:0] a;
a = -5;                // 11111011
a >>> 2 = 11111110     // لا يزال سالبًا

الإزاحة المنطقية (>>) ستملأ بالأصفار وستفقد الإشارة.

الاستخدامات الشائعة

الضرب في قوة للعدد 2 (إزاحة إلى اليسار):

x << 1    // اضرب في 2
x << 2    // اضرب في 4
x << 3    // اضرب في 8

القسمة على قوة للعدد 2 (الإزاحة إلى اليمين):

x >> 1    // اقسم على 2
x >> 2    // اقسم على 4
x >> 3    // اقسم على 8

Extract حقلًا:

// احصل على البتات 5-2 من قيمة 8 بت
field = (data >> 2) & 4'b1111;
challenge icon

التحدي

اكتب تعبيرات الإزاحة الصحيحة لكل مهمة.

ما يجب فعله:

  1. أزِح a إلى اليسار بمقدار 3 بتات وخزّنها في left_result
  2. أزِح a إلى اليمين بمقدار 1 بت وخزّنها في 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 لليمين بمقدار 1 بت
    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 عبر الإنترنت