جملة Case
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 55 من 90.
تسمح لك جملة case بالاختيار بين العديد من الإجراءات المختلفة بناءً على قيمة تعبير واحد. وهي بديل أكثر تنظيماً لجمل if-else المتعددة عند مقارنة نفس المتغير بالعديد من القيم المختلفة.
تقوم جملة case بمقارنة تعبير بمجموعة من القيم وتنفذ الكتلة البرمجية المطابقة. وهي تشبه التفرع متعدد المسارات.
الصيغة البرمجية:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseيوصى بشدة بتضمين <strong>default</strong> دائمًا في جملة <strong>case</strong> تركيبية (combinational). بدون default، إذا أخذت sel قيمة غير متوقعة (مثل X أو Z)، فلن يتم تعيين قيمة لـ out وستقوم بعمل latch لقيمتها السابقة. يؤدي هذا إلى إنشاء ذاكرة غير مقصودة (latch) بدلاً من المنطق التركيبي الصرف.
مثال بسيط
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcaseإذا كانت sel هي 00، تأخذ out قيمة a. وإذا كانت sel هي 01، تأخذ out قيمة b. وإذا كانت sel هي 10، تأخذ out قيمة c.
خلاف ذلك، سيحصل out على 0.
بيانات متعددة لكل حالة
استخدم begin و end للبيانات المتعددة:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcaseقواعد هامة
| القاعدة | الشرح |
|---|---|
| يجب أن تكون جميع قيم case فريدة | لا توجد قيم مكررة |
| يجب أن تتطابق القيم مع عرض البتات (bit width) | 2'b01 وليس 1'b1 |
default اختياري ولكن يوصى به | يلتقط القيم غير المحددة |
بدون default، تتسبب القيم غير المحددة في حدوث latches | في المنطق التوافقي (combinational logic) |
Case مقابل If-Else
| Case | If-Else | |
|---|---|---|
| الأفضل لـ | متغير واحد، قيم متعددة | شروط معقدة |
| سهولة القراءة | واضحة جداً | يمكن أن تصبح فوضوية |
| مثال | Multiplexer، decoder | Comparator، فحص النطاق (range checks) |
التحدي
أكمل جملة Case
ما يجب فعله:
أضف جملة case المفقودة لجعل هذا المبدل (multiplexer) يعمل.
كيفية العمل:
- عندما يكون
select = 2'b00، فإنresult = in0 - عندما يكون
select = 2'b01، فإنresult = in1 - عندما يكون
select = 2'b10، فإنresult = in2 - عندما يكون
select = 2'b11، فإنresult = in3
ورقة مرجعية
تختار جملة case بين إجراءات متعددة بناءً على تعبير واحد — وهي بديل أنظف لسلسلة if-else المتصلة.
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseبالنسبة للجمل المتعددة لكل فرع، استخدم begin/end:
case (sel)
2'b00: out = a;
2'b01: begin
out = b;
flag = 1;
end
default: out = 0;
endcaseقم دائمًا بتضمين default في المنطق التوافقي (combinational logic). بدونها، تتسبب القيم غير المتطابقة (مثل X و Z) في احتفاظ المخرج بقيمته السابقة، مما يؤدي إلى إنشاء latch (مزلاج) غير مقصود.
القواعد الأساسية:
- يجب أن تكون جميع قيم case فريدة
- يجب أن تتطابق القيم مع عرض البتات (bit width) للتعبير (على سبيل المثال،
2'b01، وليس1'b1) - استخدم
caseلمتغير واحد مقابل قيم متعددة؛ واستخدمif-elseللشروط المعقدة أو التي تعتمد على نطاقات (ranges)
جرّب بنفسك
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: أضف جملة case
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة