728x90
1. Module이란?
- Verilog에서 module은 하나의 독립적인 하드웨어 블록을 정의하는 기본 단위
- 회로 설계를 할 때 모듈을 이용하여 기능을 블록 단위로 나누고, 이를 재사용할 수 있도록 한다.
_
# Module의 기본 구조
- 아래 코드에서 module은 AND 게이트를 나타내며, 입력 포트 a, b를 받아서 c에 결과를 출력한다.
module 모듈명(포트리스트);
// 포트 선언
input wire a, b;
output wire c;
// 내부 신호 및 로직 정의
assign c = a & b;
endmodule
==========𝔼𝔼𝟚𝟚==========
2. Module의 Instance화란?
- Instance화(Instancing)는 정의된 module을 다른 module 내에서 호출하여 사용하는 과정
- 하드웨어 설계에서 모듈화를 통해 재사용성과 계층적 설계를 가능하게 함
_
# Instance화 기본 예제
- U1은 and_gate 모듈을 인스턴스화한 것
- and_gate는 미리 정의된 모듈이어야 하며, U1은 해당 모듈을 하나의 구성 요소로 사용
module top_module(
input wire x, y,
output wire z
);
// AND 모듈 인스턴스 생성
and_gate U1 (
.a(x),
.b(y),
.c(z)
);
endmodule
==========𝔼𝔼𝟚𝟚==========
3. Instance화의 주요 방식
3.1 포지셔널 방식(Positional Instantiation)
- 포트의 순서를 맞춰서 연결하는 방식
- 실수로 잘못된 순서로 연결할 가능성이 있음
module top_module(
input wire x, y,
output wire z
);
and_gate U1 (x, y, z); // a = x, b = y, c = z
endmodule
_
3.2 명시적 포트 연결 방식(Named Port Mapping)
- .포트명(연결할 신호) 형식으로 연결
- 포트 순서와 관계없이 명확하게 지정 가능
module top_module(
input wire x, y,
output wire z
);
and_gate U1 (
.a(x),
.b(y),
.c(z)
);
endmodule
- 일반적으로 이 방식이 유지보수 및 가독성 측면에서 더 권장된다.
==========𝔼𝔼𝟚𝟚==========
4. Vivado에서 Module 사용 및 Instance화 과정
4.1 새 Verilog Module 생성
- Vivado에서 새로운 프로젝트를 생성
- Design Sources에서 Add Sources -> Create File을 선택하고 Verilog Module을 추가
- 모듈의 이름과 포트 리스트를 정의
_
4.2 서브 모듈 생성
- AND 게이트 역할을 하는 and_gate.v 모듈 생성
module and_gate(
input wire a, b,
output wire c
);
assign c = a & b;
endmodule
- top_module.v 모듈 생성 및 and_gate 인스턴스화
module top_module(
input wire x, y,
output wire z
);
// and_gate 모듈 인스턴스화
and_gate U1 (
.a(x),
.b(y),
.c(z)
);
endmodule
_
4.3 Vivado에서 Hierarchy 확인
- Sources 패널에서 Hierarchy 탭을 보면 top_module이 and_gate를 포함하고 있는 구조가 나타남.
- Run Simulation -> Behavioral Simulation을 실행하여 올바르게 동작하는지 확인
_
4.4 Synthesis 및 Implementation 진행
- Run Synthesis를 클릭하여 논리 합성을 수행
- Run Implementation을 클릭하여 실제 FPGA에 배치될 논리 구조 확인
- Generate Bitstream을 수행하여 FPGA에서 사용할 .bit 파일 생성
==========𝔼𝔼𝟚𝟚==========
5. Parameterized Module (파라미터를 이용한 모듈)
: 모듈을 보다 유연하게 만들기 위해 parameter를 사용하여 크기나 동작을 다르게 설정할 수 있음.
_
# Parameterized Module 예제
module adder #(parameter WIDTH = 8)(
input wire [WIDTH-1:0] a, b,
output wire [WIDTH-1:0] sum
);
assign sum = a + b;
endmodule
_
# Instance화 시 파라미터 적용
module top_module;
wire [7:0] result;
// 8비트 덧셈기 인스턴스
adder #(8) U1 (
.a(8'b00001111),
.b(8'b00000001),
.sum(result)
);
endmodule
- adder #(8)을 통해 WIDTH를 8로 설정
==========𝔼𝔼𝟚𝟚==========
6. Module과 Instance화를 활용한 FPGA 설계 흐름
- 하나의 주요 모듈(top module)을 생성
- 여러 개의 서브 모듈을 설계 (예: 연산 블록, 제어 블록 등)
- 서브 모듈을 top module에서 Instance화
- Vivado에서 Hierarchy 확인 및 Simulation 진행
- Synthesis 및 Implementation 후 FPGA에 적용
==========𝔼𝔼𝟚𝟚==========
7. 결론
- Verilog에서 module은 독립적인 하드웨어 블록이며, instance를 사용하여 다른 모듈에서 호출하여 사용할 수 있음.
- Instance화는 포지셔널 방식과 명시적 포트 연결 방식이 있으며, 명시적 방식이 권장됨.
- Vivado에서 Verilog 모듈을 생성한 후 Hierarchy를 통해 모듈 관계를 확인할 수 있음.
- Parameterized Module을 사용하면 유연한 설계가 가능함.
- FPGA 설계에서는 top module을 기준으로 여러 서브 모듈을 instance화하여 계층적 구조를 갖게 설계하는 것이 일반적임.
728x90
반응형
'Study > FPGA' 카테고리의 다른 글
| 08. Handshake 개념 (0) | 2025.03.08 |
|---|---|
| [FPGA] 07 - 파이프라인 Pipeline 개념과 예제 (0) | 2025.03.08 |
| 05 - 동기 Synchronous vs. 비동기 리셋 Reset (0) | 2025.03.03 |
| 04 - FPGA 설계 흐름 (Design Flow) (0) | 2025.03.01 |
| 03 - HLS(High-Level Synthesis) 개념 및 툴 정리 (0) | 2025.03.01 |