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

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

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

첫 논리회로이기 때문에 과정까지 작성하였습니다.

 

Half Adder는 Input인 X와 Y를 더했을 때, 합은 Sum 올림은 Carry로 나타내 줍니다.

 

 

먼저 진리표를 보겠습니다.

 

INPUT OUTPUT
X Y Carry Sum
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

Half Adder는 간단하기 때문에 따로 카르노맵을 그리지 않아도 쉽게 구할 수 있습니다.

 

Carry의 경우, Input이 모두 1일 때 1이 출력됩니다.

따라서 AND 연산임을 알 수 있겠죠?

Carry = XY

 

Sum의 경우 두 Input이 서로 다를 때 1을 출력하고 있습니다.

따라서 XOR 연산임을 알 수 있습니다.

Sum = X ⊕ Y = X'Y + XY'

 

 

이제 게이트로 회로를 구성해 보겠습니다.

 

Half Adder

 

 


Verilog Code

이제 Half Adder를 Verilog HDL로 설계해보겠습니다.

 

저는 Xillinx 사의 Vivado를 이용해 디자인하였습니다.

 

 

DUT

`timescale 1ns / 1ps

module half_adder(
i_x,
i_y,
o_sum,
o_carry
    ) ;
    
input  i_x;
input  i_y;
output o_sum;
output o_carry;

assign o_sum   = i_x ^ i_y;
assign o_carry = i_x & i_y;

endmodule

 

Testbench

`timescale 1ns / 1ps

module tb_half_adder();

reg i_x;
reg i_y;
wire o_sum;
wire o_carry;

half_adder ha( .i_x     (i_x)     ,
               .i_y     (i_y)     ,
               .o_sum   (o_sum)   ,
               .o_carry (o_carry) );

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

 

Simulation

결과를 보면 진리표와 같은 값이 나온 것을 확인할 수 있습니다.

 

 

 

※ 참고로 assign문을 선언할 때는 결합연산자를 이용할 수도 있습니다.

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

 

 


 

댓글