تأخيرات البوابات
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 68 من 90.
في الدرس السابق، قمنا بتغطية التأخيرات العامة (general delays) المستخدمة مثل #10 a = b; — حيث تنتظر قبل تنفيذ العبارة البرمجية.
في هذا الدرس، سنغطي تأخيرات البوابات (gate delays)، والتي تختص ببوابات البناء الأولية المدمجة مثل and و or و not. ينمذج تأخير البوابة الوقت الذي تستغرقه البوابة المادية لإخراج النتيجة بعد تغير مدخلاتها (inputs).
في العتاد الحقيقي، لا تستجيب البوابات بشكل فوري — بل يوجد تأخير بسيط. عندما تستخدم البوابات الأولية المدمجة (built-in gate primitives)، يمكنك إضافة delay لمحاكاة وقت انتشار البوابة (propagation time). يتغير الـ output فقط بعد الـ delay المحدد.
الفرق بين التأخير العام (General Delay) وتأخير البوابة (Gate Delay)
| General Delay | Gate Delay | |
|---|---|---|
| الصياغة (Syntax) | #10 a = b; | and #5 (out, a, b); |
| الموقع | # قبل العبارة البرمجية | # داخل البوابة الأولية (gate primitive) |
| الغرض | الانتظار قبل التنفيذ | نمذجة وقت انتشار البوابة |
الصياغة (Syntax):
gate_type #(delay) (output, input1, input2, ...);يحدد #(delay) عدد الوحدات الزمنية (time units) التي تستغرقها البوابة (gate) للاستجابة.
مثال بسيط
and #5 (out, a, b);تستغرق بوابة AND هذه 5 وحدات زمنية لتغيير مخرجها بعد تغيير a أو b.
تأخير البوابة مع مدخلات متعددة
nand #8 (out, a, b, c, d); // NAND بـ 4 مدخلات مع تأخير 8 وحدات زمنيةقواعد مهمة
| القاعدة | الشرح |
|---|---|
| يأتي delay بعد اسم gate | and #5 (out, a, b) |
| قيمة delay بوحدات time | بناءً على توجيه timescale |
| جميع inputs تؤثر على output | أي تغيير في input يؤدي إلى تشغيل delay |
| غير قابلة للتخليق (Not synthesizable) | تأخيرات gate هي للمحاكاة فقط |
التحدي
قم بإضافة تأخيرات البوابات (gate delays) المفقودة إلى هذا الـ module. استخدم تأخيرات مختلفة لكل بوابة.
ما يجب فعله:
- بوابة AND: تأخير بمقدار 5 وحدة time
- بوابة OR: تأخير بمقدار 3 وحدة time
- بوابة NOT: تأخير بمقدار 2 وحدة time
جرّب بنفسك
module gate_delay_challenge;
reg a, b;
wire and_out, or_out, not_out;
// TODO: أضف بوابة AND بتأخير 5 وحدات زمنية (المدخلات a, b)
// TODO: أضف بوابة OR بتأخير 3 وحدات زمنية (المدخلات a, b)
// TODO: أضف بوابة NOT بتأخير 2 وحدات زمنية (المدخل a)
initial begin
$monitor("Time %0t: a=%b, b=%b | and=%b, or=%b, not=%b",
$time, a, b, and_out, or_out, not_out);
a = 1; b = 1;
#10 $finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية13التوقيت والتأخيرات
ما هي التأخيراتتأخيرات البواباتتأخيرات التعيينتوجيه Timescaleتوليد الساعةمراجعة - التحكم في التوقيت5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة