Menu
Coddy logo textTech

לוגיקת מכונת המצבים

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

challenge icon

אתגר

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

לוגיקת מכונת המצבים שולטת מתי ואיך הרמזור משנה מצבים.

רצף המצבים

ירוק → צהוב → אדום → ירוק → …

המשימה שלך היא להוסיף את לוגיקת מכונת המצבים למודול.

בשלב הזה אות קלט חדש, next, מפעיל כל שינוי; מונה התזמון יתווסף בשלב הבא. השאר את כל מה שכתבת בשלב הקודם (אוגר state, ההצהרה הלא־בשימוש של counter ובלוק הפלט always @(*)).

מה לעשות:

  1. הוסף לממשק המודול, אחרי reset, יציאת קלט של 1 ביט בשם next: input next,. סביבת הבדיקה מפעילה אותו בפולס כדי לבקש את המצב הבא
  2. הוסף בלוק always @(posedge clk or posedge reset)
  3. בעת איפוס, הגדר את state לאדום (2)
  4. כאשר next הוא 1, עבור למצב הבא:
    • אם המצב הוא ירוק (0): שנה לצהוב
    • אם המצב הוא צהוב (1): שנה לאדום
    • אם המצב הוא אדום (2): שנה לירוק

נסו בעצמכם

module traffic_light (
  input clk,
  input reset,
  input next,           // אות להפעלת שינוי מצב
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;

  // השמות לפלטים
  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

  // TODO: הוסף לוגיקה של מכונת מצבים (ללא תזמון)
  // always @(posedge clk or posedge reset) begin
  //   if (reset) begin
  //     state <= 2;
  //   end else if (next) begin
  //     case (state)
  //       0: state <= 1;
  //       1: state <= 2;
  //       2: state <= 0;
  //     endcase
  //   end
  // end

endmodule

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

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