Menu
Coddy logo textTech

Inout 포트

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

inout 포트는 신호를 보내고 받을 수 있는 양방향 포트입니다. 상황에 따라 입력 또는 출력으로 작동할 수 있습니다.

대부분의 포트는 input (데이터가 안으로 흐름) 또는 output (데이터가 밖으로 흐름)입니다. inout 포트는 두 가지를 모두 수행할 수 있습니다. 상황에 따라 데이터를 밖으로 내보내거나 안으로 받을 수 있습니다.

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

Inout 포트는 다음과 같은 용도로 사용됩니다:

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

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

Inout 포트 선언하기

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

Inout의 작동 방식

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

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;  // 활성화 시 버스 구동, 그렇지 않으면 Z
  assign data_in = bus;                     // 항상 버스 읽기
  
endmodule
  • enable = 1일 때, 모듈은 버스를 구동합니다 (출력 모드)
  • enable = 0일 때, 모듈은 버스를 해제합니다 (입력 모드, high-Z)

Inout에 대한 중요한 규칙

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

Inout vs Input vs Output

포트 유형방향구동 가능 여부읽기 가능 여부
input단방향 (입력 전용)아니요
output단방향 (출력 전용)아니요
inout양방향 (모두)예 (활성화 시)예 (항상)

흔한 실수

// 틀림: always 블록 내부에서 inout에 할당할 수 없습니다
always @(posedge clk) begin
  data_bus <= something;   // 오류! 조건과 함께 assign을 사용하세요
end
// 올바름: enable 조건을 사용하여 assign 사용
assign data_bus = (enable) ? something : 8'bZ;
challenge icon

챌린지

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

수행할 작업:

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

치트 시트

inout은 신호를 보내고 받을 수 있는 양방향 포트입니다. 한 번에 하나의 장치만 버스를 구동하며, 다른 장치들은 반드시 하이 임피던스(Z)를 출력해야 합니다.

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; // 활성화 시 구동, 그렇지 않으면 해제
  assign data_in = bus;                    // 항상 버스를 읽음
endmodule

주요 규칙:

  • 반드시 wire여야 합니다 (reg가 아님)
  • 삼항 연산자와 함께 assign을 사용하세요 — always 블록 내부에서 할당하지 마세요
  • 버스 충돌을 피하기 위해 구동하지 않을 때는 Z로 해제하세요

직접 해보기

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실력 점검

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

기초의 모든 레슨