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
| 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logicتدرّب بنفسك: مترجم Verilog عبر الإنترنت