Full Adder는 Input X, Y에 들어온 Carry_in 까지 합쳐서 더하는 모듈입니다.
이번에도 Verilog를 이용해 Full Adder를 설계하였습니다.
진리표부터 보겠습니다.
INPUT | OUTPUT | |||
X | Y | Cin | Cout | Sum |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
Half Adder와 다르게 경우의 수가 많아져서 카르노맵을 그려보는 것이 좋습니다.
카르노맵을 그리는 과정은 생략하고 바로 결과를 보면,
Sum = X ⊕ Y ⊕ Cin
Cout = XY + YCin + CinX
이것을 게이트로 표현한 그림입니다.
중간에 XOR gate와 AND gate가 보이시나요?
맞습니다. Half Adder와 같습니다.
이처럼 Full Adder는 Half Adder 2개를 연결하여 나타낼 수 있습니다.
Verilog Code
Full Adder의 Verilog Code입니다. Behavioral Coding 스타일로 디자인하였습니다.
DUT
`timescale 1ns / 1ps
module full_adder(
i_x,
i_y,
i_cin,
o_sum,
o_cout
);
input i_x, i_y, i_cin;
output o_sum, o_cout;
assign {o_cout, o_sum} = {1'b0, i_x} + {1'b0, i_y} + {1'b0, i_cin};
endmodule
Testbench
`timescale 1ns / 1ps
module tb_full_adder();
reg i_x, i_y, i_cin;
wire o_sum, o_cout;
full_adder fa ( .i_x (i_x) ,
.i_y (i_y) ,
.i_cin (i_cin) ,
.o_sum (o_sum) ,
.o_cout (o_cout) );
initial begin
i_x = 1'b0; i_y = 1'b0; i_cin = 1'b0; #10
i_x = 1'b0; i_y = 1'b0; i_cin = 1'b1; #10
i_x = 1'b0; i_y = 1'b1; i_cin = 1'b0; #10
i_x = 1'b0; i_y = 1'b1; i_cin = 1'b1; #10
i_x = 1'b1; i_y = 1'b0; i_cin = 1'b0; #10
i_x = 1'b1; i_y = 1'b0; i_cin = 1'b1; #10
i_x = 1'b1; i_y = 1'b1; i_cin = 1'b0; #10
i_x = 1'b1; i_y = 1'b1; i_cin = 1'b1; #10
$finish;
end
Simulation
'Digital Design > 논리회로' 카테고리의 다른 글
[논리회로] Full Subtractor (Design with Verilog) (1) | 2023.01.02 |
---|---|
[논리회로] Half Subtractor (Design with Verilog) (1) | 2022.12.30 |
[논리회로] Half Adder (Design with Verilog) (1) | 2022.12.29 |
[논리회로] 여러가지 게이트(Gate) 2 (1) | 2022.12.29 |
[논리회로] 여러가지 게이트(Gate) 1 (3) | 2022.12.29 |
댓글