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
endmoduleenable = 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 | 단방향 (입력 전용) | No | Yes |
output | 단방향 (출력 전용) | Yes | No |
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;챌린지
이 양방향 버퍼가 작동하도록 누락된 inout 포트와 assign 구문을 추가하세요.
수행할 작업:
io_bus라는 이름의 8비트inout포트를 추가하세요.send_enable이 1일 때send_value로io_bus를 구동하고, 그렇지 않으면Z로 구동하는assign구문을 추가하세요.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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.