Menu
CoddyTech

عبارة 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

 CaseIf-Else
الأنسب لـمتغير واحد، وقيم متعددةالشروط المعقدة
سهولة القراءةواضح جدًاقد يصبح مربكًا
مثالمبدّل متعدد الإرسال، مفكّك ترميزمقارن، فحوصات النطاق
challenge icon

التحدي

أكمل تعليمة 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات

تدرّب بنفسك: مترجم Verilog عبر الإنترنت