본문 바로가기
나의 전자 공부방/Verilog 공부

반가산기(halfadder) 2개로 전가산기(fulladder) 만들기, 테스트벤치짜기

by 나만의생각 2023. 4. 23.

halfadder를 우선적으로 만들고 halfadder2개로 fulladder를 만들어보고 테스트벤치로 검증하는 절차를 거치겠습니다.

 

half adder 진리표

 

half adder의 진리표는 위의 그림과 같습니다. 이에 따라서 vivado에 코드를 작성해보면 다음과같습니다.

 

`timescale 1ns/ 1ps

module half_adder(half_a, half_b, carry, sum);
input half_a, half_b;
output carry, sum;

xor(sum, half_a, half_b);
and(carry, half_a, half_b);

endmodule

a와 b가 한개만 1 일때 sum의 출력이 1로 나오게 됩니다. 따라서 xor을 사용합니다.

 

a와 b가 모두다 1일때 carry의 출력이 1로나오게 됩니다. 따라서 and를 사용합니다.

half_adder RTL

RTL로 만들게되면 다음과같은 그림이 나오게됩니다. 테스트 벤치를 짜 검증하는 절차를 가져보겠습니다.

 

testbench

테스트 벤치는 다음과같습니다.  위의 표의 진리표와 똑같이 나온것을 보아 회로는 잘 만들어졌고, 검증이 완료되었습니다.

 

다음은 같은방식으로 Fulladder를 만들어보겠습니다.

full adder 진리표

Fulladder를 진리표를 참고하여 만들어보면 다음과같습니다.

 

a,b,cin은 입력단이고 cout과 sum은 출력단입니다.

module full_adder (a, b, full_cin,full_cout,sum);
input a, b, full_cin;
output full_cout,sum;
wire ha1_to_ha2_sum, wire_cout2, wire_cout1;

half_adder inst_ha1(.half_a(a), .half_b(b), .carry(wire_cout1), .sum(ha1_to_ha2_sum));
half_adder inst_ha2(.half_a(ha1_to_ha2_sum), .half_b(full_cin), .carry(wire_cout2), .sum(sum));
assign full_cout = wire_cout1|wire_cout2;
endmodule

half_adder를 2개사용할 예정이기때문에 fulladder의 변수에 맞춰서 instiate를 해줍니다.

 

fulladder
fulladder Testbench

fulladder를 테스트 벤치를 짜보았을때 다음과 같이 진리표와 동일하게 나온것으로 보아 회로 구성이 잘 되었습니다.

 

 

다음내용은 다음에