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

معاملات الإزاحة

جزء من قسم الأساسيات في رحلة 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

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

بالنسبة للأرقام الموقعة (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

استخراج حقل:

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

التحدي

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

ماذا تفعل:

  1. قم بإزاحة a لليسار بمقدار 3 بتات وقم بتخزينها في left_result
  2. قم بإزاحة a لليمين بمقدار بت واحد وقم بتخزينها في right_result
  3. قم بإزاحة b لليمين بمقدار 2 بت (حسابياً) وقم بتخزينها في arith_result

ورقة مرجعية

تقوم معاملات الإزاحة (Shift operators) بتحريك البتات لليسار أو لليمين داخل المتجه (vector):

المعاملالوصف
<<إزاحة منطقية لليسار (يملأ بالأصفار)
>>إزاحة منطقية لليمين (يملأ بالأصفار)
<<<إزاحة حسابية لليسار (نفس المنطقية)
>>>إزاحة حسابية لليمين (يحافظ على بت الإشارة)
8'b00001010 << 2  // = 8'b00101000
8'b00001010 >> 2  // = 8'b00000010

reg signed [7:0] a;
a = -5;           // 11111011
a >>> 2           // = 11111110 (sign preserved)

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

x << n    // Multiply by 2^n
x >> n    // Divide by 2^n

// Extract bits 5-2 from an 8-bit value
field = (data >> 2) & 4'b1111;

جرّب بنفسك

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 لليمين بمقدار بتين (إزاحة حسابية)
    
    $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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات