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

ما هي التأخيرات

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

في لغة Verilog، تتحكم التأخيرات في وقت تنفيذ الجملة أو وقت تغير الإشارة. وتُستخدم لنمذجة سلوك التوقيت الحقيقي للأجهزة.

لماذا تعد التأخيرات ضرورية

تستغرق الأجهزة الحقيقية وقتاً لانتقال الإشارات عبر الأسلاك والبوابات. تسمح لك التأخيرات بمحاكاة سلوك التوقيت هذا.

  • في المحاكاة، بدون تأخيرات، يحدث كل شيء في الوقت 0
  • تسمح لك التأخيرات بمباعدة الأحداث بمرور الوقت
  • تساعد في اختبار التصميمات الحساسة للتوقيت مثل الساعات وآلات الحالة

أنواع التأخيرات

نوع التأخيرالغرض
تأخيرات البواباتالتأخير عبر البوابات المنطقية
تأخيرات التعيينالتأخير عند تعيين القيم
توجيه المقياس الزمنييحدد وحدات الوقت للمحاكاة

البنية الأساسية

يتم كتابة التأخير باستخدام # متبوعاً برقم:

#10 clk = ~clk;   // انتظر 10 وحدات زمنية، ثم قم بتبديل حالة الساعة
#5 a = b;         // انتظر 5 وحدات زمنية، ثم قم بتعيين a = b

الرقم الذي يلي # هو عدد الوحدات الزمنية للانتظار.

مثال بسيط

initial begin
  a = 0;
  #10 a = 1;   // بعد 10 وحدات زمنية، تصبح a مساوية لـ 1
  #5 a = 0;    // بعد 5 وحدات زمنية أخرى، تصبح a مساوية لـ 0
end

التوقيت:

  • الوقت 0: a = 0
  • الوقت 10: a = 1
  • الوقت 15: a = 0

التأخير في كتل Always

always #5 clk = ~clk;   // تبديل حالة الساعة كل 5 وحدات زمنية

يؤدي هذا إلى إنشاء إشارة ساعة مستمرة.

قواعد هامة

القاعدةالشرح
الرمز #يميز التأخير
الرقم بعد #عدد الوحدات الزمنية للانتظار
التأخيرات تراكمية#10 ثم #20 ينتظر إجمالي 30
غير قابل للتوليف (Not synthesizable)التأخيرات للمحاكاة فقط
challenge icon

التحدي

ماذا تفعل:

أضف التأخيرات المفقودة لجعل هذا الكود يطبع الرسائل في الأوقات 0، 10، 25، و 40.

ورقة مرجعية

في لغة Verilog، تستخدم التأخيرات (delays) الرمز # متبوعاً بوحدات زمنية للتحكم في وقت تنفيذ العبارات:

#10 a = 1;   // انتظر 10 وحدات زمنية، ثم قم بالتعيين

التأخيرات تراكمية — كل تأخير يضاف إلى الوقت الحالي:

initial begin
  a = 0;      // الوقت 0
  #10 a = 1;  // الوقت 10
  #5  a = 0;  // الوقت 15
end

تُستخدم في كتل always لتوليد نبضات الساعة (clocks):

always #5 clk = ~clk;  // التبديل كل 5 وحدات

ملاحظة: التأخيرات مخصصة للمحاكاة فقط — وليست قابلة للتوليف (not synthesizable).

جرّب بنفسك

module delay_challenge;
  
  initial begin
    $display("Time %0t: Start", $time);
    // TODO: أضف تأخيراً للوصول إلى الوقت 10
    $display("Time %0t: After first delay", $time);
    // TODO: أضف تأخيراً للوصول إلى الوقت 25
    $display("Time %0t: After second delay", $time);
    // TODO: أضف تأخيراً للوصول إلى الوقت 40
    $display("Time %0t: End", $time);
    $finish;
  end
  
endmodule

quiz iconاختبر نفسك

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

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