אופרטור תנאי
חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 28 מתוך 90.
האופרטור המותנה ? : בוחר בין שני ערכים על סמך תנאי. הוא נקרא גם האופרטור הטרנרי. האופרטור המותנה מעריך תנאי ומחזיר אחד משני ערכים:
condition ? value_if_true : value_if_falseאם התנאי נכון (1), מוחזר הערך הראשון. אם הוא שגוי (0), מוחזר הערך השני.
למה להשתמש באופרטור תנאי
זוהי דרך תמציתית לכתוב לוגיקת if-else פשוטה בשורה אחת. שימושים נפוצים כוללים:
- בחירה בין שני אותות
- יצירת מרבבים
- הגדרת ערכי ברירת מחדל
- השמות מותנות בתוך השורה
תחביר ודוגמאות
דוגמה בסיסית:
result = (a > b) ? a : b; // הערך הגדול מבין a ו-b מוקצה ל-resultבחירה בין ערכים:
data_out = (enable) ? data_in : 8'b00000000; // Output data if enabled, else 0היפוך האות באופן מותנה:
out = (invert) ? ~in : in; // אם invert הוא 1, הפלט הפוך; אחרת הוא נשאר ללא שינוידוגמת קוד
module conditional_demo;
reg [3:0] a, b, max;
reg enable;
reg [3:0] data_in, data_out;
initial begin
a = 4'd7;
b = 4'd9;
enable = 1;
data_in = 4'b1010;
max = (a > b) ? a : b; // 9
data_out = (enable) ? data_in : 4'b0000; // 1010
$display("max = %d", max);
$display("data_out = %b", data_out);
$finish;
end
endmoduleפלט:
max = 9
data_out = 1010אופרטורים תנאיים מקוננים
אפשר לקנן אופרטורים תנאיים כדי לבצע בחירות מרובות:
result = (a > b) ? a : (b > c) ? b : c; // a אם a > b, אחרת הגדול מבין b ו-cהשתמשו בסוגריים כדי להבהיר תנאים מקוננים.
הערות חשובות
- התנאי חייב להיות ביט יחיד (או ביטוי שמחזיר 0 או 1)
- הקפידו שרוחב הביט של שתי אפשרויות הערך יהיה זהה; אם הוא שונה, Verilog מרחיבה בשקט את האפשרות הצרה יותר
- אפשר להשתמש באופרטור בהשמות רציפות (
assign) ובבלוקים פרוצדורליים (always,initial)
אתגר
כתוב את הביטויים התנאים הנכונים לכל משימה.
מה לעשות:
- הגדר את
maxכגדול מביןxו־y - הגדר את
absכערך המוחלט שלval(אם הוא שלילי, הפוך אותו לחיובי) - הגדר את
output_dataל־dataאםenableהוא 1, אחרת ל־8'b0
נסו בעצמכם
module conditional_challenge;
reg [3:0] x, y;
reg [3:0] max;
reg signed [3:0] val;
reg [3:0] abs;
reg enable;
reg [7:0] data;
reg [7:0] output_data;
initial begin
x = 4'd12;
y = 4'd8;
val = -4'sd5;
enable = 1;
data = 8'b10101010;
max = ______; // הגדול מבין x ו-y
abs = ______; // הערך המוחלט של val
output_data = ______; // data אם enable, אחרת 0
$display("max = %d", max);
$display("abs = %d", abs);
$display("output_data = %b", output_data);
$finish;
end
endmoduleהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגייםאופרטורי צמצוםאופרטורי הזזהאופרטור שרשוראופרטור תנאיסיכום – אתגר האופרטורים3שיטת המספרים
ייצוג בינארימספרים בעלי גודל מוגדרמספרים ללא גודל מוגדרמספרים שלילייםהערכים המיוחדים X ו־Zסיכום – תבניות מספרים6מודולים
מבנה מודוליציאות קלט ופלטיציאות קלט-פלטיצירת מופע של מודולמיפוי יציאות לפי שםמיפוי יציאות לפי סדרסיכום – בניית מודולתרגלו בעצמכם: קומפיילר Verilog אונליין