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도 커진다.