Study/FPGA

06 - Verilog Module 모듈과 Instance 인스턴스화 개념

도엔 2025. 3. 8. 13:51
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 생성

  1. Vivado에서 새로운 프로젝트를 생성
  2. Design Sources에서 Add Sources -> Create File을 선택하고 Verilog Module을 추가
  3. 모듈의 이름과 포트 리스트를 정의

_

4.2 서브 모듈 생성

  1. AND 게이트 역할을 하는 and_gate.v 모듈 생성
module and_gate(
    input wire a, b,
    output wire c
);
    assign c = a & b;
endmodule
  1. 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 확인

  1. Sources 패널에서 Hierarchy 탭을 보면 top_module이 and_gate를 포함하고 있는 구조가 나타남.
  2. Run Simulation -> Behavioral Simulation을 실행하여 올바르게 동작하는지 확인

_

4.4 Synthesis 및 Implementation 진행

  1. Run Synthesis를 클릭하여 논리 합성을 수행
  2. Run Implementation을 클릭하여 실제 FPGA에 배치될 논리 구조 확인
  3. 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 설계 흐름

  1. 하나의 주요 모듈(top module)을 생성
  2. 여러 개의 서브 모듈을 설계 (예: 연산 블록, 제어 블록 등)
  3. 서브 모듈을 top module에서 Instance화
  4. Vivado에서 Hierarchy 확인 및 Simulation 진행
  5. Synthesis 및 Implementation 후 FPGA에 적용


==========𝔼𝔼𝟚𝟚==========

 

7. 결론

  • Verilog에서 module은 독립적인 하드웨어 블록이며, instance를 사용하여 다른 모듈에서 호출하여 사용할 수 있음.
  • Instance화는 포지셔널 방식과 명시적 포트 연결 방식이 있으며, 명시적 방식이 권장됨.
  • Vivado에서 Verilog 모듈을 생성한 후 Hierarchy를 통해 모듈 관계를 확인할 수 있음.
  • Parameterized Module을 사용하면 유연한 설계가 가능함.
  • FPGA 설계에서는 top module을 기준으로 여러 서브 모듈을 instance화하여 계층적 구조를 갖게 설계하는 것이 일반적임.
728x90
반응형