Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Defining The States

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

challenge icon

التحدي

إن وحدة التحكم في إشارة المرور هي آلة حالات منتهية تتنقل بين حالات إضاءة مختلفة (الأحمر، الأصفر، الأخضر) وفق فواصل زمنية محددة. إن آلة الحالات المنتهية (FSM) هي دائرة يمكن أن تكون في واحدة من عدد محدود من الحالات. وتنتقل من حالة إلى أخرى استنادًا إلى المدخلات أو التوقيت.

في هذا المشروع، ستبني وحدة تحكم في إشارة مرور لتقاطع بسيط. تحتوي إشارة المرور على ثلاثة مخارج:

الضوءالمخرجالمعنى
الأحمرred = 1توقف
الأصفرyellow = 1الحذر
الأخضرgreen = 1انطلق

تتتابع الأضواء بهذا الترتيب:

Green → Yellow → Red → Green → …

تسلسل التوقيت

الحالةالمدةالحالة التالية
Green30 ثانيةYellow
Yellow10 ثوانٍRed
Red40 ثانيةGreen

في هذا الدرس، ستعرّف حالات وحدة التحكم في إشارة المرور.

لإشارة المرور ثلاث حالات ممكنة:

الحالةالضوءالرمز
Greenالضوء الأخضر قيد التشغيل2'b00
Yellowالضوء الأصفر قيد التشغيل2'b01
Redالضوء الأحمر قيد التشغيل2'b10

أكمل الوحدة بإضافة الأجزاء المفقودة.

ما يجب فعله:

حدّد ترميز الحالات: 0=Green، 1=Yellow، 2=Red

  1. Declare سجلًا بحجم 2 بت يُسمّى state
  2. Declare سجلًا بحجم 6 بت يُسمّى counter (للتوقيت حتى 40 ثانية)
  3. أضف تعيينات المخرجات داخل كتلة always توافقية، always @(*) begin ... end، مع وجود case (state) داخلها. تم تعريف red وyellow وgreen على أنها output reg، ولا يمكن تعيين reg إلا داخل كتلة من هذا النوع. تعني @(*) أن الكتلة تُشغَّل مجددًا كلما تغيّر أي شيء تقرؤه، وهو هنا state:
    • عندما تكون state هي 0: green = 1، yellow = 0، red = 0
    • عندما تكون state هي 1: green = 0، yellow = 1، red = 0
    • عندما تكون state هي 2: green = 0، yellow = 0، red = 1

جرّب بنفسك

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // TODO: المهمة 1 - تعريف سجل الحالة (2 بت)
  
  // TODO: المهمة 2 - تعريف سجل العداد (6 بت)
  

  // TODO: المهمة 3 - تعيينات المخرجات باستخدام case (state)
  // الحالة 0: green=1, yellow=0, red=0
  // الحالة 1: green=0, yellow=1, red=0
  // الحالة 2: green=0, yellow=0, red=1

endmodule

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

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