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

Non Blocking Assignment

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

في الدرس السابق، تناولنا إسناد blocking (=)، الذي يُنفَّذ خطوةً بخطوة. والآن سنتناول إسناد non-blocking (<=)، الذي يُنفَّذ كلّه دفعةً واحدة، بالتوازي.

يستخدم الإسناد non-blocking العامل <=. ويُسمّى "non-blocking" لأنه لا يحظر تنفيذ العبارة التالية. تُنفَّذ جميع إسنادات non-blocking في الكتلة في الوقت نفسه.

البنية النحوية:

variable <= expression;

متى تستخدم الإسناد non-blocking

يُستخدم الإسناد non-blocking (<=) في المنطق التسلسلي: الدوائر التي تستخدم clock وتحتوي على ذاكرة. لا تتغير المخرجات إلا عند edge من clock (عادةً عند الحافة الصاعدة).

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

  • القلابات
  • السجلات
  • العدادات
  • آلات الحالات
  • مسجلات الإزاحة

مثال على Verilog:

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

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

عدم الحجب في كتل Always (المنطق التتابعي)

يُستخدم عدم الحجب للمنطق التتابعي: الدوائر التي تستخدم clock ولها ذاكرة (المقلّبات، والسجلات، والعدادات).

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

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

الملخّص

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

التحدي

إكمال إسناد non-blocking

Add عمليات الإسناد non-blocking المفقودة لجعل مسجل الإزاحة ذي البتّين يعمل.

كيفية عمله:

  • عند كل clock edge، q1 gets d
  • q2 gets القيمة old لـ q1

ما يجب فعله:

  1. Assign d إلى q1 (non-blocking)
  2. Assign q1 إلى q2 (non-blocking)

جرّب بنفسك

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 (غير حاجز)
      // الخطوة 2: عيّن q1 إلى q2 (غير حاجز)
    end
  end
endmodule
quiz iconاختبر نفسك

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

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

تدرّب بنفسك: مترجم Verilog عبر الإنترنت