Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

منافذ 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

القاعدةالسبب
يجب الإعلان عنه كـ wireCannot أن يكون 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;
challenge icon

التحدي

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

ما يجب فعله:

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

endmodule
quiz iconاختبر نفسك

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

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