Menu
Coddy logo textTech

תזמון המעברים

חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 81 מתוך 90.

challenge icon

אתגר

בשיעור הזה תוסיפו את לוגיקת המונה שקובעת כמה זמן כל אור נשאר דולק. המונה סופר לאחור מערך מוגדר מראש עד לאפס, ואז מפעיל את שינוי המצב הבא.

דרישות התזמון

מצבמשךערך המונה
ירוק30 שניות30
צהוב10 שניות10
אדום40 שניות40

איך המונה פועל

  1. כשהמצב מתחיל, המונה נטען בערך משך הזמן
  2. בכל פעימת שעון, ערך המונה קטן ב־1
  3. כשהמונה מגיע ל־0, הגיע הזמן לעבור למצב הבא

המשימה שלכם היא להוסיף את לוגיקת המונה החסרה למכונת המצבים. קלט next מהשלב הקודם כבר אינו בשימוש: המונה קובע עכשיו מתי המצב משתנה, וסביבת הבדיקה כבר לא מניעה את next.

מה לעשות:

  1. הסירו את input next, מכותרת המודול והחליפו את התנאי else if (next) בלוגיקת המונה שלהלן
  2. הוסיפו הצהרה reg [5:0] counter (השאירו אותה אם כבר הצהרתם עליה בשלב הראשון)
  3. בעת איפוס, הגדירו את counter ל־0
  4. כאשר counter == 0:
    • טענו למונה את משך הזמן של המצב הבא
    • עברו למצב הבא
  5. אחרת, הפחיתו את המונה ב־1 בכל פעימת שעון

נסו בעצמכם

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

  reg [1:0] state;
  // TODO: להצהיר על אוגר counter (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: להגדיר את counter ל-0
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: לטעון את counter עבור אור צהוב (10 שניות)
            
          end
          1: begin
            state <= 2;
            // TODO: לטעון את counter עבור אור אדום (40 שניות)
            
          end
          2: begin
            state <= 0;
            // TODO: לטעון את counter עבור אור ירוק (30 שניות)
            
          end
        endcase
      end else begin
        // TODO: להפחית את counter ב-1
        
      end
    end
  end

endmodule

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: קומפיילר Verilog אונליין