منافذ الإدخال والإخراج ثنائية الاتجاه
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 32 من 90.
منفذ inout هو منفذ ثنائي الاتجاه يمكنه إرسال الإشارات واستقبالها معًا. ويمكنه العمل كمدخل أو مخرج في أوقات مختلفة. تكون معظم المنافذ إما input (تتدفق البيانات إلى الداخل) أو output (تتدفق البيانات إلى الخارج). ويمكن لمنفذ inout القيام بالأمرين معًا. إذ يمكنه إرسال البيانات إلى الخارج أو استقبالها من الداخل، بحسب الحالة.
فكّر في الأمر على أنه شارع ذو اتجاهين بدلًا من طريق ذي اتجاه واحد.
تُستخدم منافذ الإدخال والإخراج ثنائية الاتجاه في:
- الناقلات المشتركة: أجهزة متعددة متصلة بالأسلاك نفسها
- ناقلات بيانات الذاكرة: يمكن قراءة البيانات أو كتابتها
- الاتصال ثنائي الاتجاه: I2C وSPI وما إلى ذلك
يقود جهاز واحد فقط الناقل في كل مرة. يجب أن تكون الأجهزة الأخرى في حالة ممانعة عالية (Z).
إعلان منفذ ثنائي الاتجاه
inout [7:0] data_bus; // ناقل ثنائي الاتجاه بعرض 8 بت
inout ready; // إشارة ثنائية الاتجاه بعرض بت واحدكيف يعمل الإدخال والإخراج
يتطلب منفذ الإدخال والإخراج إشارة تحكم لتحديد ما إذا كان يعمل كمدخل أم كمخرج:
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، تقود الوحدة الناقل (وضع الإخراج) - عندما تكون
enable = 0، تحرر الوحدة الناقل (وضع الإدخال، بممانعة عالية-Z)
قواعد مهمة بشأن Inout
| القاعدة | السبب |
|---|---|
يجب تعريفه على أنه wire | لا يمكن أن يكون reg |
| يجب ألا تتحكم أجهزة متعددة في الناقل في الوقت نفسه | تؤدي برامج التشغيل المتعارضة إلى X |
استخدم Z لتحرير الناقل | يتيح للأجهزة الأخرى التحكم فيه |
| برنامج تشغيل واحد فقط في كل مرة | يمنع تعارض الناقل |
الإدخال والإخراج مقابل الإدخال مقابل الإخراج
| نوع المنفذ | الاتجاه | هل يمكنه القيادة | هل يمكن قراءته |
|---|---|---|---|
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تقود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 تجعل send_value يقود io_bus عندما تكون قيمة send_enable هي 1، وإلا فالقيمة Z
// المهمة 3: أضف تعليمة assign تقرأ io_bus إلى receive_value
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت