지난번 글 에서는 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가지 경우를 분석 해보겠습니다.

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

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)
);

테스트 벤치를 다음과 같이 짜보았습니다.
`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이됩니다.
다음내용은 다음에
'나의 전자 공부방 > Verilog 공부' 카테고리의 다른 글
| 클럭펄스 플립플롭 D플립플롭,T플립플롭,JK플립플롭, SR플립플롭 (1) | 2023.05.15 |
|---|---|
| 반감산기를 이용해 전감산기를 만들기 (1) | 2023.05.08 |
| 반감산기, 전감산기 , 4bit 전감산기 만들고 전감산기 테스트벤치로 검증하기. (0) | 2023.04.24 |
| 반가산기(halfadder) 2개로 전가산기(fulladder) 만들기, 테스트벤치짜기 (0) | 2023.04.23 |