جملة Case
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 55 من 90.
تتيح لك عبارة case الاختيار بين العديد من الإجراءات المختلفة بناءً على قيمة تعبير واحد. وتعتبر بديلاً أنظف لعبارات if-else المتعددة عند مقارنة المتغير نفسه بعدة قيم مختلفة.
تُقارن عبارة case بين expression وقائمة من القيم وبتنفذ الكتلة المتطابقة. هي بتشتغل زي فرع متعدد الاتجاهات.
الصياغة:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseيُنصح بشدة بتضمين <strong>default</strong> دائمًا في عبارة <strong>case</strong> التجميعية. من دون default، إذا أخذ sel قيمة غير متوقعة (مثل X أو Z)، فلن يتم تعيين قيمة لـ out وسوف يحتفظ بقيمته السابقة (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.
عبارات متعددة لكل حالة Case
استخدم 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 اختيارية ولكن يوصى بها | تلتقط القيم غير المخططة (unmapped values) |
بدون default، تتسبب القيم غير المخططة في إنشاء latches | في المنطق التجميعي (combinational logic) |
Case مقابل If-Else
| Case | If-Else | |
|---|---|---|
| الأفضل لـ | متغير واحد، قيم متعددة | شروط معقدة |
| إمكانية القراءة | واضحة جداً | قد تصبح غير مرتبة |
| مثال | Multiplexer، decoder | Comparator، فحص النطاقات |
التحدي
أكمل جملة Case
ما يجب فعله:
أضف جملة case المفقودة لجعل هذا المبدل (multiplexer) يعمل.
كيف يعمل:
- عندما يكون
select = 2'b00، فإنresult = in0 - عندما يكون
select = 2'b01، فإنresult = in1 - عندما يكون
select = 2'b10، فإنresult = in2 - عندما يكون
select = 2'b11، فإنresult = in3
جرّب بنفسك
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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة