הצהרת 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
| Case | If-Else | |
|---|---|---|
| מתאים ביותר ל־ | משתנה אחד, ערכים רבים | תנאים מורכבים |
| קריאות | ברור מאוד | עלול להפוך למסורבל |
| דוגמה | מרבב, מפענח | משווה, בדיקות טווח |
אתגר
השלמת משפט 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השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגייםאופרטורי צמצוםאופרטורי הזזהאופרטור שרשוראופרטור תנאיסיכום – אתגר האופרטורים3שיטת המספרים
ייצוג בינארימספרים בעלי גודל מוגדרמספרים ללא גודל מוגדרמספרים שלילייםהערכים המיוחדים X ו־Zסיכום – תבניות מספרים6מודולים
מבנה מודוליציאות קלט ופלטיציאות קלט-פלטיצירת מופע של מודולמיפוי יציאות לפי שםמיפוי יציאות לפי סדרסיכום – בניית מודולתרגלו בעצמכם: קומפיילר Verilog אונליין