تأخيرات التعيين
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 69 من 90.
في الدروس السابقة، غطينا التأخيرات العامة (#10 a = b;) وتأخيرات البوابات (and #5 (out, a, b);). الآن سنتناول تأخيرات الإسناد، وهي تأخيرات تحدث داخل كتلة إجرائية (مثل initial أو always) كجزء من عبارة إسناد.
ينتظر تأخير التعيين (assignment delay) لوقت محدد، ثم ينفذ عملية التعيين (assignment). يتم وضع التأخير بعد الرمز # و قبل التعيين.
الصياغة (Syntax):
variable = #delay expression;على عكس التأخير العام #10 a = b; (تأخير ثم تعيين)، فإن تأخير التعيين a = #10 b; يأخذ قيمة b في تلك اللحظة، وينتظر 10 وحدات زمنية، ثم يعينها إلى a.
Assignment Delay مقابل General Delay
| General Delay | Assignment Delay | |
|---|---|---|
| بناء الجملة (Syntax) | #10 a = b; | a = #10 b; |
| متى يتم قراءة القيمة؟ | في وقت التعيين (after delay) | فوراً (قبل delay) |
| ما هي القيمة التي يتم تعيينها؟ | قيمة b في تلك اللحظة | قيمة b في الوقت 0 (أو وقت القراءة) |
| متى يتم تعيين القيمة؟ | بعد delay | بعد delay |
مثال: الفرق
initial begin
b = 1;
#5 b = 0;
// تأخير عام
#10 a1 = b; // ينتظر 10، ثم يقرأ b (b=0) → a1=0
// تأخير التعيين
a2 = #10 b; // يقرأ b الآن (b=0)، ينتظر 10، ثم يعين → a2=0
endكلاهما يعطي نفس الـ result هنا. يظهر الفرق عندما تتغير b أثناء الـ delay.
مثال على الفرق الرئيسي
To show b changing during the delay, we need two separate initial blocks that run in parallel:
initial begin
b = 1;
a1 = #10 b; // يقرأ b=1 في الوقت 0، ويعين a1=1 في الوقت 10
end
initial begin
#5 b = 0; // يغير b إلى 0 في الوقت 5 (أثناء التأخير)
end- في الوقت 0:
a1يقرأb = 1 - في الوقت 5: يتغير
bإلى0(بينما لا يزالa1ينتظر) - في الوقت 10: يتم تعيين
1إلىa1(القيمة التي تم قراءتها في الوقت 0)، وليس0
مع التأخير العام #10 a2 = b; في كتل مفصلة، سيتم قراءة b في الوقت 10 (القيمة 0).
قواعد مهمة
| القاعدة | الشرح |
|---|---|
= يأتي قبل # | a = #10 b; وليس a #10 = b; |
| قراءة القيمة يتم فوراً | يتم تقييم الجانب الأيمن على الفور |
| الإسناد يحدث بعد التأخير | الجانب الأيسر يحصل على القيمة لاحقاً |
| فقط للكتل الإجرائية | يُستخدم في initial أو always |
التحدي
ما يجب فعله:
أضف تأخير الـ assignment المفقود بحيث تحصل a على قيمة b بعد 15 وحدة time، لكن تقرأ b فوراً.
جرّب بنفسك
module assignment_challenge;
reg a, b;
// كتلة منفصلة لتغيير b أثناء التأخير
initial begin
b = 1;
// TODO: أضف تأخير التعيين
// يجب أن يحصل a على b بعد 15 وحدة زمنية
// اقرأ b الآن، عيّن بعد التأخير
end
initial begin
#5 b = 0; // يغيّر b أثناء التأخير
#20 $display("Time %0t: a = %b", $time, a);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية13التوقيت والتأخيرات
ما هي التأخيراتتأخيرات البواباتتأخيرات التعيينتوجيه Timescaleتوليد الساعةمراجعة - التحكم في التوقيت5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة