Menu
CoddyTech

Port Inout

Termasuk bagian Dasar-Dasar dalam perjalanan Verilog di Coddy. Pelajaran 32 dari 90.

Port inout adalah port dua arah yang dapat mengirim dan menerima sinyal. Port ini dapat berfungsi sebagai input atau output pada waktu yang berbeda. Sebagian besar port berupa input (data mengalir masuk) atau output (data mengalir keluar). Port inout dapat melakukan keduanya. Port ini dapat mengirimkan data keluar atau menerima data masuk, bergantung pada situasinya.

Anggap saja seperti jalan dua arah, bukan jalan satu arah.

Port input/output digunakan untuk:

  • Bus bersama: beberapa perangkat terhubung ke kabel yang sama
  • Bus data memori: data dapat dibaca atau ditulis
  • Komunikasi dua arah: I2C, SPI, dan sebagainya

Hanya satu perangkat yang mengendalikan bus pada satu waktu. Perangkat lain harus berada dalam kondisi impedansi tinggi (Z).

Mendeklarasikan Port Inout

inout [7:0] data_bus;   // Bus dua arah 8-bit
inout ready;             // Sinyal dua arah 1-bit

Cara Kerja Inout

Port inout memerlukan sinyal kontrol untuk menentukan apakah port tersebut berfungsi sebagai input atau 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
  • Saat enable = 1, module menggerakkan bus (mode output)
  • Saat enable = 0, module melepaskan bus (mode input, high-Z)

Aturan Penting untuk Inout

AturanAlasan
Harus dideklarasikan sebagai wireTidak bisa berupa reg
Tidak bisa dibaca dan ditulis secara bersamaanAkan menimbulkan konflik (X)
Gunakan Z untuk melepaskan busMemungkinkan perangkat lain mengendalikan bus
Hanya boleh ada satu pengendali pada satu waktuMencegah konflik pada bus

Inout vs Input vs Output

Jenis PortArahDapat MengirimDapat Membaca
inputSatu arah (hanya masuk)TidakYa
outputSatu arah (hanya keluar)YaTidak
inoutDua arah (keduanya)Ya (saat diaktifkan)Ya (selalu)

Kesalahan Umum

// SALAH: Tidak bisa menetapkan nilai ke inout di dalam blok always
always @(posedge clk) begin
  data_bus <= something;   // Error! Gunakan assign dengan kondisi
end

// BENAR: Gunakan assign dengan kondisi enable
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

Tantangan

Tambahkan port inout yang hilang dan pernyataan assign agar buffer dua arah ini berfungsi.

Yang perlu dilakukan:

  1. Tambahkan port inout 8-bit bernama io_bus
  2. Tambahkan pernyataan assign yang menggerakkan io_bus dengan send_value saat send_enable bernilai 1, jika tidak, gunakan Z
  3. Tambahkan pernyataan assign yang membaca io_bus ke dalam receive_value

Coba sendiri

module bidir_buffer (
  // Tugas 1: Tambahkan port inout 8-bit bernama io_bus di sini
  
  
  input [7:0] send_value,
  input send_enable,
  output [7:0] receive_value
);

  // Tugas 2: Tambahkan pernyataan assign yang menggerakkan io_bus dengan send_value saat send_enable bernilai 1, jika tidak Z
  
  
  // Tugas 3: Tambahkan pernyataan assign yang membaca io_bus ke receive_value
  

endmodule
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dasar-Dasar

Latihan sendiri: Compiler Verilog online