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

fulladder 4개를 연결하여 4비트 전가산기 만들고 검증하기, 전가산기 4bit 2개 연결

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

지난번 글 에서는 halfadder 2개로 fulladder1개를 만들었습니다. 이번에는 fulladder를 4개 연결하여서 4비트 전가산기를 만들어보겠습니다.

 

4비트 풀 애더(Full Adder)는 2개의 4비트 이진수와 캐리(Carry) 입력 비트를 더하고, 4비트 합과 캐리 아웃(Carry-out) 비트를 출력하는 디지털 회로입니다. 이는 큰 이진수 덧셈 회로를 구성하는 빌딩 블록으로, 마이크로프로세서, 산술 논리 장치(ALU) 및 이진수 덧셈을 필요로 하는 다른 디지털 시스템에서 자주 사용됩니다.

 

module full_adder_4bit (a, b, full_cin,full_cout,sum);
input [3:0] a,b;
input full_cin;
output full_cout;
output [3:0]sum;

wire cout1, cout2, cout3;

full_adder full_adder_4bit0(.a(a[0]), .b(b[0]), .full_cin(full_cin), .full_cout(cout1),.sum(sum[0]));
full_adder full_adder_4bit1(.a(a[1]), .b(b[1]), .full_cin(cout1), .full_cout(cout2), .sum(sum[1]));
full_adder full_adder_4bit2(.a(a[2]), .b(b[2]), .full_cin(cout2), .full_cout(cout3), .sum(sum[2]));
full_adder full_adder_4bit3(.a(a[3]), .b(b[3]), .full_cin(cout3), .full_cout(full_cout), .sum(sum[3]));

endmodule

 

모든 경우의수를 보는 테스트벤치는 다음과 같습니다.

 

module tb_full_adder_4bit;
    reg [3:0] a, b;
    reg full_cin;
    wire full_cout;
    wire [3:0] sum;
    
    full_adder_4bit tb_full_adder_4bit (.a(a), .b(b), .full_cin(full_cin), .full_cout(full_cout), .sum(sum));
    
    integer i, j, k;
    
    initial begin

        for (i = 0; i < 16; i = i + 1) begin
            for (j = 0; j < 16; j = j + 1) begin
                for (k = 0; k < 2; k = k + 1) begin
                    a = i;
                    b = j;
                    full_cin = k;
                    #5;
                end
            end
        end

    end
endmodule

 

 

이 테스트벤치를 이용해 2가지 경우를 분석 해보겠습니다.

 

0010일 경우

a가 0010일때 b를 0000부터 1111까지 주엇고, cin은 0과 1을 반복적으로 실행시켰습니다. 이때, 0010과 1101일때 cin이 없을경우는 carry가 발생하지 않았지만 cin이 1일때 carry가 발생하는 모습을 볼수있습니다. 이에 따라 4비트 전가산기를 잘 만들었다고 검증할수 있습니다.

 

 

 

1110일경우

a가 1110일때도 마찬가지로  b를 0000~1111까지 주엇는데 1110과 0001을 cin일떄 carry가 주어지는 모습을 볼수있습니다.

 

module tb_full_adder_4bit_x2;

  // Inputs
  reg [7:0] a;
  reg [7:0] b;
  reg full_cin;

  // Outputs
  wire full_cout;
  wire [7:0] sum;

  full_adder_4bit_x2 uut(
    .a(a),
    .b(b),
    .full_cin(full_cin),ㅐ
    .full_cout(full_cout),
    .sum(sum)
  );

전가산기 2개 연결

테스트 벤치를 다음과 같이 짜보았습니다.

`timescale 1ns/1ps

module tb_full_adder_4bit_x2;

  // Inputs
  reg [7:0] a;
  reg [7:0] b;
  reg full_cin;
  
  // Outputs
  wire full_cout;
  wire [7:0] sum;
  
  full_adder_4bit_x2 fa4_8bit(
    .a(a), 
    .b(b), 
    .full_cin(full_cin), 
    .full_cout(full_cout), 
    .sum(sum)
  );
  
  initial begin
    a = 0;
    b = 0;
    full_cin = 0;
    
    #50;
	repeat(256) begin
      #10 a = $random;
      #10 b = $random;
      #10 full_cin = $random;
	end
end
endmodule

 

예시를 들어 검증해보겠습니다.

 

 

 

캐리가 발생하기전의 a는 00100000이고 b는 10101010입니다 cin이 1이나 0이나 상관없이 full_cout은 0이됩니다.

캐리가 발생한 a의 10010110과 10101010은 carry가 방생해 full_cout이 1이됩니다.

 

 

다음내용은 다음에