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

جملة 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

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

التحدي

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

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

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