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

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

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

challenge icon

التحدي

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

متطلبات التوقيت

الحالةالمدةقيمة العداد
Green30 ثانية30
Yellow10 ثوانٍ10
Red40 ثانية40

كيف يعمل العداد

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

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

ما يجب القيام به:

  1. أضف تصريح reg [5:0] counter
  2. عند إعادة الضبط (reset)، اضبط counter على 0
  3. عندما يكون counter == 0:
    • قم بتحميل مدة الحالة التالية في العداد
    • انتقل إلى الحالة التالية
  4. خلاف ذلك، قم بإنقاص العداد بمقدار 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

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