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

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

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

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

condition ? value_if_true : value_if_false

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

لماذا نستخدم العامل الشرطي

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

  • الاختيار بين إشارتين
  • إنشاء أجهزة تعدد الإرسال (Multiplexers)
  • تعيين القيم الافتراضية
  • عمليات التعيين الشرطية المضمنة

الصيغة والأمثلة

مثال أساسي:

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

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

data_out = (enable) ? data_in : 8'b00000000;   // إخراج البيانات إذا تم التمكين، وإلا 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;   // العثور على الأكبر من بين ثلاث قيم

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

ملاحظات هامة

  • يجب أن يكون الشرط بتًا واحدًا (أو تعبيرًا يتم تقييمه إلى 0 أو 1)
  • يجب أن يكون لكلا خياري القيمة نفس عرض البتات (bit width)
  • يمكن استخدام العامل في التعيينات المستمرة (assign) والكتل الإجرائية (always، initial)
challenge icon

التحدي

اكتب التعبيرات الشرطية الصحيحة لكل مهمة.

ما يجب القيام به:

  1. قم بتعيين max إلى القيمة الأكبر بين x و y
  2. قم بتعيين abs إلى القيمة المطلقة لـ val (إذا كانت سالبة، اجعلها موجبة)
  3. قم بتعيين output_data إلى data إذا كانت enable تساوي 1، وإلا فقم بتعيينها إلى 8'b0

ورقة مرجعية

يختار العامل الشرطي (الثلاثي) ? : بين قيمتين بناءً على شرط معين:

condition ? value_if_true : value_if_false

أمثلة:

max      = (a > b) ? a : b;                  // الأكبر بين a و b
data_out = (enable) ? data_in : 8'b0;        // إخراج البيانات إذا كان التمكين مفعلاً، وإلا 0
out      = (invert) ? ~in : in;              // عكس الإشارة بشكل مشروط

العوامل الشرطية المتداخلة:

result = (a > b) ? a : (b > c) ? b : c;     // الأكبر بين ثلاث قيم

ملاحظات:

  • يجب أن تكون نتيجة الشرط 0 أو 1
  • يجب أن يكون لكلا خياري القيمة نفس عرض البتات (bit width)
  • يمكن استخدامه في كتل assign و always و initial

جرّب بنفسك

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اختبر نفسك

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

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