Menu
CoddyTech

הצהרת case

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

הצהרת case מאפשרת לך לבחור בין פעולות רבות ושונות על סמך הערך של ביטוי יחיד. היא חלופה מסודרת יותר למספר הצהרות if-else כשמשווים את אותו משתנה לערכים רבים ושונים.

ההוראה case משווה ביטוי לרשימת ערכים ומבצעת את הבלוק התואם. היא דומה להסתעפות מרובת אפשרויות.

תחביר:

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

מומלץ מאוד לכלול תמיד default בהוראת case קומבינטורית. ללא default, אם sel מקבל ערך שאף אחד מפריטי ה־case אינו מציין, לא מתבצעת השמה ל־out והוא שומר על ערכו הקודם. כאשר לערך של sel המורכב רק מביטי 0 ו־1 אין ענף מתאים, הסינתזה בונה רכיב זיכרון לא מכוון (latch) במקום לוגיקה קומבינטורית טהורה. גם X או Z ב־sel משאירים את out ללא שינוי בסימולציה, אך אינם יוצרים רכיב latch.

דוגמה פשוטה

case (sel)
  2'b00: out = a;
  2'b01: out = b;
  2'b10: out = c;
  default: out = 0;
endcase

אם sel הוא 00, out מקבל את a. אם sel הוא 01, out מקבל את b. אם sel הוא 10, out מקבל את c.

אחרת, out מקבל 0.

כמה פקודות לכל מקרה

השתמשו ב-begin וב-end עבור כמה פקודות:

case (state)
  2'b00: begin
    out = a;
    flag = 1;
  end
  2'b01: begin
    out = b;
    flag = 0;
  end
  default: out = 0;
endcase

כללים חשובים

כללהסבר
ערכי case צריכים להיות ייחודייםכשיש כפילויות, רק הענף התואם הראשון מתבצע
הערכים צריכים להתאים לרוחב הביטיםיש לכתוב 2'b01, ולא 1'b1 (ערך קצר יותר מרופד באפסים)
default הוא אופציונלי, אך מומלץתופס ערכים ללא מיפוי
בלי default, ערכים ללא מיפוי גורמים לנעילותבלוגיקה קומבינטורית

Case לעומת If-Else

 CaseIf-Else
מתאים ביותר ל־משתנה אחד, ערכים רביםתנאים מורכבים
קריאותברור מאודעלול להפוך למסורבל
דוגמהמרבב, מפענחמשווה, בדיקות טווח
challenge icon

אתגר

השלמת משפט case

מה צריך לעשות:

הוסף את משפט ה-case החסר כדי שהמרבב הזה יפעל.

איך זה עובד:

  • כאשר select = 2'b00, result = in0
  • כאשר select = 2'b01, result = in1
  • כאשר select = 2'b10, result = in2
  • כאשר select = 2'b11, result = in3

נסו בעצמכם

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: הוסף פקודת case
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // default -> result = 0
  end
  
endmodule
quiz iconבחנו את עצמכם

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

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

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