Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Case Statement

جزء من قسم الأساسيات في رحلة 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

 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 عبر الإنترنت