앞서 module장에서 adder module의 간략한 형태를 살펴 보았다. adder는 2개의 8bit 입력 A,B를 받아 더해서 8bit 출력 Y로 출력한다.
실제 더하기 기능을 수행 하는 회로를 verilog로 coding 해 보자. verilog에서 더하기 기능에 해당하는 연산자는 +이다. 이 외에 산술 연산을 수행하는 연산자는 C언어와 동일하다.
일단 출력 Y로 결과 값을 출력하기 위하여 출력 값을 저장하는 변수를 선언하여야 한다. 지금 만드는 회로는 cominational logic으로 가정하고 설계한다.
이 때 더하기 결과 값을 sum이라는 변수에 저장한다고 하면 sum이란 변수의 data type을 wire나 reg로 선언할 수 있다.
첫번재로 wire로 선언할 경우를 생각해 보자.
변수 선언은 아래와 같이 한다.
wire [7:0] sum; // 8bit wire 변수 sum을 선언한다.
wire type의 변수는 begin/end block 내에서 사용할 수 없고 assign keyword를 사용하여 변수 할당을 해야 한다.
A와 B를 더하여 sum변수에 대입하는 문장은 아래와 같이 표현할 수 있다.
assign sum = A+B;
assign 문에서는 = 오른 쪽에 있는 변수 값이 변화할 때마다 기술되어 있는 연산을 수행하여 왼쪽의 변수에 할당한다.
두번째로 sum을 reg type의 변수로 선언한다고 하면 아래와 같은 문장으로 선언하게 된다.
reg [7:0] sum;
그리고 이 경우 sum에 더하기 결과를 저장하려면 begin/end block을 사용하여야 하고 입력 변수가 변화 할 때마다 결과 값을 계산하기 위해 always 문을 사용해야 한다. 결과적으로 아래와 같이 코딩할 수 있다.
always @(A or B)
begin
sum = A+B;
end
always @다음 괄호에 들어가는 것은 sensitivity list (감응 리스트)라고 한다. 즉 괄호 안에 들어가는 신호가 변화할 때마다 always의 bengin/end block 내부의 문장을 실행한다는 뜻이다. sensitivity list의 각 신호는 'or'를 사용하여 분리한다. 한편 보다 간단히 코딩하기 위하여 always block안의 모든 입력 신호를 sensitivity list에 사용할 경우 아래와 같이 간단하게 코딩할 수 있다.
always @(*)
begin
sum = A+B;
end
sum변수 값을 Y port로 출력하기 위하여 아래와 같이 코딩한다.
assign Y = sum;
Y port는 wire type으로 선언되어 있기 때문에 assign 문을 사용해야 한다. 전체 code는 아래와 같다. verilog에서도 주석 (comment) 처리는 C언어와 같이 // 혹은 /*... */로 처리한다. 아래에서는 sum을 wire 타입으로 선언하는 경우가 컴파일 되도록 나머지를 주석 처리 했다. reg 타입 변수로 사용하려면 반대로 comment처리 해 주면 된다.
module adder (
input wire [7:0] A,
input wire [7:0] B,
output wire [7:0] Y
);
wire [7:0] sum;
// reg [7:0] sum;
assign sum = A + B;
assign Y = sum;
/*
always @(A or B) // always @(*)
begin
sum = A+B;
end
*/
endmodule
'실전! Verilog HDL RTL Design' 카테고리의 다른 글
[Verilog HDL] 6. Simulation (0) | 2022.03.28 |
---|---|
[Verilog HDL] 5. Testbench (0) | 2022.03.28 |
[Verilog HDL] 3. Combinational Logic/Sequential Logic (0) | 2022.03.25 |
[Verilog HDL] 2. Module (0) | 2022.03.25 |
[Verilog HDL] 1. Verilog란? (1) | 2022.03.25 |