المعامل الشرطي
جزء من قسم الأساسيات في رحلة 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)
التحدي
اكتب التعبيرات الشرطية الصحيحة لكل مهمة.
ما يجب القيام به:
- قم بتعيين
maxإلى القيمة الأكبر بينxوy - قم بتعيين
absإلى القيمة المطلقة لـval(إذا كانت سالبة، اجعلها موجبة) - قم بتعيين
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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة