عبارة Case
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 55 من 90.
تتيح لك تعليمة case statement الاختيار بين العديد من الإجراءات المختلفة استنادًا إلى قيمة expression واحدة. وهي بديل أكثر وضوحًا عن عبارات 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 بقيمته السابقة. وينشئ هذا ذاكرة غير مقصودة (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 فريدة | عند وجود قيم مكررة، يُنفَّذ الفرع المطابق الأول فقط |
| يجب أن تتطابق القيم مع عرض البتات | 2'b01 وليس 1'b1 |
default اختياري لكنه موصى به | يلتقط القيم غير المعينة |
من دون default، تتسبب القيم غير المعينة في إنشاء مزاليج | في المنطق التوافقي |
Case مقابل If-Else
| Case | If-Else | |
|---|---|---|
| الأفضل لـ | متغير واحد، وقيم متعددة | شروط معقدة |
| سهولة القراءة | واضحة جدًا | قد تصبح فوضوية |
| مثال | مُبدِّل متعدد الإرسال، وفك التشفير | مقارن، وفحوصات النطاق |
التحدي
إكمال عبارة case
ما يجب فعله:
أضف عبارة case المفقودة لجعل هذا المُعدِّد يعمل.
كيفية عمله:
- عندما تكون
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العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت