ما هي التأخيرات
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 67 من 90.
في Verilog، تُحدد تأخيرات الزمان (delays) متى يتم تنفيذ عبارة ما أو متى تتغير الإشارة. وتُستخدم لنمذجة سلوك التوقيت الزمني الحقيقي للأجهزة (hardware).
لماذا نحتاج إلى التأخيرات (Delays)
تستغرق الإشارات في الأجهزة الفعلية وقتًا للانتقال عبر الأسلاك والبوابات. تتيح لك التأخيرات محاكاة سلوك التوقيت هذا.
- في المحاكاة، وبدون فترات التأخير (delays)، يحدث كل شيء في الوقت 0
- تتيح لك فترات التأخير (delays) المباعدة بين الأحداث عبر الزمن
- تساعد في اختبار التصاميم الحساسة للتوقيت مثل الساعات الآلية (clocks) وآلات الحالات (state machines)
أنواع التأخيرات
| نوع التأخير | الغرض |
|---|---|
| تأخيرات البوابات | التأخير عبر البوابات المنطقية |
| تأخيرات التعيين | التأخير عند تعيين القيم |
| توجيه Timescale Directive | يحدد time units للمحاكاة |
البنية الأساسية (Basic Syntax)
يتم كتابة التأخير (delay) باستخدام # متبوعاً برقم:
#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التوقيت:
- Time 0:
a = 0 - Time 10:
a = 1 - Time 15:
a = 0
Delays in Always Blocks
always #5 clk = ~clk; // تبديل الساعة كل 5 وحدات زمنيةأنشئ هذا إشارة ساعة مستمرة (بافتراض أن clk قد تم تهيئته أولاً إلى 0 في كتلة initial — وإلا فإن ~x يظل x).
قواعد هامة
| القاعدة | الشرح |
|---|---|
رمز # | يمثل التأخير (delay) |
الرقم بعد # | عدد وحدات الوقت المراد انتظارها |
| التأخيرات تراكمية | #10 ثم #20 ينتظر في المجموع 30 |
| غير قابلة للتصنيع (Not synthesizable) | التأخيرات مخصصة للمحاكاة فقط |
التحدي
ما يجب فعله:
أضف التأخيرات المفقودة لجعل هذا الكود يطبع الرسائل في الأوقات 0، 10، 25، و 40.
جرّب بنفسك
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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة