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

Inout Ports

جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 32 من 90.

منفذ inout هو منفذ bidirectional يمكنه الإرسال والاستقبال معًا للإشارات. ويمكنه العمل كـ input أو output في أوقات مختلفة. معظم المنافذ تكون إما input (تتدفق البيانات إلى الداخل) أو output (تتدفق البيانات إلى الخارج). ويمكن لمنفذ inout القيام بالأمرين معًا. إذ يمكنه قيادة البيانات إلى الخارج أو استقبال البيانات إلى الداخل، اعتمادًا على الموقف.

فكّر فيها كأنها طريق ذو اتجاهين بدلًا من طريق ذي اتجاه واحد.

تُستخدم منافذ inout من أجل:

  • الحافلات المشتركة: أجهزة متعددة متصلة بالأسلاك نفسها
  • حافلات بيانات الذاكرة: يمكن قراءة البيانات أو كتابتها
  • التواصل bidirectional: 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;  // Drive bus when enabled, else Z
  assign data_in = bus;                     // Always read the bus
  
endmodule
  • عندما تكون enable = 1، تقوم module بعملية drives لـ bus (وضع output)
  • عندما تكون enable = 0، تحرر module الـ bus (وضع input، high-Z)

قواعد مهمة لـ inout

القاعدةالسبب
يجب التصريح عنه باعتباره wireCannot أن يكون reg
Cannot قراءته والكتابة فيه في الوقت نفسهقد يؤدي ذلك إلى حدوث تعارض (X)
استخدم Z لتحرير busيسمح للأجهزة الأخرى بالتحكم فيه
سائق واحد فقط في كل مرةيمنع تنازع bus

inout مقابل input مقابل output

نوع المنفذالاتجاهيمكنه القيادةيمكنه القراءة
inputباتجاه واحد (للداخل فقط)لانعم
outputباتجاه واحد (للخارج فقط)نعملا
inoutباتجاهين (كلاهما)نعم (when enabled)نعم (always)

خطأ شائع

// خطأ: لا يمكن التعيين إلى inout داخل كتلة always
always @(posedge clk) begin
  data_bus <= something;   // خطأ! استخدم assign مع شرط
end

// صحيح: استخدم assign مع شرط enable
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

التحدي

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

ما يجب فعله:

  1. قم بـ Add منفذ inout بعرض 8-bit يُسمى io_bus
  2. قم بـ Add عبارة assign التي drives io_bus باستخدام send_value when تكون قيمة send_enable هي 1، otherwise Z
  3. قم بـ Add عبارة assign التي reads io_bus into 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اختبر نفسك

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

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

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