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

توقيت الانتقالات

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

challenge icon

التحدي

في هذا الدرس، ستضيف منطق الـ counter الذي يتحكم في المدة التي يظل فيها كل ضوء مشتعلًا. يقوم الـ counter بالتنازل من قيمة محددة مسبقًا إلى الصفر، ثم يطلق تغيير الـ state التالي.

متطلبات التوقيت (timing)

Stateالمدةقيمة الـ counter
Green30 seconds30
Yellow10 seconds10
Red40 seconds40

كيف يعمل الـ counter

  1. عندما تبدأ الـ state، يتم تحميل (Load) الـ counter بقيمة المدة
  2. مع كل نبضة ساعة، ينخفض الـ counter بمقدار 1
  3. عندما يصل الـ counter إلى 0، يكون قد حان الوقت للتغيير إلى الـ state التالية

مهمتك هي إضافة منطق الـ counter المفقود إلى آلة الحالات (machine).

ما يجب فعله:

  1. أضف التصريح reg [5:0] counter
  2. عند الـ reset، اضبط counter على 0
  3. عندما يكون counter == 0:
    • قم بتحميل مدة الـ state التالية في الـ counter
    • تغيير إلى الـ state التالية
  4. بخلاف ذلك، قم بإنقاص الـ counter (عملية Decrement) بمقدار 1 في كل نبضة ساعة

جرّب بنفسك

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;
  // TODO: أعلن عن سجل العداد (6 بت)
  

  // تعيينات المخرجات
  always @(*) begin
    case (state)
      0: begin green = 1; yellow = 0; red = 0; end
      1: begin green = 0; yellow = 1; red = 0; end
      2: begin green = 0; yellow = 0; red = 1; end
      default: begin green = 0; yellow = 0; red = 1; end
    endcase
  end

  // آلة الحالة مع التوقيت
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // ابدأ عند الأحمر
      // TODO: عيّن العداد إلى 0
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: حمّل العداد للأصفر (10 ثوانٍ)
            
          end
          1: begin
            state <= 2;
            // TODO: حمّل العداد للأحمر (40 ثانية)
            
          end
          2: begin
            state <= 0;
            // TODO: حمّل العداد للأخضر (30 ثانية)
            
          end
        endcase
      end else begin
        // TODO: أنقص العداد بمقدار 1
        
      end
    end
  end

endmodule

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