Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

المعامل الشرطي

جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 28 من 90.

يحدد العامل الشرطي ? : بين قيمتين بناءً على شرط معين. يُطلق عليه أيضًا اسم العامل الثلاثي (ternary operator). يقوم العامل الشرطي بتقييم شرط ما ويرجع إحدى القيمتين:

condition ? value_if_true : value_if_false

إذا كانت الـ condition صحيحة (1)، يتم إرجاع القيمة الأولى. وإذا كانت خاطئة (0)، يتم إرجاع القيمة الثانية.

لماذا نستخدم المعامل الشرطي (Conditional Operator)

إنها طريقة مدمجة لكتابة منطق if-else البسيط في خط واحد. تشمل الاستخدامات الشائعة ما يلي:

  • الاختيار بين إشارتين
  • إنشاء المبدلات (multiplexers)
  • تعيين القيم الافتراضية
  • التعيينات الشرطية المضمنة (Inline)

Bases and Examples

مثال أساسي:

result = (a > b) ? a : b;   // result يحصل على الأكبر من a و b

اختر بين القيم:

data_out = (enable) ? data_in : 8'b00000000;   // Output data if enabled, else 0

عكس signal بشكل conditionally:

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

معاملات الشروط المتداخلة (Nested Conditional Operators)

يمكنك دمج معاملات الشروط داخل بعضها البعض (تداخلها) للاختيار من بين خيارات متعددة:

result = (a > b) ? a : (b > c) ? b : c;   // a إذا كان a > b، وإلا الأكبر بين b و c

إستخدم الأقواس لجعل الشروط المتداخلة واضحة.

ملاحظات مهمة

  • يجب أن تكون الـ condition بتًا واحدًا (أو تعبيرًا يتم تقييمه إلى 0 أو 1)
  • حافظ على كلاً من خياري الـ values بنفس عرض البتات (bit width) — إذا اختلفا، ستقوم 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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات