Full Subtractor (전감산기) 입니다.
먼저 진리표입니다.
INPUT | OUTPUT | |||
X | Y | Borrow_in | Difference | Borrow_out |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
Difference = X ⊕ Y ⊕ B_in
Borrow_out = X'Y + YBin + BinX'
이 결과를 바탕으로 회로를 만들어보면 다음과 같습니다.
Full Subtractor 역시 마찬가지로 Full Adder에 NOT gate만 추가해 주면 됩니다.
또한 Half Subtractor 두 개로 나누어 표현하여도 됩니다.
Verilog Code
Full Subtractor를 Verilog로 설계하였습니다.
DUT
`timescale 1ns / 1ps
module full_subtractor(
i_x,
i_y,
i_bor,
o_diff,
o_bor
);
input i_x, i_y, i_bor;
output o_diff, o_bor;
assign o_diff = i_x ^ i_y ^ i_bor;
assign o_bor = ((~i_x) & i_y) | ((~i_x) & i_bor) | (i_bor & i_y);
endmodule
Testbench
`timescale 1ns / 1ps
module tb_full_subtractor();
reg i_x, i_y, i_bor;
wire o_diff, o_bor;
full_subtractor fs ( .i_x (i_x) ,
.i_y (i_y) ,
.i_bor (i_bor) ,
.o_diff (o_diff) ,
.o_bor (o_bor) );
initial begin
i_x = 1'b0; i_y = 1'b0; i_bor = 1'b0; #10
i_x = 1'b0; i_y = 1'b0; i_bor = 1'b1; #10
i_x = 1'b0; i_y = 1'b1; i_bor = 1'b0; #10
i_x = 1'b0; i_y = 1'b1; i_bor = 1'b1; #10
i_x = 1'b1; i_y = 1'b0; i_bor = 1'b0; #10
i_x = 1'b1; i_y = 1'b0; i_bor = 1'b1; #10
i_x = 1'b1; i_y = 1'b1; i_bor = 1'b0; #10
i_x = 1'b1; i_y = 1'b1; i_bor = 1'b1; #10
$finish;
end
endmodule
Simulation
'Digital Design > 논리회로' 카테고리의 다른 글
[논리회로] Multiplexer (Design with Verilog) (1) | 2023.01.02 |
---|---|
[논리회로] Decoder (Design with Verilog) (1) | 2023.01.02 |
[논리회로] Half Subtractor (Design with Verilog) (1) | 2022.12.30 |
[논리회로] Full Adder (Design with Verilog) (1) | 2022.12.29 |
[논리회로] Half Adder (Design with Verilog) (1) | 2022.12.29 |
댓글