입력 및 출력 포트
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 31번째.
입력 및 출력 포트는 모듈이 외부 세계와 통신할 수 있게 해주는 연결입니다. 이들은 칩의 핀과 같습니다. 포트는 모듈과 나머지 설계 사이의 인터페이스입니다.
모든 모듈은 다음을 가집니다:
- 입력 포트(Input ports) — 모듈 내부로 들어오는 신호
- 출력 포트(Output ports) — 모듈 외부로 나가는 신호
입력 포트
입력 포트는 외부로부터 데이터를 받습니다. 모듈 내부에서 변경할 수 없으며, 읽기만 가능합니다.
input clk; // 단일 비트 입력
input [7:0] data; // 8비트 입력 벡터
input a, b; // 한 줄에 여러 입력입력 규칙:
- 모듈 내부에서 값을 할당할 수 없습니다
reg로 선언할 수 없습니다- 항상
wire입니다 (기본값)
출력 포트
출력 포트는 데이터를 외부로 보냅니다. assign 또는 always 블록에 의해 구동될 수 있습니다.
output out; // 단일 비트 출력
output [3:0] result; // 4비트 출력
output reg busy; // 출력은 reg일 수 있음
output wire ready; // 출력은 wire일 수 있음출력 규칙:
wire(assign사용) 또는reg(always사용)가 될 수 있습니다- 모듈 내부의 무언가에 의해 구동되어야 합니다
포트 선언 구문
포트 선언 구문은 모듈 내에서 입력 및 출력 포트를 작성하는 구체적인 방법입니다. 이는 Verilog에게 각 포트에 대한 세 가지 사항을 알려줍니다:
- 방향 — 입력(input), 출력(output), 또는 입출력(inout)인가요?
- 크기 — 너비가 몇 비트인가요?
- 이름 — 무엇이라고 불리나요?
module example (
input [7:0] data_in, // 입력 벡터
input clk, // 단일 입력
input enable, // 단일 입력
output reg [7:0] out, // 출력 reg
output busy // 출력 wire
);포트 방향이 중요한 이유
방향은 Verilog에 다음을 알려줍니다:
- 모듈이 읽을 수 있는 신호 (입력)
- 모듈이 쓸 수 있는 신호 (출력)
- 허용되는 연결 유형
잘못된 방향을 사용하면 컴파일 오류가 발생합니다.
코드 예제
module port_demo (
input [3:0] a, // 읽기만 가능
input [3:0] b, // 읽기만 가능
output reg [3:0] sum, // 쓰기 가능 (reg)
output [3:0] diff // 쓰기 가능 (wire)
);
always @(*) begin
sum = a + b; // 출력 reg에 쓰기
end
assign diff = a - b; // 출력 wire에 쓰기
endmodule챌린지
포트 선언을 완료하세요
수행할 작업:
data_in이라는 이름의 8비트 입력을 추가하세요clk라는 이름의 단일 비트 입력을 추가하세요result라는 이름의 4비트 출력을 추가하세요 (reg 사용 — always 블록에서 할당될 예정)valid라는 이름의 단일 비트 출력을 추가하세요 (wire 사용 — assign으로 할당될 예정)
치트 시트
포트(Port)는 모듈과 외부 세계 사이의 인터페이스입니다.
입력 포트 (Input Ports)
입력은 항상 wire이며, 모듈 내부에서는 읽기 전용입니다:
input clk; // 단일 비트
input [7:0] data; // 8비트 벡터
input a, b; // 여러 개의 입력출력 포트 (Output Ports)
출력은 wire(assign에 의해 구동됨) 또는 reg(always에 의해 구동됨)가 될 수 있습니다:
output wire ready; // assign과 함께 사용
output reg busy; // always와 함께 사용모듈 헤더에서의 포트 선언
각 포트 선언은 방향, 크기, 그리고 이름을 지정합니다:
module example (
input [7:0] data_in, // 8비트 입력
input clk, // 단일 비트 입력
output reg [3:0] sum, // 4비트 출력 reg
output diff // 단일 비트 출력 wire
);
always @(*) sum = data_in[3:0] + 1;
assign diff = data_in[0];
endmodule직접 해보기
module port_challenge (
// 작업 1: data_in이라는 이름의 8비트 입력을 추가하세요
// 작업 2: clk라는 이름의 단일 비트 입력을 추가하세요
// 작업 3: result라는 이름의 4비트 출력을 추가하세요 (reg 사용)
// 작업 4: valid라는 이름의 단일 비트 출력을 추가하세요 (wire 사용)
);
reg [3:0] counter;
always @(posedge clk) begin
counter <= counter + 1;
result <= counter;
end
assign valid = (counter > 8);
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.