Menu
Coddy logo textTech

Inout Portları

Coddy'nin Verilog Journey'sinin Temeller bölümünün bir parçası — ders 32 / 90.

Bir inout portu, sinyalleri hem gönderebilen hem de alabilen çift yönlü bir porttur. Farklı zamanlarda bir input veya bir output gibi davranabilir. Portların çoğu ya input (veri içeri akar) ya da output (veri dışarı akar) şeklindedir. Bir inout portu ise her ikisini de yapabilir — duruma bağlı olarak dışarıya veri sürebilir (drive) veya içeriye veri alabilir.

Tek yönlü bir yol yerine bunu iki yönlü bir cadde gibi düşünün.

Inout portları şunlar için kullanılır:

  • Paylaşılan veriyolları (bus) — aynı kablolara bağlı birden fazla cihaz
  • Bellek veri veriyolları — veri okunabilir veya yazılabilir
  • Çift yönlü (bidirectional) iletişim — I2C, SPI, vb.

Veri yolunu (bus) aynı anda yalnızca bir cihaz sürer (drives). Diğer cihazlar yüksek empedans durumunda (Z) olmalıdır.

Inout Port Tanımlama

inout [7:0] data_bus;   // 8-bit çift yönlü bus
inout ready;             // Tek bitlik çift yönlü sinyal

Inout Nasıl Çalışır

Bir inout portu, girdi mi yoksa çıktı mı olarak hareket edeceğine karar vermek için bir kontrol sinyaline ihtiyaç duyar:

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 olduğunda, modül bus'ı sürer (drives) (çıktı modu)
  • enable = 0 olduğunda, modül bus'ı serbest bırakır (releases) (girdi modu, yüksek empedans/high-Z)

Inout İçin Önemli Kurallar

KuralNeden
wire olarak tanımlanmalıdırreg olamaz
Aynı anda okunup yazılamazÇakışma (X) oluşturur
Veri yolunu serbest bırakmak için Z kullanınDiğer cihazların sürmesine (drive) izin verir
Aynı anda yalnızca bir sürücü (driver) olabilirVeri yolu çakışmasını (bus contention) önler

Inout - Input - Output Karşılaştırması

Port TipiYönSürebilir (Drive)Okuyabilir (Read)
inputTek yönlü (sadece giriş)HayırEvet
outputTek yönlü (sadece çıkış)EvetHayır
inoutÇift yönlü (her ikisi de)Evet (etkinleştirildiğinde - enabled)Evet (her zaman - always)

Sık Yapılan Hata

// YANLIŞ: always bloğu içinde inout'a atama yapılamaz
always @(posedge clk) begin
  data_bus <= something;   // Hata! Koşul ile assign kullanın
end

// DOĞRU: enable koşulu ile assign kullanın
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

Görev

Bu çift yönlü arabelleğin (bidirectional buffer) çalışması için eksik inout portunu ve assign ifadelerini ekleyin.

Yapılacaklar:

  1. io_bus adında 8-bitlik bir inout portu ekleyin
  2. send_enable 1 olduğunda io_bus portunu send_value ile süren, aksi takdirde Z değerine çeken bir assign ifadesi ekleyin
  3. io_bus değerini okuyup receive_value içine aktaran bir assign ifadesi ekleyin

Kendin dene

module bidir_buffer (
  // Görev 1: Buraya io_bus adında 8-bitlik bir inout port ekleyin
  
  
  input [7:0] send_value,
  input send_enable,
  output [7:0] receive_value
);

  // Görev 2: send_enable 1 olduğunda io_bus'u send_value ile süren, aksi halde Z yapan bir assign ifadesi ekleyin
  
  
  // Görev 3: io_bus'u receive_value'ya okuyan bir assign ifadesi ekleyin
  

endmodule
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler