Menu
CoddyTech

تأخيرات البوابات

جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 68 من 90.

في الدرس السابق، تناولنا التأخيرات العامة المستخدمة مثل #10 a = b;. فهي تنتظر قبل تنفيذ تعليمة.

في هذا الدرس، سنتناول تأخيرات البوابات، وهي خاصة بالبوابات الأساسية المضمّنة مثل and وor وnot. تحاكي مدة تأخير البوابة الوقت الذي تستغرقه بوابة عتادية لإنتاج خرج بعد تغيّر مدخلاتها.

في العتاد الحقيقي، لا تستجيب البوابات فورًا. يوجد تأخير صغير. عند استخدام بدائيات البوابات المضمنة، يمكنك إضافة تأخير لمحاكاة زمن انتشار البوابة. لا يتغير الخرج إلا بعد التأخير المحدد.

الفرق بين التأخير العام وتأخير البوابة

 التأخير العامتأخير البوابة
الصياغة#10 a = b;and #5 (out, a, b);
الموضع# قبل العبارة# داخل العنصر الأولي للبوابة
الغرضالانتظار قبل التنفيذنمذجة زمن انتشار البوابة

الصياغة:

gate_type #(delay) (output, input1, input2, ...);

تحدد #(delay) عدد وحدات الزمن التي تستغرقها البوابة للاستجابة.

مثال بسيط

and #5 (out, a, b);

تغيّر بوابة AND خرجها بعد 5 وحدات زمنية من تغيّر a أو b.

تأخير البوابة مع مدخلات متعددة

nand #8 (out, a, b, c, d);   // بوابة NAND بأربعة مداخل مع تأخير قدره 8 وحدات زمنية

قواعد مهمة

القاعدةالتوضيح
يأتي التأخير بعد اسم البوابةand #5 (out, a, b)
قيمة التأخير بوحدات الزمناستنادًا إلى توجيه timescale
تؤثر جميع المدخلات في الخرجيمكن أن يؤدي التغيير في أي مدخل إلى تغيير الخرج، ولكن بعد التأخير فقط
غير قابل للتصنيعتأخيرات البوابات مخصصة للمحاكاة فقط
challenge icon

التحدي

أضف تأخيرات البوابات الناقصة إلى هذه الوحدة. استخدم تأخيرات مختلفة لكل بوابة.

ما عليك فعله:

  1. بوابة AND: تأخير بمقدار 5 وحدات زمنية
  2. بوابة OR: تأخير بمقدار 3 وحدات زمنية
  3. بوابة NOT: تأخير بمقدار وحدتين زمنيتين

جرّب بنفسك

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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات

تدرّب بنفسك: مترجم Verilog عبر الإنترنت