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

جملة Case

جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 55 من 90.

تسمح لك جملة case بالاختيار بين العديد من الإجراءات المختلفة بناءً على قيمة تعبير واحد. وهي بديل أكثر تنظيماً لجمل if-else المتعددة عند مقارنة نفس المتغير بالعديد من القيم المختلفة.

تقوم جملة case بمقارنة تعبير بمجموعة من القيم وتنفذ الكتلة البرمجية المطابقة. وهي تشبه التفرع متعدد المسارات.

الصيغة البرمجية:

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

يوصى بشدة بتضمين <strong>default</strong> دائمًا في جملة <strong>case</strong> تركيبية (combinational). بدون 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 فريدةلا توجد قيم مكررة
يجب أن تتطابق القيم مع عرض البتات (bit width)2'b01 وليس 1'b1
default اختياري ولكن يوصى بهيلتقط القيم غير المحددة
بدون default، تتسبب القيم غير المحددة في حدوث latchesفي المنطق التوافقي (combinational logic)

Case مقابل If-Else

 CaseIf-Else
الأفضل لـمتغير واحد، قيم متعددةشروط معقدة
سهولة القراءةواضحة جداًيمكن أن تصبح فوضوية
مثالMultiplexer، decoderComparator، فحص النطاق (range checks)
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

ورقة مرجعية

تختار جملة case بين إجراءات متعددة بناءً على تعبير واحد — وهي بديل أنظف لسلسلة if-else المتصلة.

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

بالنسبة للجمل المتعددة لكل فرع، استخدم begin/end:

case (sel)
  2'b00: out = a;
  2'b01: begin
    out = b;
    flag = 1;
  end
  default: out = 0;
endcase

قم دائمًا بتضمين default في المنطق التوافقي (combinational logic). بدونها، تتسبب القيم غير المتطابقة (مثل X و Z) في احتفاظ المخرج بقيمته السابقة، مما يؤدي إلى إنشاء latch (مزلاج) غير مقصود.

القواعد الأساسية:

  • يجب أن تكون جميع قيم case فريدة
  • يجب أن تتطابق القيم مع عرض البتات (bit width) للتعبير (على سبيل المثال، 2'b01، وليس 1'b1)
  • استخدم case لمتغير واحد مقابل قيم متعددة؛ واستخدم if-else للشروط المعقدة أو التي تعتمد على نطاقات (ranges)

جرّب بنفسك

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اختبر نفسك

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

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