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

الإسناد غير الحاجب

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

في الدرس السابق، قمنا بتغطية الإسناد الحاجب (blocking assignment) (=)، والذي يتم تنفيذه خطوة بخطوة. الآن سنقوم بتغطية الإسناد غير الحاجب (non-blocking assignment) (<=)، والذي يتم تنفيذه دفعة واحدة — بالتوازي.

يستخدم الإسناد غير الحاجب (Non-blocking assignment) المعامل <=. ويُطلق عليه اسم "غير حاجب" لأنه لا يحجب تنفيذ الجملة التالية. يتم تنفيذ جميع عمليات الإسناد غير الحاجبة في الكتلة البرمجية في نفس الوقت.

الصيغة:

variable <= expression;

متى تستخدم التعيين غير المحظور

يُستخدم التعيين غير المحظور (<=) لـ المنطق التتابعي — وهي الدوائر التي تستخدم ساعة ولديها ذاكرة. تتغير المخرجات فقط عند حافة الساعة (عادةً الحافة الصاعدة).

أمثلة على المنطق التتابعي:

  • القلابات (Flip-flops)
  • المسجلات (Registers)
  • العدادات (Counters)
  • آلات الحالة
  • مسجلات الإزاحة

مثال Verilog:

initial begin
  a <= 5;      // مجدولة، ولكن لم يتم تنفيذها بعد
  b <= a + 2;  // مجدولة، تستخدم القيمة القديمة لـ a
  c <= b * 3;  // مجدولة، تستخدم القيمة القديمة لـ b
end

تحدث جميع عمليات الإسناد الثلاثة في نفس الوقت باستخدام القيم القديمة. وفي نهاية الخطوة الزمنية، تحدث جميع التحديثات معاً.

Non-Blocking في كتل Always (المنطق التتابعي)

يُستخدم Non-blocking لـ المنطق التتابعي — الدوائر التي تستخدم ساعة ولديها ذاكرة (القلابات، المسجلات، العدادات).

always @(posedge clk) begin
  q <= d;           // تأخذ q قيمة d عند حافة الساعة
  count <= count + 1; // يزداد count عند حافة الساعة
end

تحدث كلتا عمليتي الإسناد في نفس الوقت، باستخدام القيم من قبل حافة الساعة.

الملخص

القاعدةالشرح
استخدم <= للمنطق التتابعيalways @(posedge clk)
استخدم = للمنطق التوافقيalways @(*)
التعيينات غير المحجوبة (Non-blocking) تُنفذ بالتوازيتحدث جميع التعيينات في وقت واحد
تُحدث القيم في نهاية الخطوة الزمنيةليس فوراً
challenge icon

التحدي

أكمل التعيين غير المحظور (Non-Blocking Assignment)

أضف التعيينات غير المحظورة المفقودة لجعل سجل الإزاحة (shift register) المكون من 2 بت يعمل.

كيفية العمل:

  • عند كل حافة للساعة، يحصل q1 على d
  • يحصل q2 على القيمة القديمة لـ q1

ما يجب فعله:

  1. قم بتعيين d إلى q1 (غير محظور)
  2. قم بتعيين q1 إلى q2 (غير محظور)

ورقة مرجعية

التخصيص غير الحاجب (Non-blocking assignment) (<=) ينفذ جميع العبارات بالتوازي — باستخدام القيم القديمة، ويقوم بالتحديث في نهاية الخطوة الزمنية.

// All use OLD values of a and b
a <= 5;
b <= a + 2;  // uses old a
c <= b * 3;  // uses old b

استخدم <= من أجل المنطق التتابعي (sequential logic) (القلابات flip-flops، السجلات registers، العدادات counters) داخل بلوكات always المتزامنة مع نبضات الساعة:

always @(posedge clk) begin
  q     <= d;           // non-blocking
  count <= count + 1;   // non-blocking
end
التخصيصيستخدم لـالتنفيذ
<=المنطق التتابعي (posedge clk)بالتوازي
=المنطق التوافقي (always @(*))خطوة بخطوة

جرّب بنفسك

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: أضف منطق الإزاحة
      // الخطوة 1: تعيين d إلى q1 (غير محجوب - non-blocking)
      // الخطوة 2: تعيين q1 إلى q2 (غير محجوب - non-blocking)
    end
  end
endmodule
quiz iconاختبر نفسك

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

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