본문 바로가기

실전! Verilog HDL RTL Design

[Verilog HDL] 4. Adder 설계

반응형

앞서 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란?  (0) 2022.03.25