ما هي التأخيرات
جزء من قسم الأساسيات في رحلة 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) | التأخيرات للمحاكاة فقط |
التحدي
ماذا تفعل:
أضف التأخيرات المفقودة لجعل هذا الكود يطبع الرسائل في الأوقات 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية13التوقيت والتأخيرات
ما هي التأخيراتتأخيرات البواباتتأخيرات التعيينتوجيه Timescaleتوليد الساعةمراجعة - التحكم في التوقيت5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة