Menu
Coddy logo textTech

אופרטור תנאי

חלק מהיחידה יסודות במסלול ה-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)
challenge icon

אתגר

כתוב את הביטויים התנאים הנכונים לכל משימה.

מה לעשות:

  1. הגדר את max כגדול מבין x ו־y
  2. הגדר את abs כערך המוחלט של val (אם הוא שלילי, הפוך אותו לחיובי)
  3. הגדר את 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
quiz iconבחנו את עצמכם

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

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

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