Personal Project/Binary Adder 구현
03 Parallel Adder Composed of Four Full Adders 구현
Orangetasteboy
2023. 6. 21. 13:44
- Based on a logic module, full adder, that adds two bits and a carry, design a 4-it adder. (Connect four of these modules together to form a 4-bit adder.)
[parallel_adder.v]
// Parallel Adder Composed of Four Full Adders 정의
module parallel_adder(Sum, C_out, A, B, C_in);
// 포트 선언
input [3:0] A, B; // 0~3비트끼지 사용 = 0~15까지 사용
input C_in;
output [3:0] Sum; // 0~3비트끼지 사용 = 0~15까지 사용
output C_out;
// Carry 포트 선언
wire C1, C2, C3;
/* 4개의 1-bit Full Adder
1번에서 만들어둔 1-bit Full Adder를 호출한다. */
full_adder fa0(Sum[0], C1, A[0], B[0], C_in);
full_adder fa1(Sum[1], C2, A[1], B[1], C1);
full_adder fa2(Sum[2], C3, A[2], B[2], C2);
full_adder fa3(Sum[3], C_out, A[3], B[3], C3);
endmodule
[tb_parallel_adder.v]
// 시뮬레이션을 위한 testbench
module tb_parallel_adder;
// input을 reg, output을 wire로 선언
reg [3:0] A, B; // 0~3비트끼지 사용 = 0~15까지 사용
reg C_in;
wire [3:0] sum; // 0~3비트끼지 사용 = 0~15까지 사용
wire C_out;
//full_adder 모듈 호출
parallel_adder u_parallel_adder(sum, C_out, A, B, C_in);
/* 시뮬레이션 결과 확인을 위해 모니터로 출력
$monitor는 신호의 값이 변할 때마다 출력 */
initial begin
$monitor($time, "A= %b, B= %b, C_in= %b, --- C_out= %b, sum = %b\n", A, B, C_in, C_out, sum);
end
initial begin
// A, B는 4비트 Decimal, C_in은 1비트 Binary로 초기값 설정
A = 4'd0; B = 4'd0; C_in = 1'b0;
/* 5만큼의 delay를 주면서 입력값 입력
몇 가지 경우의 입력값을 입력 */
#5 A = 4'd3; B = 4'd2; C_in=1'b0; // 3+2와 Carry가 0인 경우
#5 A = 4'd3; B = 4'd2; C_in=1'b1; // 3+2와 Carry가 1인 경우
#5 A = 4'd7; B = 4'd1; C_in=1'b0; // 7+1과 Carry가 0인 경우
#5 A = 4'd7; B = 4'd1; C_in=1'b1; // 7+1과 Carry가 1인 경우
#5 A = 4'd10; B = 4'd3; C_in=1'b0; // 10+3과 Carry가 0인 경우
#5 A = 4'd10; B = 4'd3; C_in=1'b1; // 10+3과 Carry가 1인 경우
#5 A = 4'd15; B = 4'd1; C_in=1'b0; // 15+1와 Carry가 0인 경우
#5 A = 4'd15; B = 4'd1; C_in=1'b1; // 15+1와 Carry가 1인 경우
end
endmodule
- Verify the design with simulation.
3+2와 Carry가 0인 경우, 3+2와 Carry가 1인 경우,
7+1과 Carry가 0인 경우, 7+1과 Carry가 1인 경우,
10+3과 Carry가 0인 경우, 10+3과 Carry가 1인 경우,
15+1과 Carry가 0인 경우, 15+1과 Carry가 1인 경우
총 8가지 경우의 수를 입력값으로 주었다.
3+2, 7+1, 10+3을 연산한 6가지 경우는 예상 연산값과 동일한 결과값이 출력되는 것을 확인할 수 있다.
15+1을 연산한 두 경우 모두 오버플로우가 일어나는 것을 확인할 수 있다.
본 프로젝트는 Parallel Adder Composed of Four Full Adders를 구현하는 프로젝트이다.
4비트의 수 2개를 덧셈하기 위해 1-Bit Full Adder 4개를 연결하여 각 자리수 별로 연산하도록 구현한다.
가장 오른쪽 모듈에서부터 연산을 시작하기 때문에 인간이 한 자리씩 연산하여 자리올림하는 방식과 동일하기 때문에 이해하기 쉽다.
하지만 첫 번째 연산 모듈에서 발생한 Carry를 마지막 모듈까지 전파하는 동안 Delay가 발생하고 연산하는 비트 수가 커질수록 이에 비례하여 Delay도 커진다.