ربط المنافذ بالترتيب
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 35 من 90.
في الدرس السابق، تعلمت عن ربط المنافذ بالاسم (port mapping by name)، حيث قمت بتسمية كل توصيلة صراحة باستخدام .port(signal). الآن سنغطي الطريقة البديلة: ربط المنافذ بالترتيب (port mapping by order).
يقوم بتوصيل الـ `signals` بـ `ports` الموديول بناءً على **الترتيب** (`order`) الذي تظهر به في تعريف الموديول. كل ما عليك فعله هو إدراج الـ `signals` بين أقواس، وسيقوم Verilog بالمطابقة بينها واحداً تلو الآخر.
Syntax:
module_name instance_name (signal1, signal2, signal3);يتصل الإشارة الأولية بالمنفذ الأول، والثانية بالمنفذ الثاني، وهكذا.
مثال
تعريف الـ module:
module or_gate (
input in1, // المنفذ الأول
input in2, // المنفذ الثاني
output result // المنفذ الثالث
);
assign result = in1 | in2;
endmoduleInstantiation مع port mapping حسب order:
or_gate or1 (input_a, input_b, output_y);هذا يقوم بتوصيل:
- الإشارة الأولى (
input_a) ← المنفذ الأولin1 - الإشارة الثانية (
input_b) ← المنفذ الثانيin2 - الإشارة الثالثة (
output_y) ← المنفذ الثالثresult
Order Matters
مع تعيين `port` حسب `order` (الترتيب)، الترتيب أمر حاسم:
// الترتيب الصحيح
or_gate or1 (input_a, input_b, output_y);
// ترتيب خاطئ - الإشارات متصلة بالمنافذ الخاطئة!
or_gate or1 (input_b, input_a, output_y);
or_gate or1 (output_y, input_a, input_b);إذا قمت بالخلط في الـ `order`، فإن الـ `connections` ستنتقل إلى الـ `ports` الـ `wrong`. قد يكون من الصعب تصحيح أخطاء هذا الأمر لأن الكود يبدو `correct` للوهلة الأولى.
تعيين المنافذ بالحجم (By Name) مقابل الترتيب (By Order)
| الميزة | بالاسم (By Name) | بالترتيب (By Order) |
|---|---|---|
| الـ Syntax | .port(signal) | signal1, signal2 |
| هل الترتيب مهم؟ | لا | نعم |
| توضيح ذاتي؟ | نعم | لا |
| خطر الأخطاء | منخفض | عالي |
| موصى به لـ | معظم التصاميم | الحالات البسيطة فقط |
متى تستخدم ربط المنافذ حسب الترتيب (Port Mapping By Order)
يكون ربط المنافذ حسب الترتيب مقبولاً عندما:
- يحتوي الـ
moduleعلى عدد قليل جداً من الـports(2-3) - يكون ترتيب المنافذ واضحاً ومن غير المرجح أن يتغير
- تكون بصدد كتابة بيئات اختبار (testbenches) سريعة
بالنسبة لمُعظم التصاميم، يُفضّل ربط المنافذ (port mapping) بالاسم لأنه أكثر وضوحًا وأقل عرضة للأخطاء.
التحدي
أكمل عملية التعيين (instantiation) بسرد إشارات الـ signals بالترتيب الصحيح correct order باستخدام التعيين حسب الترتيب (port mapping by order).
ما يجب القيام به:
منافذ وحدة الـ Module (بهذا الترتيب):
input en(التفعيل)input [7:0] d(إدخال البيانات)output [7:0] q(إخراج البيانات)
الإشارات للربط:
enable_signal← ربط بـendata_input← ربط بـddata_output← ربط بـq
جرّب بنفسك
module register (
input en,
input [7:0] d,
output [7:0] q
);
assign q = en ? d : q;
endmodule
module top (
input enable_signal,
input [7:0] data_input,
output [7:0] data_output
);
// TODO: أنشئ مثيلاً لـ register باسم reg1 باستخدام ORDER mapping
// اسرد الإشارات بالترتيب الصحيح: enable_signal, data_input, data_output
// لا تستخدم صيغة .port(signal)
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة