#11. 구조적모델링-모듈의 인스턴스(작성중)
Verilog/Verilog HDL강의정리(KOCW) 2023. 7. 29. 02:04이제 실제 설계 구현단계에 들어가보도록 하자.
1. 모듈선언방식
앞선 글에서는 모듈 선언 방식은 다음과 같이 선언하였다.
module test(a,b);
input [1:0] a;
output [1:0] b;
reg [1:0] b;
이러한 모듈 선언은 다음과 같이도 선언이 가능하다.
module test(input [1:0] a,
output [1:0] b,
reg [1:0] b);
앞에서의 모듈 선언은 선언부에 먼저 포트를 선언 하고 그 뒤에서 포트의 형식을 결정했다면, 두번째 모듈 선언 방식은 모듈 선언과 함께 포트목록을 함께 작성하는 방식을 의미한다. 두 방식 모두 가능하며, 설계자의 스타일에 따라 달라질 수 있다. (학교에서는 두번째 스타일을 선호하는 것 같았다.)
2. 구조적모델링-모듈을 인스턴스하기
인스턴스란 쉽게 이야기하면 만들어진 모듈에 실제 값(포트)를 넣어 실체화 하는 것이다. 쉽게 모듈을 선언하는 것은 빵틀을 만드는 것이라면, 선언 모듈을 인스턴스하게 되면 빵틀에 반죽을 넣어 실제 빵을 만드는 과정이라 생각하면 되겠다.
모듈의 인스턴스 방법은 다음과 같다.
하나씩 뜯어보도록 하겠다.
Module_name : 모듈의 이름이다, 이전에 선언한 모듈 이름 그대로를 가져온다.
[#(param)] : 파라미터 값을 변경시킬 수 있는 부분(생략가능)
Instance_name : 모듈의 인스턴스 이름을 결정하는 부분이다. 만들어진 빵의 이름을 정한다 라고 생각하면 된다.
[[N:M]] : 모듈배열을 선언하는 부분이다. 동일한 모듈을 여러개 만들 수 있다. 선언하지 않을 경우 하나의 모듈만이 만들어진다.(생략가능)
((port_mapping) : 인스턴스된 모듈안에 값을 매핑하는 과정이다. 포트매핑은 두가지 방법으로 이루어진다. 순서에 의한 매핑과 이름에 의한 매핑이 바로 그것이다. 설계자의 스타일에 따라 달라지지만, 이름에 의해 매핑하는 것이 직관적으로 더 보기 쉽다고 한다. 이름에 의한 매핑방법은 다음과 같이 작성한다.
.port_name ([expression])
앞의 . 이 붙는다는 사실에 유의하자.
이제 예시를 통해서 확인해보자, modB라는 모듈을 먼저 선언한다.
module modB(wa, wb, c, d);
input wa, wb;
input c, d;
endmodule
모듈및 포트만 선언하였다. 다른 연결부는 일부러 이해를 쉽게 하기 위해 작성하지 않았다.
이렇게 작성된 모듈을 top 모듈에서 불러오도록 한다. 이 과정에서 모듈이 인스턴스 되고, 포트매핑을 하게 되는데, 먼저 순서에 의한 포트 매핑을 살펴보자
module top;
wire [1:0] v,w;
modB b1(v[0], v[1], w[0], w[1]);
endmodule
top 모듈이다. 모듈 안에서 modB가 인스턴스 되었는데, 그 이름은 b1으로 지정했고, 2비트의 v, w를 선언하였다. 포트의 순서인 wa, wb, c, d 각각에 v[0], v[1], w[0], w[1] 을 집어넣게 된다.
이번엔 이름에 의한 포트 매핑을 살펴보도록 하자
module top;
wire [1:0] v,w;
modB b1(.wb(v[1]), .wa(v[0]), .d(w[1]), .c(w[1]));
endmodule
d이번엔 이름에 의해 포트매핑을 한 것이다. 순서가 위와 다르기 때문에 유의하도록 하자.
즉, 포트이름이 wb, wa, d, c이며 신호이름이 v[1], v[0], w[1], w[0] 으로 들어간 것이다.
3. 1비트 전가산기(full adder)설계하기
전가산기를 설계해보도록 하자, 전가산기에 대한 내용은 이전 글을 참조한다.
2020.10.22 - #1. Full adder(전가산기)
내용을 모두 안다고 가정하고, 회로를 살펴보자
이 그림을 보면서, 회로 및 포트를 구성하고, verilog code를 작성하면 되겠다.
크게 먼저 half adder 모듈이 필요하고, 전체 top모듈에서 half adder 모듈을 인스턴스 하여 전체 회로를 구성하는 방식으로 코드를 작성하면 되겠다. 먼저 half adder 모듈이다.
#12. Verilog 구조적 모델링-(2), 모듈 parameter/deparam문 (0) | 2023.08.09 |
---|---|
Verilog module 선언부 작성스타일(syntax) (0) | 2023.08.01 |
#10. verilog 문법-반복문(repeat, while, forever, for) (0) | 2023.07.27 |
#9. Verilog 문법-if 조건문, case문 (0) | 2023.07.24 |
#8-1. 동기식 vs 비동기식, blocking vs non-blocking(수정중) (0) | 2023.07.21 |