المعامل الشرطي
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 28 من 90.
يختار العامل الشرطي ? : بين قيمتين بناءً على شرط. ويُسمى أيضًا العامل الثلاثي. يقيّم العامل الشرطي شرطًا ويُرجع إحدى قيمتين:
condition ? value_if_true : value_if_falseإذا كان الشرط صحيحًا (1)، تُعاد القيمة الأولى. وإذا كان خاطئًا (0)، تُعاد القيمة الثانية.
لماذا نستخدم العامل الشرطي
إنه طريقة موجزة لكتابة منطق بسيط من نوع if-else في سطر واحد. تشمل الاستخدامات الشائعة ما يلي:
- الاختيار بين إشارتين
- إنشاء مُبدِّلات متعددة الإرسال
- تعيين القيم الافتراضية
- إسنادات شرطية مضمنة
البنية النحوية والأمثلة
مثال أساسي:
result = (a > b) ? a : b; // تُسند إلى result القيمة الأكبر بين a و bاختر بين القيم:
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استخدم الأقواس لجعل الشروط المتداخلة واضحة.
ملاحظات مهمة
- يُعامَل الشرط على أنه صحيح عندما يُقيَّم إلى قيمة غير صفرية (معروفة)
- اجعل عرض البتات لخيارَي القيمة متماثلًا؛ فإذا اختلفا، يوسّع 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت