오늘은 Verilog를 사용하여 4비트 Adder를 구현하는 여러 가지 방법을 소개하겠습니다. 각각의 방법은 구조적 모델링, 동작적 모델링, 데이터 플로우 모델링을 사용합니다.
4비트 Adder는 4개의 Full Adder를 사용하여 구현할 수 있습니다. 아래는 구조적 모델링을 사용한 4비트 Adder의 Verilog 코드입니다.
module fadderr_4bits_s(
input [3:0] a, b,
input cin,
output [3:0] sum,
output carry
);
wire [2:0] carry_w;
full_adder_structural fa0(.a(a[0]), .b(b[0]), .c(cin), .sum(sum[0]), .carry(carry_w[0]));
full_adder_structural fa1(.a(a[1]), .b(b[1]), .c(carry_w[0]), .sum(sum[1]), .carry(carry_w[1]));
full_adder_structural fa2(.a(a[2]), .b(b[2]), .c(carry_w[1]), .sum(sum[2]), .carry(carry_w[2]));
full_adder_structural fa3(.a(a[3]), .b(b[3]), .c(carry_w[2]), .sum(sum[3]), .carry(carry));
endmodule
이 코드는 4개의 full_adder_structural 모듈을 사용하여 4비트 Adder를 구현합니다. 각 Full Adder는 이전 단계의 캐리 출력을 다음 단계의 캐리 입력으로 사용합니다.
데이터 플로우 모델링을 사용하여 4비트 Adder를 구현할 수도 있습니다. 아래는 데이터 플로우 모델링을 사용한 4비트 Adder의 Verilog 코드입니다.
module fadder__4bits_dataflow(
input [3:0] a, b,
input cin,
output [3:0] sum,
output carry
);
wire [4:0] sum_value;
assign sum_value = a + b + cin;
assign sum = sum_value[3:0];
assign carry = sum_value[4];
endmodule
이 코드는 a, b, cin의 합을 sum_value로 계산하고, 그 결과의 하위 4비트를 sum으로, 상위 비트를 carry로 할당합니다.
4비트 Adder/Subtractor는 더하기와 빼기를 모두 수행할 수 있는 회로입니다. 아래는 구조적 모델링과 데이터 플로우 모델링을 사용한 4비트 Adder/Subtractor의 Verilog 코드입니다
module fadd_sub_4bits_s(
input [3:0] a, b,
input s,
output [3:0] sum,
output carry
);
wire [2:0] carry_w;
wire [3:0] b_w;
xor(b_w[0], b[0], s);
xor(b_w[1], b[1], s);
xor(b_w[2], b[2], s);
xor(b_w[3], b[3], s);
full_adder_structural fa0(.a(a[0]), .b(b_w[0]), .c(s), .sum(sum[0]), .carry(carry_w[0]));
full_adder_structural fa1(.a(a[1]), .b(b_w[1]), .c(carry_w[0]), .sum(sum[1]), .carry(carry_w[1]));
full_adder_structural fa2(.a(a[2]), .b(b_w[2]), .c(carry_w[1]), .sum(sum[2]), .carry(carry_w[2]));
full_adder_structural fa3(.a(a[3]), .b(b_w[3]), .c(carry_w[2]), .sum(sum[3]), .carry(carry));
endmodule
module fadd_sub_4bits(
input [3:0] a, b,
input s,
output [3:0] sum,
output carry
);
wire [4:0] result;
assign result = s ? a - b : a + b;
assign sum = result[3:0];
assign carry = s ? ~result[4] : result[4];
endmodule
구조적 모델링을 사용한 fadd_sub_4bits_s 모듈은 XOR 게이트를 사용하여 b와 s를 XOR 연산한 후 Full Adder를 사용하여 계산합니다. 데이터 플로우 모델링을 사용한 fadd_sub_4bits 모듈은 삼항 연산자를 사용하여 더하기와 빼기를 수행합니다.