منافذ Inout
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 32 من 90.
منفذ inout هو منفذ ثنائي الاتجاه يمكنه إرسال واستقبال الإشارات في نفس الوقت. يمكن أن يعمل كـ input أو output في أوقات مختلفة. معظم المنافذ تكون إما input (تتدفق البيانات للداخل) أو output (تتدفق البيانات للخارج). يمكن لمنفذ inout القيام بكلا الأمرين — يمكنه إرسال البيانات للخارج أو استقبال البيانات للداخل، اعتمادًا على الموقف.
فكّر في الأمر كما لو كان شارعًا ثنائي الاتجاه بدلاً من طريق ذي اتجاه واحد.
تُستخدم منافذ Inout من أجل:
- النواقل المشتركة — أجهزة متعددة متصلة بنفس الأسلاك
- نواقل بيانات الذاكرة — يمكن قراءة البيانات أو كتابتها
- الاتصال ثنائي الاتجاه — I2C، وSPI، وغيرها.
يقوم جهاز واحد فقط بتشغيل الحافلة (bus) في كل مرة. يجب أن تكون الأجهزة الأخرى في حالة المعاوقة العالية (Z).
الإعلان عن منفذ Inout
inout [7:0] data_bus; // ناقل ثنائي الاتجاه 8-بت
inout ready; // إشارة ثنائية الاتجاه أحادية البتكيف يعمل Inout
يتطلب منفذ inout إشارة تحكم لتحديد ما إذا كان يعمل كمدخل أو كمخرج:
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; // Drive bus when enabled, else Z
assign data_in = bus; // Always read the bus
endmodule- عندما تكون
enable = 1، تقوم الوحدة بـ قيادة الـbus(وضع المخرج/output) - عندما تكون
enable = 0، تقوم الوحدة بـ تحرير الـbus(وضع المدخل/input، حالة المعاوقة العالية high-Z)
قواعد مهمة لـ Inout
| القاعدة | السبب |
|---|---|
يجب الإعلان عنه كـ wire | Cannot أن يكون reg |
| Cannot أن يتم read وكتبته في نفس الوقت | سيؤدي إلى إنشاء تعارض (X) |
استخدم Z لـ release الـ bus | يسمح للأجهزة الأخرى بـ drive |
| مشغل واحد فقط في كل مرة | يمنع تنازع الـ bus |
Inout مقابل Input مقابل Output
| نوع المنفذ (Port) | الاتجاه | يمكنه القيادة (Drive) | يمكنه القراءة (Read) |
|---|---|---|---|
input | اتجاه واحد (للداخل فقط) | لا | نعم |
output | اتجاه واحد (للخارج فقط) | نعم | لا |
inout | اتجاهان (كلاهما) | نعم (عند التمكين) | نعم (دائمًا) |
خطأ شائع
// WRONG: لا يمكن التعيين إلى inout داخل كتلة always
always @(posedge clk) begin
data_bus <= something; // خطأ! استخدم assign مع شرط
end
// CORRECT: استخدم assign مع شرط enable
assign data_bus = (enable) ? something : 8'bZ;التحدي
أضف المنفذ inout المفقود وعبارات assign لجعل هذا التخزين المؤقت ثنائي الاتجاه (bidirectional) يعمل.
ما يجب فعله:
- أضف منفذ
inoutبعرض 8-bit باسمio_bus - أضف عبارة
assignتقودio_busبالقيمةsend_valueعندما يكونsend_enableيساوي 1، وإلاZ - أضف عبارة
assignتقرأio_busإلىreceive_value
جرّب بنفسك
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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة