Language/Verilog

Vivado : 전가산기(Full-adder) 구현

짱도르딘 2024. 6. 13. 21:13
728x90

가산기

가산기란, 덧셈 연산을 수행하는 논리회로를 의미한다. 가산기는 디지털 회로, 조합 회로의 하나이며, 대부분의 가산기는 2진수의 합을 나타내는 특징을 가진다.

 

전가산기

전가산기는 두 개의 반가산기와 하나의 OR 게이트로 이루어져 있다. 전가산기는 이진수의 합뿐만 아닌 캐리까지 포함하여 동작을 수행하는 특징을 지닌다. 

전가산기의 진리표는 아래의 표와 같다.

X Y Z Sum Carry
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1

 


이제 Vivado를 활용하여 전가산기를 구현해 보도록 하자.

 

구현 방법은 Verilog의 Modeling 기법을 활용하여 구현하려고 한다. Verilog의 모델링 기법은 대표적으로 Structural, Behavioral 그리고 Dataflow 기법이 존재한다.

 

가장 먼저 Structural 모델링 기법으로 전가산기를 구현하려고 한다.

Structural Modeling

구조적 모델링은 하드웨어의 실제 연결을 기술하는 방식으로, 기본 게이트나 모듈 간 연결을 명시적으로 정의하는 특징을 지닌다.

 

구조적 모델링 기법을 활용하여 구현한 전가산기의 코드는 아래와 같다.

module full_adder_structural(
    input a, b, c,
    output sum, carry);

    wire sum_0, carry_0, carry_1;
    
    half_adder_structural ha0(.a(a), .b(b), .s(sum_0), .c(carry_0)); // 입력단자에는 입력할 포트의 이름을, 출력 단자에는 출력 될 포트의 이름을 괄호안에 넣는다.
    half_adder_structural ha1(.a(sum_0), .b(c), .s(sum), .c(carry_1));
    
    or (carry, carry_0, carry_1); // carry = carry_0 + carry_1
    
endmodule

 

전가산기의 물리적 구현을 위해서는 위에 언급했듯이 두 개의 반가산기를 필요로 한다. 따라서 두 개의 반가산기를 이어 줄 wire를 선언하였고, 포트들의 연결위치는 'half_adder_structural ha0(1)'에 표현을 하였다.

 

위의 코드를 실행시키면 다음과 같은 시뮬레이션이 출력되는 것을 확인할 수 있다.

전가산기 structural modeling 출력


다음은 Behavioral 모델링 기법을 활용하여 전가산기를 구현하려고 한다.

Behavioral Modeling

Behavioral 모델링 기법은 하드웨어의 동작을 기술하는 방식으로, 주로 알고리즘이나 동작의 순서를 정의하는 특징을 지닌다. 다시 말해 하드웨어의 동작을 절차적으로 기술하는 특징을 지닌다.

 

Behavioral 모델링 기법을 활용하여 구현한 전가산기의 코드는 아래와 같다.

module full_adder_behavioral(
    input a, b, c,
    output reg sum, carry);
    
    always @(*)begin
            case({a, b, c})
                3'b000: begin sum = 0; carry = 0; end
                3'b001: begin sum = 1; carry = 0; end
                3'b010: begin sum = 1; carry = 0; end
                3'b011: begin sum = 0; carry = 1; end
                3'b100: begin sum = 1; carry = 0; end
                3'b101: begin sum = 0; carry = 1; end
                3'b110: begin sum = 0; carry = 1; end
                3'b111: begin sum = 1; carry = 1; end
                default: begin sum = 0; carry = 0; end
            endcase         
    end
endmodule

 

always 문장 속 ' * ' 는 위에 선언된 변수 a, b, c 전체를 묶는 역할을 한다. 코드의 내용은 전가산기의 진리표를 그대로 넣은 듯 직관적으로 구현된 것을 확인할 수 있다.

 

위의 코드를 실행시키면 아래와 같은 전가산기의 출력이 확인된다.

전가산기 behavioral modeling 출력


마지막으로 Dataflow 모델링 기법을 활용하여 전가산기를 구현하려고 한다.

Dataflow

Dataflow 기법은 데이터의 흐름을 중심으로 하드웨어 동작을 기술하는 방식이다. 주로 연산자와 할당문을 사용하여 데이터의 처리 및 전달방식을 명확하게 표현한다.

 

Dataflow 기법을 활용하여 전가산기를 구현하면 아래와 같은 코드로 구현된다.

module full_adder_dataflow(
    input a, b, c,
    output sum, carry);
    
    wire [1:0] sum_value;
    
    assign sum_value = a + b + c;
    assign sum = sum_value[0];
    assign carry = sum_value[1];
    
endmodule

 

두 개의 비트로 구성된 ' sum_value '를 통해 ' sum ' 과 ' carry '를 직관적으로 확인할 수 있다.

 

위의 코드를 동작시키면 아래와 같은 시뮬레이션 결과가 도출되는것을 확인할 수 있다.

전가산기 dataflow modeling 출력

 

728x90

'Language > Verilog' 카테고리의 다른 글

Vivado : Edge Detector, Shift Register(SISO, SIPO, PISO, PIPO)  (2) 2024.07.16
Vivado : 동기식 카운터  (0) 2024.07.12
Vivado : Decoder, Encoder  (2) 2024.06.25
Vivado : 4bit 가산기  (0) 2024.06.16
Vivado : 논리 게이트 구현  (2) 2024.06.12