가산기는 두 숫자의 덧셈을 수행하는 디지털 구성요소입니다. 프로세서의 ALU 내부 주요 구성요소이며 주소 증가, 테이블 인덱스, 버퍼 포인터 등 덧셈이 필요한 많은 곳에서 사용됩니다.
풀 가산기는 다른 입력 이진수들과 함께 캐리 입력을 더해 합(sum)과 캐리 출력(carry output)을 생성합니다.
진리표
A
B
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
설계
아래는 두 이진수를 신호 a와 b로 받아들이는 4비트 가산기 예제로, 둘 다 4비트 폭입니다. 가산기는 조합 회로이므로 Verilog에서 assign을 사용한 연속 할당이나 모든 입력을 포함하는 민감도 리스트를 가진 always 블록으로 모델링할 수 있습니다. 아래 코드는 전자의 접근 방식입니다.
module fulladd (
input [3:0] a,
input [3:0] b,
input c_in,
output c_out,
output [3:0] sum
);
assign {c_out, sum} = a + b + c_in;
endmodule
아래 코드는 입력 중 어느 것이든 값이 변경될 때마다 실행되는 always 블록을 사용합니다.
module fulladd (
input [3:0] a,
input [3:0] b,
input c_in,
output reg c_out,
output reg [3:0] sum
);
always @ (a or b or c_in) begin
{c_out, sum} = a + b + c_in;
end
endmodule
하드웨어 회로도
테스트벤치
module tb_fulladd;
// 1. 테스트벤치 변수 선언
reg [3:0] a;
reg [3:0] b;
reg c_in;
wire [3:0] sum;
integer i;
// 2. 설계 인스턴스화 및 테스트벤치 변수와 연결
fulladd fa0 (
.a (a),
.b (b),
.c_in (c_in),
.c_out (c_out),
.sum (sum)
);
// 3. 설계 테스트를 위한 자극 제공
initial begin
a <= 0;
b <= 0;
c_in <= 0;
$monitor ("a=0x%0h b=0x%0h c_in=0x%0h c_out=0x%0h sum=0x%0h", a, b, c_in, c_out, sum);
// for 루프를 사용하여 입력에 랜덤 값 적용
for (i = 0; i < 5; i = i + 1) begin
#10 a <= $random;
b <= $random;
c_in <= $random;
end
end
endmodule
a와 b가 더해져 4비트보다 큰 숫자가 되면 합은 0으로 롤오버되고 c_out은 1이 됩니다. 예를 들어 노란색으로 하이라이트된 줄은 0x11이 되어 하위 4비트가 sum에 할당되고 비트#4가 c_out에 할당됩니다.