Menu
CoddyTech

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

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

تنقل معاملات الإزاحة البتات إلى اليسار أو اليمين داخل متجه.

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

المعاملالعمليةالوصف
<<إزاحة منطقية إلى اليسارتنقل البتات إلى اليسار وتملأ المواضع بأصفار
>>إزاحة منطقية إلى اليمينتنقل البتات إلى اليمين وتملأ المواضع بأصفار
<<<إزاحة حسابية إلى اليسارمثل الإزاحة المنطقية إلى اليسار
>>>إزاحة حسابية إلى اليمينتنقل البتات إلى اليمين وتحافظ على بت الإشارة

كيف تعمل

الإزاحة إلى اليسار (<<):

8'b00001010 << 2 = 8'b00101000

تتحرك البتات إلى اليسار. تملأ الأصفار الجانب الأيمن.

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

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 إلى اليمين بمقدار 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 عبر الإنترنت