تأخيرات الإسناد
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 69 من 90.
في الدروس السابقة، تناولنا التأخيرات العامة (#10 a = b;) وتأخيرات البوابات (and #5 (out, a, b);). أما الآن، فسنتناول تأخيرات الإسناد، وهي تأخيرات تحدث داخل كتلة إجرائية (مثل initial أو always) كجزء من عبارة إسناد.
ينتظر delay الخاص بـ assignment مدةً محددة من time، ثم ينفّذ assignment. يوضع delay after الرمز # وقبل assignment.
البنية النحوية:
variable = #delay expression;على عكس تأخير عام #10 a = b; (تأخير ثم assign)، فإن تأخير assignment a = #10 b; يأخذ قيمة b في تلك اللحظة، وينتظر 10 من وحدات time، ثم يعيّنها إلى a.
Assignment التأخير مقابل General التأخير
| General التأخير | Assignment التأخير | |
|---|---|---|
| البنية | #10 a = b; | a = #10 b; |
| متى تتم قراءة القيمة؟ | عند time التعيين (after delay) | فورًا (قبل delay) |
| ما القيمة التي يتم تعيينها؟ | قيمة b في تلك اللحظة | قيمة b عند time 0 (أو وقت القراءة) |
| متى يتم تعيين القيمة؟ | after delay | after 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كلاهما يعطي النتيجة نفسها هنا. يظهر الفرق عندما تتغير b أثناء التأخير.
مثال على الفرق الرئيسي
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- عند time 0: يقرأ
a1القيمةb = 1 - عند time 5: تتغير
bإلى0(بينما لا يزالa1في حالة انتظار) - عند time 10: يتم إسناد
1إلىa1(القيمة التي تمت قراءتها عند time 0)، وليس0
مع تأخير General #10 a2 = b; في Separate block، ستتم قراءة b عند time 10 (القيمة 0).
قواعد مهمة
| القاعدة | الشرح |
|---|---|
= يأتي قبل # | a = #10 b; وليس a #10 = b; |
| تتم قراءة القيمة فورًا | يتم تقييم الجانب الأيمن على الفور |
| يحدث Assignment بعد delay | يحصل الجانب الأيسر على القيمة لاحقًا |
| فقط لكتل block الإجرائية | يُستخدم في initial أو always |
التحدي
ما يجب فعله:
أضف تأخير assignment المفقود بحيث a gets قيمة b after 15 time units، لكنه reads 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العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية13التوقيت والتأخيرات
ما هي التأخيراتتأخيرات البواباتتأخيرات الإسنادتوجيه Timescaleتوليد الساعةمراجعة - التحكم في التوقيت5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت