הצהרת case
חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 55 מתוך 90.
הפקודה case מאפשרת לך לבחור בין פעולות רבות ושונות בהתאם לערך של ביטוי יחיד. זוהי חלופה נקייה יותר לשימוש בכמה פקודות if-else כשמשווים את אותו משתנה לערכים רבים ושונים.
הפקודה case משווה ביטוי לרשימת ערכים ומבצעת את הבלוק התואם. היא דומה להסתעפות מרובת אפשרויות.
תחביר:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseמומלץ מאוד לכלול תמיד <strong>default</strong> במשפט <strong>case</strong> קומבינטורי. בלי default, אם sel מקבל ערך בלתי צפוי (כמו X או Z), לא תהיה השמה ל־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 אונליין