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, hem sinyal gönderebilen hem de alabilen çift yönlü bir porttur. Farklı zamanlarda bir giriş veya bir çıkış olarak görev yapabilir.

Çoğu port ya input (veri içeri akar) ya da output (veri dışarı akar) şeklindedir. Bir inout portu her ikisini de yapabilir — duruma bağlı olarak veriyi dışarı sürebilir veya içeri alabilir.

Bunu tek yönlü bir yol yerine çift yönlü bir cadde gibi düşünün.

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

  • Paylaşımlı veri yolları (Shared buses) — aynı kablolara bağlı birden fazla cihaz
  • Bellek veri yolları — veriler okunabilir veya yazılabilir
  • Çift yönlü iletişim — I2C, SPI vb.

Bir seferde veri yolunu yalnızca bir cihaz sürer. Diğer cihazlar yüksek empedans durumunda (Z) olmalıdır.

Inout Portu Bildirme

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

Inout Nasıl Çalışır

Bir inout portu, giriş mi yoksa çıkış mı olarak hareket edeceğine karar vermek için bir kontrol sinyali gerektirir:

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;  // Etkinleştirildiğinde veri yolunu sür, aksi takdirde Z
  assign data_in = bus;                     // Veri yolunu her zaman oku
  
endmodule
  • enable = 1 olduğunda, modül veriyolunu sürer (çıkış modu)
  • enable = 0 olduğunda, modül veriyolunu serbest bırakır (giriş modu, high-Z)

Inout İçin Önemli Kurallar

KuralNeden
wire olarak bildirilmelidirreg olamaz
Aynı anda hem okunup hem yazılamazÇakışma (X) yaratır
Veri yolunu serbest bırakmak için Z kullanınDiğer cihazların sürmesine izin verir
Aynı anda sadece bir sürücüVeri yolu çekişmesini önler

Inout vs Input vs Output

Port TürüYönSürebilirOkuyabilir
inputTek yönlü (yalnızca giriş)HayırEvet
outputTek yönlü (yalnızca çıkış)EvetHayır
inoutÇift yönlü (her ikisi)Evet (etkinleştirildiğinde)Evet (her zaman)

Yaygın Hata

// YANLIŞ: always bloğu içinde inout ataması yapılamaz
always @(posedge clk) begin
  data_bus <= something;   // Hata! Koşullu 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ü tamponun (bidirectional buffer) çalışması için eksik olan inout portunu ve assign ifadelerini ekleyin.

Neler yapmalı:

  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ğerini veren bir assign ifadesi ekleyin
  3. io_bus değerini receive_value içine okuyan bir assign ifadesi ekleyin

Kopya kağıdı

inout, hem sinyal gönderebilen hem de alabilen çift yönlü bir porttur. Veri yolunu (bus) aynı anda yalnızca bir cihaz sürer; diğerleri yüksek empedans (Z) çıkışı vermelidir.

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; // Etkinleştirildiğinde sür, aksi takdirde serbest bırak
  assign data_in = bus;                    // Veri yolunu her zaman oku
endmodule

Temel kurallar:

  • wire olmalıdır (reg değil)
  • Üçlü (ternary) koşul ile assign kullanın — asla bir always bloğu içinde atama yapmayın
  • Veri yolu çakışmasını (bus contention) önlemek için sürülmediğinde Z ile serbest bırakın

Kendin dene

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

  // Görev 2: send_enable 1 olduğunda io_bus'ı send_value ile süren, aksi takdirde Z yapan bir assign ifadesi ekleyin
  
  
  // Görev 3: io_bus'ı 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