Menu
CoddyTech

Çift Yönlü Portlar

Coddy'nin Verilog Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 32 / 90.

inout bağlantı noktası, sinyalleri hem gönderebilen hem de alabilen çift yönlü bir bağlantı noktasıdır. Farklı zamanlarda giriş veya çıkış olarak işlev görebilir. Bağlantı noktalarının çoğu ya input (veri içeri akar) ya da output (veri dışarı akar) olur. inout bağlantı noktası her ikisini de yapabilir. Duruma bağlı olarak veriyi dışarı gönderebilir veya içeri alabilir.

Bunu tek yönlü bir yol yerine iki yönlü bir sokak gibi düşün.

Inout bağlantı noktaları şu amaçlarla kullanılır:

  • Paylaşılan veri yolları: aynı tellere bağlı birden fazla aygıt
  • Bellek veri yolları: veriler okunabilir veya yazılabilir
  • Çift yönlü iletişim: I2C, SPI vb.

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

Çift yönlü bir port tanımlama

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

Inout Nasıl Çalışır

Çift yönlü bir port, giriş mi yoksa çıkış mı olarak çalışacağına 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;  // Drive bus when enabled, else Z
  assign data_in = bus;                     // Always read the bus
  
endmodule
  • enable = 1 olduğunda modül veri yolunu sürer (çıkış modu)
  • enable = 0 olduğunda modül veri yolunu serbest bırakır (giriş modu, yüksek empedans)

Inout için Önemli Kurallar

KuralNeden
wire olarak tanımlanmalıdırreg olamaz
Aynı anda birden fazla aygıt veri yolunu sürmemelidirÇakışan sürücüler X üretir
Veri yolunu serbest bırakmak için Z kullanınDiğer aygıtların veri yolunu sürmesini sağlar
Her seferinde yalnızca bir sürücüVeri yolu çekişmesini önler

Inout ile Input ve Output Karşılaştırması

Bağlantı Noktası TürüYönSinyal SürebilirOkuyabilir
inputTek yönlü (yalnızca giriş)HayırEvet
outputTek yönlü (yalnızca çıkış)EvetEvet (sürdüğü değer)
inoutÇift yönlü (her iki yön)Evet (etkinleştirildiğinde)Evet (her zaman)

Yaygın Hata

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

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

Görev

Bu çift yönlü arabelleğin çalışması için eksik inout portunu ve assign ifadelerini ekle.

Yapılacaklar:

  1. 8 bitlik, io_bus adlı bir inout portu ekle
  2. send_enable 1 olduğunda io_bus portuna send_value değerini, aksi durumda Z değerini veren bir assign ifadesi ekle
  3. io_bus değerini receive_value içine okuyan bir assign ifadesi ekle

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'a send_value değerini, aksi halde Z değerini atayan bir assign ifadesi ekleyin
  
  
  // Görev 3: io_bus değerini receive_value içine 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.

Temel Bilgiler bölümündeki tüm dersler

Kendi başına pratik yap: Online Verilog derleyicisi