Menu
Coddy logo textTech

הגדרת המצבים

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

challenge icon

אתגר

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

בפרויקט הזה תבנו בקר רמזור לצומת פשוט. לרמזור יש שלושה פלטים:

אורפלטמשמעות
אדוםred = 1עצור
צהובyellow = 1זהירות
ירוקgreen = 1סע

האורות מתחלפים לפי הסדר הזה:

Green → Yellow → Red → Green → …

רצף התזמון

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

בשיעור הזה תגדירו את המצבים עבור בקר הרמזור.

לרמזור יש שלושה מצבים אפשריים:

מצבאורקוד
ירוקהאור הירוק דולק2'b00
צהובהאור הצהוב דולק2'b01
אדוםהאור האדום דולק2'b10

השלימו את המודול על ידי הוספת החלקים החסרים.

מה לעשות:

הגדירו קידוד מצבים: 0=ירוק, 1=צהוב, 2=אדום

  1. הצהירו על אוגר בן 2 סיביות בשם state
  2. הצהירו על אוגר בן 6 סיביות בשם counter (לתזמון של עד 40 שניות). הוא לא בשימוש בשלב הזה: לוגיקת התזמון שסופרת באמצעותו תופיע בהמשך הפרויקט, בשלב תזמון המעברים
  3. הוסיפו את השמות הפלט בתוך בלוק always קומבינטורי, always @(*) begin ... end, ובתוכו case (state). red, yellow ו-green מוצהרים כ-output reg, ואפשר להשמות ל-reg רק בתוך בלוק כזה. @(*) פירושו שהבלוק ירוץ שוב בכל פעם שמשתנה ערך כלשהו שהוא קורא, וכאן זהו state:
    • כאשר המצב הוא 0: green = 1, yellow = 0, red = 0
    • כאשר המצב הוא 1: green = 0, yellow = 1, red = 0
    • כאשר המצב הוא 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 אונליין