Half Adder
module half_adder(
input A, B,
output Sum, Carry
);
assign Sum = A ^ B;
assign Carry = A & B;
endmodule
Test Bench
module half_adder_tb;
reg A, B;
wire Sum, Carry;
half_adder uut (.A(A), .B(B), .Sum(Sum), .Carry(Carry));
initial begin
$monitor("A=%b B=%b | Sum=%b Carry=%b", A, B, Sum, Carry);
A=0; B=0; #10;
A=0; B=1; #10;
A=1; B=0; #10;
A=1; B=1; #10;
$finish;
end
endmodule
Full Adder
module full_adder(
input A, B, Cin,
output Sum, Carry
);
assign Sum = A ^ B ^ Cin;
assign Carry = (A & B) | (B & Cin) | (A & Cin);
endmodule
Test Bench
module full_adder_tb;
reg A, B, Cin;
wire Sum, Carry;
full_adder uut (.A(A), .B(B), .Cin(Cin), .Sum(Sum), .Carry(Carry));
initial begin
$monitor("A=%b B=%b Cin=%b | Sum=%b Carry=%b", A, B, Cin, Sum, Carry);
A=0; B=0; Cin=0; #10;
A=0; B=0; Cin=1; #10;
A=0; B=1; Cin=0; #10;
A=0; B=1; Cin=1; #10;
A=1; B=0; Cin=0; #10;
A=1; B=0; Cin=1; #10;
A=1; B=1; Cin=0; #10;
A=1; B=1; Cin=1; #10;
$finish;
end
endmodule
Full Adder using Half Adder
module full_adder_using_ha(
input A, B, Cin,
output Sum, Carry
);
wire s1, c1, c2;
// First Half Adder
half_adder ha1 (.A(A), .B(B), .Sum(s1), .Carry(c1));
// Second Half Adder
half_adder ha2 (.A(s1), .B(Cin), .Sum(Sum), .Carry(c2));
// Final Carry
assign Carry = c1 | c2;
endmodule
Test Bench
module fa_using_ha_tb;
reg A, B, Cin;
wire Sum, Carry;
full_adder_using_ha uut (
.A(A), .B(B), .Cin(Cin),
.Sum(Sum), .Carry(Carry)
);
initial begin
$monitor("A=%b B=%b Cin=%b | Sum=%b Carry=%b", A, B, Cin, Sum, Carry);
A=0; B=0; Cin=0; #10;
A=0; B=0; Cin=1; #10;
A=0; B=1; Cin=0; #10;
A=0; B=1; Cin=1; #10;
A=1; B=0; Cin=0; #10;
A=1; B=0; Cin=1; #10;
A=1; B=1; Cin=0; #10;
A=1; B=1; Cin=1; #10;
$finish;
end
endmodule