Casex و Casez
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 56 من 90.
أحيانًا تهتم فقط بـ بتات معينة في قيمة ما، بينما يمكن تجاهل البتات الأخرى. على سبيل المثال، في مشفر الأولوية (priority encoder)، تريد العثور على أول بت قيمته 1 بغض النظر عن البتات الأخرى.
تتطلب جملة case الاعتيادية منك إدراج كل الاحتمالات الممكنة لبتات don't-care — وهو أمر مستحيل بالنسبة للنواقل (buses) العريضة.
<strong>casez</strong> و <strong>casex</strong> يحلان هذه المشكلة من خلال السماح لك بتمييز بتات معينة كـ "don't care" باستخدام ? أو z أو x.
Casez مقابل Casex مقابل Regular Case
| البيان | بتات عدم الاهتمام (Don't-Care Bits) | الأفضل لـ |
|---|---|---|
case | لا يوجد | المطابقة التامة |
casez | z أو ? | مشفرات الأولوية (موصى به) |
casex | x، z، أو ? | تجنب (يخفي الأخطاء) |
<strong>casez</strong>يتجاهل البتات التي تكونzأو?(موصى به)<strong>casex</strong>يتجاهل أيضاً بتاتx— والتي يمكن أن تخفي أخطاء المحاكاة
استخدم دائماً <strong>casez</strong>، وليس <strong>casex</strong>. تم إنشاء casex أولاً، ولكن المهندسين أدركوا أنه خطير لأنه يتجاهل قيم x (والتي غالباً ما تشير إلى سجلات غير مهيأة أو أخطاء في المحاكاة). تم تقديم casez كبديل أكثر أماناً.
مثال
casez (data)
4'b???1: out = 0; // يجب أن تكون Bit0 هي 1، والبتات الأخرى لا تهم
4'b??1?: out = 1; // يجب أن تكون Bit1 هي 1، والبتات الأخرى لا تهم
4'b?1??: out = 2; // يجب أن تكون Bit2 هي 1، والبتات الأخرى لا تهم
4'b1???: out = 3; // يجب أن تكون Bit3 هي 1، والبتات الأخرى لا تهم
endcaseتعني ? "لا يهم" — يمكن أن يكون ذلك البت 0 أو 1 أو أي شيء.
التحدي
ما يجب القيام به:
أضف جملة casez المفقودة لجعل وحدة فك التشفير (decoder) هذه تعمل.
كيفية العمل:
input = 4'b???1←out = 4'b0001input = 4'b??1?←out = 4'b0010input = 4'b?1??←out = 4'b0100input = 4'b1???←out = 4'b1000- الافتراضي ←
out = 4'b0000
ورقة مرجعية
تسمح casez بمطابقة الأنماط مع بتات "لا يهم" (don't-care bits) باستخدام ? أو z، وهي مفيدة لمشفرات الأولوية (priority encoders) حيث تهم بتات معينة فقط.
| الجملة | بتات "لا يهم" | ملاحظات |
|---|---|---|
case | لا يوجد | مطابقة تامة |
casez | z أو ? | موصى بها |
casex | x، z، أو ? | تجنبها — تخفي الأخطاء البرمجية |
يفضل دائماً استخدام casez على casex. حيث تتجاهل casex قيم x، مما قد يؤدي إلى إخفاء السجلات غير المهيأة أو أخطاء المحاكاة.
casez (data)
4'b???1: out = 0; // Bit0 must be 1, others don't matter
4'b??1?: out = 1; // Bit1 must be 1, others don't matter
4'b?1??: out = 2; // Bit2 must be 1, others don't matter
4'b1???: out = 3; // Bit3 must be 1, others don't matter
default: out = 0;
endcaseتعني ? "لا يهم" (don't care) — أي أن هذا البت يمكن أن يكون 0، 1، أو أي شيء آخر.
جرّب بنفسك
module decoder (
input [3:0] in,
output reg [3:0] out
);
always @(*) begin
// TODO: casez أضف جملة
// in = 4'b???1 -> out = 4'b0001
// in = 4'b??1? -> out = 4'b0010
// in = 4'b?1?? -> out = 4'b0100
// in = 4'b1??? -> out = 4'b1000
// default -> out = 4'b0000
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة