본문 바로가기
Digital Design/논리회로

[논리회로] Full Adder (Design with Verilog)

by 스테고사우르스 2022. 12. 29.

Full Adder는 Input X, Y에 들어온 Carry_in 까지 합쳐서 더하는 모듈입니다.

 

이번에도 Verilog를 이용해 Full Adder를 설계하였습니다.

 

진리표부터 보겠습니다.

 

INPUT OUTPUT
X Y Cin Cout Sum
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

 Half Adder와 다르게 경우의 수가 많아져서 카르노맵을 그려보는 것이 좋습니다.

 

카르노맵을 그리는 과정은 생략하고 바로 결과를 보면,

 

Sum = X ⊕ Y ⊕ Cin

Cout = XY + YCin + CinX

 

 

이것을 게이트로 표현한 그림입니다.

Full Adder

중간에 XOR gate와 AND gate가 보이시나요?

맞습니다. Half Adder와 같습니다.

 

이처럼 Full Adder는 Half Adder 2개를 연결하여 나타낼 수 있습니다.

 

 


Verilog Code

Full Adder의 Verilog Code입니다. Behavioral Coding 스타일로 디자인하였습니다.

 

DUT

`timescale 1ns / 1ps

module full_adder(
i_x,
i_y,
i_cin,
o_sum,
o_cout
);

input i_x, i_y, i_cin;
output o_sum, o_cout;

assign {o_cout, o_sum} = {1'b0, i_x} + {1'b0, i_y} + {1'b0, i_cin};

endmodule

 

 

Testbench

`timescale 1ns / 1ps

module tb_full_adder();

reg i_x, i_y, i_cin;
wire o_sum, o_cout;

full_adder fa ( .i_x    (i_x)    ,
                .i_y    (i_y)    ,
                .i_cin  (i_cin)  ,
                .o_sum  (o_sum)  ,
                .o_cout (o_cout) );

initial begin
    i_x = 1'b0; i_y = 1'b0; i_cin = 1'b0; #10
    i_x = 1'b0; i_y = 1'b0; i_cin = 1'b1; #10
    i_x = 1'b0; i_y = 1'b1; i_cin = 1'b0; #10
    i_x = 1'b0; i_y = 1'b1; i_cin = 1'b1; #10
    i_x = 1'b1; i_y = 1'b0; i_cin = 1'b0; #10
    i_x = 1'b1; i_y = 1'b0; i_cin = 1'b1; #10
    i_x = 1'b1; i_y = 1'b1; i_cin = 1'b0; #10
    i_x = 1'b1; i_y = 1'b1; i_cin = 1'b1; #10
    
    $finish;
end

 

Simulation

 

 

 


 

댓글