ربط المنافذ بالترتيب
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 35 من 90.
في الدرس السابق، تعلمت عن ربط المنافذ بالاسم، حيث تقوم بتسمية كل اتصال صراحةً باستخدام .port(signal). الآن سنغطي الطريقة البديلة: ربط المنافذ بالترتيب.
يقوم بتوصيل الإشارات بمنافذ الوحدة (module) بناءً على الترتيب الذي تظهر به في تعريف الوحدة. ما عليك سوى سرد الإشارات بين قوسين، وسيقوم Verilog بمطابقتها واحدة تلو الأخرى.
الصيغة:
module_name instance_name (signal1, signal2, signal3);تتصل الإشارة الأولى بالمنفذ الأول، والثانية بالمنفذ الثاني، وهكذا.
مثال
تعريف الوحدة:
module or_gate (
input in1, // المنفذ الأول
input in2, // المنفذ الثاني
output result // المنفذ الثالث
);
assign result = in1 | in2;
endmoduleإنشاء مثيل مع ربط المنافذ حسب الترتيب:
or_gate or1 (input_a, input_b, output_y);هذا يربط:
- الإشارة الأولى
input_a← المنفذ الأولin1 - الإشارة الثانية
input_b← المنفذ الثانيin2 - الإشارة الثالثة
output_y← المنفذ الثالثresult
الترتيب مهم
مع تعيين المنافذ حسب الترتيب، يكون التسلسل أمراً بالغ الأهمية:
// الترتيب الصحيح
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);إذا أخطأت في الترتيب، فستذهب الاتصالات إلى المنافذ الخاطئة. قد يكون من الصعب تصحيح هذا الخطأ لأن الكود يبدو صحيحاً للوهلة الأولى.
ربط المنافذ بالاسم مقابل الترتيب
| الميزة | بالاسم | بالترتيب |
|---|---|---|
| بناء الجملة | .port(signal) | signal1, signal2 |
| هل الترتيب مهم؟ | لا | نعم |
| هل يوثق نفسه بنفسه؟ | نعم | لا |
| خطر الوقوع في أخطاء | منخفض | عالي |
| موصى به لـ | معظم التصاميم | الحالات البسيطة فقط |
متى يتم استخدام تعيين المنافذ حسب الترتيب
يكون تعيين المنافذ حسب الترتيب مقبولاً عندما:
- تحتوي الوحدة (module) على عدد قليل جداً من المنافذ (2-3)
- يكون ترتيب المنافذ واضحاً ومن غير المرجح أن يتغير
- تقوم بكتابة منصات اختبار (testbenches) سريعة
بالنسبة لمعظم التصاميم، يُفضل ربط المنافذ بالاسم لأنه أكثر وضوحاً وأقل عرضة للخطأ.
التحدي
أكمل عملية الاستنساخ (instantiation) من خلال سرد الإشارات في الترتيب الصحيح باستخدام تعيين المنافذ حسب الترتيب.
ما يجب فعله:
منافذ الوحدة (بهذا الترتيب):
input en(تمكين)input [7:0] d(مدخل البيانات)output [7:0] q(مخرج البيانات)
الإشارات المراد توصيلها:
enable_signal← قم بتوصيله بـendata_input← قم بتوصيله بـddata_output← قم بتوصيله بـq
ورقة مرجعية
ربط المنافذ حسب الترتيب يربط الإشارات بناءً على موقعها المطابق لترتيب تعريف منافذ الوحدة:
module_name instance_name (signal1, signal2, signal3);مثال مع وحدة or_gate (المنافذ: in1، in2، result):
or_gate or1 (input_a, input_b, output_y);الترتيب أمر بالغ الأهمية — تبديل الإشارات يؤدي إلى توصيلات خاطئة يصعب تصحيحها.
| الميزة | حسب الاسم | حسب الترتيب |
|---|---|---|
| بناء الجملة (Syntax) | .port(signal) | signal1, signal2 |
| هل الترتيب مهم؟ | لا | نعم |
| خطر الوقوع في الأخطاء | منخفض | عالٍ |
| موصى به لـ | معظم التصاميم | المنافذ البسيطة/القليلة فقط |
جرّب بنفسك
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: قم بإنشاء مثيل للمسجل باسم 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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة