منافذ Inout
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 32 من 90.
إن منفذ inout هو منفذ ثنائي الاتجاه يمكنه إرسال واستقبال الإشارات معاً. ويمكنه العمل كمدخل أو مخرج في أوقات مختلفة.
معظم المنافذ هي إما input (تتدفق البيانات للداخل) أو output (تتدفق البيانات للخارج). يمكن لمنفذ inout القيام بالأمرين معاً — حيث يمكنه إرسال البيانات للخارج أو استقبال البيانات للداخل، حسب الموقف.
فكر في الأمر كأنه شارع ذو اتجاهين بدلاً من طريق ذو اتجاه واحد.
تُستخدم منافذ Inout لـ:
- نواقل مشتركة (Shared buses) — أجهزة متعددة متصلة بنفس الأسلاك
- نواقل بيانات الذاكرة — يمكن قراءة البيانات أو كتابتها
- اتصال ثنائي الاتجاه — I2C، SPI، إلخ.
يقوم جهاز واحد فقط بقيادة الناقل (bus) في المرة الواحدة. يجب أن تكون الأجهزة الأخرى في حالة ممانعة عالية (Z).
تعريف منفذ Inout
inout [7:0] data_bus; // ناقل ثنائي الاتجاه بـ 8 بتات
inout ready; // إشارة ثنائية الاتجاه بت واحدكيفية عمل Inout
يتطلب منفذ inout إشارة تحكم لتحديد ما إذا كان يعمل كمدخل (input) أو مخرج (output):
module bidir (
inout [7:0] bus,
input [7:0] data_out,
input enable,
output [7:0] data_in
);
assign bus = (enable) ? data_out : 8'bZ; // قيادة الناقل (bus) عند التفعيل، وإلا Z
assign data_in = bus; // قراءة الناقل (bus) دائماً
endmodule- عندما يكون
enable = 1، تقوم الوحدة بـ قيادة الناقل (وضع الإخراج) - عندما يكون
enable = 0، تقوم الوحدة بـ تحرير الناقل (وضع الإدخال، high-Z)
قواعد هامة لـ Inout
| القاعدة | السبب |
|---|---|
يجب التصريح عنه كـ wire | لا يمكن أن يكون reg |
| لا يمكن القراءة والكتابة في نفس الوقت | سيؤدي ذلك إلى حدوث تعارض (X) |
استخدم Z لتحرير الممر (bus) | يسمح للأجهزة الأخرى بالقيادة (drive) |
| مشغل واحد فقط في كل مرة | يمنع تعارض الممر (bus contention) |
Inout مقابل Input مقابل Output
| نوع المنفذ | الاتجاه | يمكنه القيادة | يمكنه القراءة |
|---|---|---|---|
input | اتجاه واحد (دخول فقط) | لا | نعم |
output | اتجاه واحد (خروج فقط) | نعم | لا |
inout | اتجاهين (كلاهما) | نعم (عند التفعيل) | نعم (دائماً) |
خطأ شائع
// خطأ: لا يمكن التعيين لـ inout داخل كتلة always
always @(posedge clk) begin
data_bus <= something; // خطأ! استخدم assign مع شرط
end// صحيح: استخدم assign مع شرط التمكين (enable)
assign data_bus = (enable) ? something : 8'bZ;التحدي
أضف منفذ inout المفقود وعبارات assign لجعل هذا المخزن المؤقت ثنائي الاتجاه يعمل.
ما يجب القيام به:
- أضف منفذ
inoutبحجم 8 بت يسمىio_bus - أضف عبارة
assignتقوم بتوجيهsend_valueإلىio_busعندما تكون قيمةsend_enableهي 1، وإلاZ - أضف عبارة
assignتقوم بقراءةio_busفيreceive_value
ورقة مرجعية
inout هو منفذ ثنائي الاتجاه يمكنه إرسال واستقبال الإشارات في نفس الوقت. يقوم جهاز واحد فقط بقيادة الناقل (bus) في المرة الواحدة؛ ويجب على الأجهزة الأخرى إخراج ممانعة عالية (Z).
module bidir (
inout [7:0] bus,
input [7:0] data_out,
input enable,
output [7:0] data_in
);
assign bus = (enable) ? data_out : 8'bZ; // القيادة عند التفعيل، وإلا التحرير
assign data_in = bus; // قراءة الناقل دائماً
endmoduleالقواعد الأساسية:
- يجب أن يكون من نوع
wire(وليسreg) - استخدم
assignمع شرط ثلاثي — لا تقم أبداً بالتعيين داخل كتلةalways - التحرير باستخدام
Zعند عدم القيادة لتجنب تعارض الناقل (bus contention)
جرّب بنفسك
module bidir_buffer (
// المهمة 1: أضف منفذ إدخال/إخراج (inout) بحجم 8 بت يسمى io_bus هنا
input [7:0] send_value,
input send_enable,
output [7:0] receive_value
);
// المهمة 2: أضف عبارة assign التي تقود io_bus بـ send_value عندما يكون send_enable هو 1، وإلا Z
// المهمة 3: أضف عبارة assign التي تقرأ io_bus إلى receive_value
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة