عبارة Case
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 55 من 90.
تتيح لك عبارة case الاختيار بين العديد من الإجراءات المختلفة بناءً على قيمة تعبير واحد. وهي بديل أكثر وضوحًا من استخدام عبارات if-else متعددة عند مقارنة المتغير نفسه بالعديد من القيم المختلفة.
تقارن عبارة case تعبيرًا بقائمة من القيم وتنفّذ الكتلة المطابقة. وهي تشبه التفرع متعدد المسارات.
الصياغة:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcaseيوصى بشدة بتضمين default دائمًا في عبارة case توافقية. من دون default، إذا أخذت sel قيمةً لا يسردها أي بند في case، فلن تُسنَد قيمة إلى out وستحتفظ بقيمتها السابقة. عندما لا يكون لقيمة sel المكوّنة من بتات 0 و1 فقط فرعٌ مطابق، ينشئ التوليف ذاكرة غير مقصودة (مزلاج) بدلًا من منطق توافقي صرف. كما أن وجود X أو Z في sel يترك out دون تغيير في المحاكاة، لكنه لا ينشئ مزلاجًا.
مثال بسيط
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قواعد مهمة
| القاعدة | التفسير |
|---|---|
| ينبغي أن تكون قيم الحالات فريدة | عند وجود قيم مكررة، يُنفَّذ الفرع المطابق الأول فقط |
| ينبغي أن تتوافق القيم مع عرض البتات | اكتب 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 عبر الإنترنت