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

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

التحدي

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

ما يجب القيام به:

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

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

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