Menu
CoddyTech

منافذ الإدخال والإخراج ثنائية الاتجاه

جزء من قسم الأساسيات في رحلة 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;
challenge icon

التحدي

أضف منفذ inout المفقود وتعليمات assign لجعل هذا المخزن المؤقت ثنائي الاتجاه يعمل.

ما يجب فعله:

  1. أضف منفذ inout بعرض 8 بتات يُسمى io_bus
  2. أضف تعليمة assign تقود io_bus بالقيمة send_value عندما تكون send_enable تساوي 1، وإلا بالقيمة Z
  3. أضف تعليمة 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات

تدرّب بنفسك: مترجم Verilog عبر الإنترنت