Verilog에는 시스템을 모델링할 수 있는 방법이 있다. 간단하게 그 중 세 가지를 알아보자.
1. 자료흐름적 모델링 (Data Flow Modeling)
데이터의 흐름에 중점을 두고 모델링하는 방법이고,디지털 필터와 같은 신호 처리 회로에서 적합하다고 한다. 하지만 이를 보고 무슨 말인지 잘 와닿지 않는다. 먼저 코드를 보자.
module half_adder_d( //data flow modeling
input A,
input B,
output wire S, //data type : reg, wire
output wire Cout
);
assign S = A ^ B; //you cannot use assign type in always
assign Cout = A & B;
endmodule
위 코드는 자료흐름적 모델링을 이용하여 지난 번에 배웠던 반가산기를 만들어 보았다. 코드를 보았을 때, 느낌은 시스템을 어떤 하나의 직관적인 Flow로 설명하는 느낌, 즉 시스템의 흐름을 글로 풀어서 쓰는 느낌이 강하다. 위 모델링의 특징은 assign문을 사용한다는 점이다. assign을 이용하여 output값에 논리식을 넣어주는 형태인데, 보다시피 가독성과 간결성이 매우 뛰어나다. 하지만 always문에는 사용할 수 없다. 따라서 클럭을 사용하는 순차논리회로에는 적합하지 않다.
2. 게이트 레벨 모델링 (Gate Level Modeling)
각 논리 게이트를 개별적으로 모델링하는 방법이다. 간단한 회로에 대해서는 적합하다고 한다. 그 이유를 아래 코드에서 보자.
module half_adder( //Gate level modeling
input wire A,
input wire B,
output S,
output C
);
xor u1 (S, A, B);
and u2 (C, A, B);
endmodule
코드를 보면 assign을 사용하는 자료흐름적 모델링과 달리, 게이트 레벨 모델링에서는 Verilog 내에 내장된 게이트를 직접 호출하여 사용할 수 있다는 장점이 있다. 코드 구현이 매우 쉽고 간단한 회로 구현에 매우 적합하다. 하지만 게이트가 많아지고 복잡해질수록 수많은 게이트를 호출해야 하므로 구현의 난이도와 코드의 유지,보수 측면에서 매우 효율이 떨어진다.
3. 동작적 모델링 (Behavioral Modeling)
클럭을 사용하는 경우에 자주 쓰이는 모델링 방법이다 따라서, 클럭의 상승/하강 에지에서 적절하게 always문을 사용하여 코드를 구현하는 모델링이다. 아래는 동작적 모델링을 이용하여 클럭을 사용하는 D-플립플롭을 구현한 코드이다.
module d_ff(
input D,
input clk,
input reset,
output reg Q
);
always @(posedge clk, posedge reset) begin
if (reset) begin
Q <= 1'b0;
end else begin
Q <= D;
end
end
endmodule
위의 코드에서 always 블록은 posedge clk(클럭의 상승엣지) 또는 posedge reset(리셋의 하강엣지)가 발생할 때마다 블록 내부의 코드를 실행한다. 따라서 always문 내에서 주로 if문과 case문 같은 조건문을 사용하여, 클럭이 발생할 때 마다, input값의 조건에 따라 output값을 바꾸는 방식이다. 이를 동작적 모델링이라고 한다.
'FPGA' 카테고리의 다른 글
[FPGA] 6. Basys3 두 개로 Encoder <--> Decoder 구현 / 7-SEG Decoder 구현 (0) | 2023.04.18 |
---|---|
[FPGA] 5. Basys3 사용해보기 (0) | 2023.04.18 |
[FPGA] 3. Verilog의 순차 회로 (0) | 2023.04.18 |
[FPGA] 2. Verilog의 조합 회로 (0) | 2023.04.17 |
[FPGA] 1. Verilog 기본과 문법(4/17) (0) | 2023.04.17 |