Menu
Coddy logo textTech

Inout 포트

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 32번째.

inout 포트는 신호를 보내고 받을 수 모두 있는 양방향(bidirectional) 포트입니다. 때에 따라 입력 또는 출력 역할을 할 수 있습니다. 대부분의 포트는 input(데이터가 내부로 들어옴) 또는 output(데이터가 외부로 나감) 중 하나입니다. inout 포트는 상황에 따라 데이터를 외부로 내보내거나(drive) 내부로 받을(receive) 수 있어 두 가지 역할을 모두 수행할 수 있습니다.

일방통행 도로가 아닌 양방향 도로라고 생각해 보세요.

Inout 포트는 다음과 같은 목적으로 사용됩니다:

  • 공유 버스 — 동일한 와이어에 연결된 여러 장치
  • 메모리 데이터 버스 — 데이터를 읽거나 쓸 수 있음
  • 양방향 통신 — I2C, SPI 등

한 번에 하나의 장치만 버스를 구동합니다. 다른 장치들은 고임피던스 상태(Z)에 있어야 합니다.

Inout 포트 선언하기

inout [7:0] data_bus;   // 8비트 양방향 버스
inout ready;             // 단일 비트 양방향 신호

Inout의 작동 방식

inout port는 입력으로 동작할지 출력으로 동작할지 결정하기 위한 제어 신호가 필요합니다:

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)합니다 (output 모드)
  • enable = 0일 때, module은 버스를 해제(releases)합니다 (input 모드, high-Z)

Inout에 대한 중요한 규칙

규칙이유
반드시 wire로 선언되어야 함reg가 될 수 없음
동시에 읽기와 쓰기를 할 수 없음충돌(X)을 일으킴
버스를 해제하려면 Z를 사용함다른 장치가 구동할 수 있도록 허용함
한 번에 하나의 드라이버만 가능버스 경합(contention)을 방지함

Inout vs Input vs Output

포트 유형방향Drive 가능 여부Read 가능 여부
input단방향 (입력 전용)NoYes
output단방향 (출력 전용)YesNo
inout양방향 (모두)Yes (enabled 상태일 때)Yes (always)

자주 하는 실수

// WRONG: always 블록 내부에서 inout에 할당할 수 없음
always @(posedge clk) begin
  data_bus <= something;   // 오류! 조건과 함께 assign을 사용하세요
end

// CORRECT: enable 조건과 함께 assign을 사용하세요
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

챌린지

이 양방향 버퍼가 작동하도록 누락된 inout 포트와 assign 구문을 추가하세요.

수행할 작업:

  1. io_bus라는 이름의 8비트 inout 포트를 추가하세요.
  2. send_enable이 1일 때 send_valueio_bus를 구동하고, 그렇지 않으면 Z로 구동하는 assign 구문을 추가하세요.
  3. io_bus의 값을 읽어 receive_value로 전달하는 assign 구문을 추가하세요.

직접 해보기

module bidir_buffer (
  // 작업 1: 여기에 io_bus라는 8비트 inout 포트를 추가하세요
  
  
  input [7:0] send_value,
  input send_enable,
  output [7:0] receive_value
);

  // 작업 2: send_enable이 1일 때 io_bus를 send_value로 구동하고, 그렇지 않으면 Z로 하는 assign 문을 추가하세요
  
  
  // 작업 3: io_bus를 receive_value로 읽는 assign 문을 추가하세요
  

endmodule
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨