{{위키데이터 속성 추적}}
{{다른 뜻|가산기 (계산기)||계산기}}
'''가산기'''(加算器, {{llang|en|adder}})란 [[덧셈]] 연산을 수행하는 [[논리 회로]]이며 [[디지털 회로]], 조합 회로의 하나이다. 가산기는 [[산술 논리 장치]]뿐만 아니라 주소값, 테이블 색인 등을 더하는 프로세서의 한 부분으로 사용되고 있다. [[이진화 십진법]], [[3 초과 부호]]와 같은 여러 가지 수학적 연산을 수행하는 가산기를 구성할 수 있지만, 대부분의 가산기는 [[2진법|2진수]]의 합을 계산한다. [[2의 보수]]나 [[1의 보수]]를 이용하여 음수를 표현하는 경우, 가산기를 [[가감산기]]로 사용한다. 다른 [[숫자의 부호 표현]]의 경우 더 복잡한 가산기를 필요로 한다.

[[전자계산기]]가 발명된 당시에는 [[진공관]]에 의해서 구성되었고 현재는 [[집적 회로]]로 설계되어서 다양한 기능을 가지는 것이다.
입력신호 [[전압]]의 덧셈을 출력하는 [[디지털 회로]]를 [[연산 회로|가산 회로]]라고도 부른다.

== 가산기의 종류 ==
=== 반가산기 ===
[[파일:Half-adder.svg|섬네일|반가산기 회로도]]
반가산기(半加算器, {{lang|en|half adder}})는 이진수의 한자리수를 연산하고, 자리올림수는 자리올림수 출력({{lang|en|carry out}})에 따라 출력한다. [[논리곱|AND]], [[논리합|OR]], [[부정|NOT]]의 세 가지 종류의 논리회로만으로 구성할 수 있다. 최종값은 2C+S와 같다.

입력 A, 입력 B, 출력 (S), 자리올림수 출력(C)의 관계를 보여주는 [[진리표]]는 다음과 같다.
{| class="wikitable"
|-align=center
!A  B
!C  S
|-
|0  0
|0  0
|-
|0  1
|0  1
|-
|1  0
|0  1
|-
|1  1
|1  0
|}

=== 전가산기 ===
[[파일:1-bit full-adder.svg|섬네일|right|1-bit 전가산기의 결선도 기호]]

전가산기(全加算器, {{lang|en|full adder}})는 이진수의 한 자릿수를 연산하고, 하위의 자리올림수 입력을 포함하여 출력한다. 하위의 자리올림수 출력을 상위의 자리올림수 입력에 연결함으로써 임의의 자리수의 이진수 덧셈이 가능해진다. 하나의 전가산기는 두개의 반가산기와 하나의 [[논리합|OR]]로 구성된다.

입력이 3개 존재해서 (입력 A, 입력 B, 자리올림수 입력) 모두 대등하게 동작한다. 하지만 회로상에서 3개 입력이 대칭되어 있다고 할 수 없다.

입력 A, 입력 B, 자리올림수 입력 (X=C<sub>in</sub>), 출력 (S), 자리올림수 출력 (C=C<sub>out</sub>)의 관계를 보여주는 진리표는 다음과 같다.
{| class="wikitable"
|-align=center
!A  B  X
!C  S
|-
|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
|}

[[파일:Full-adder.svg|섬네일|right|전가산기 회로도]]

전가산기는 전통적인 [[트랜지스터]] 수준의 회로나 여러 게이트들의 조합과 같이 여러 가지 방법으로 구현될 수 있다. 한 가지 예는 <math>S = A \oplus B \oplus C_{in}</math> 와 <math>C_{out} = (A \cdot B) + (C_{in} \cdot (A \oplus B))</math> 로 표현한 것이다. 이 구현 방식에서 자리올림수 출력 전의 마지막 OR 게이트를 XOR 게이트로 바꾸어도 논리값이 바뀌지 않을 것이다. 오직 두 가지 종류의 게이트를 사용하는 것이 칩 하나에 게이트 한 종류를 포함하는 간단한 IC 칩을 이용하여 전가산기를 구현할 때 유용하다.

전가산기는 또한 반가산기 두 개를 이용하여 구현할 수 있다. ''A''와 ''B''를 첫 번째 반가산기에 연결하고 그 출력값을 두 번째 반가산기의 입력에 연결한다. 그 후 두 번째 반가산기의 다른 입력에 ''C<sub>in</sub>''을 연결하여 두 번째 반가산기의 출력값이 ''S''값이 되고, 자리올림수 출력인 ''C<sub>out</sub>''은 두 반가산기의 자리올림수 출력을 OR 연산이 된다. 마찬가지로 ''S''는 ''A'', ''B'', ''C<sub>in</sub>'' 세 비트의 XOR 연산으로 만들어질 수 있으며 ''C<sub>out</sub>''은 ''A'', ''B'', ''C<sub>in</sub>'' 세 비트의 [[다수결 함수]]로 만들어질 수 있다.

== 복수비트의 가산기 ==
=== 리플 자리올림수 가산기 ===
복수의 전가산기를 이용하여 임의의 비트 수를 더하는 논리회로를 만들 수 있다. 각각의 전가산기가 자리올림수 입력 ''C<sub>in</sub>''으로 직전의 자리올림수 출력 ''C<sub>out</sub>''을 받는 형식으로, 자리올림수가 ''물결(ripple)''치듯 다음 가산기로 옮겨 간다고 하여 리플 캐리 가산기라 한다. 첫 번째 전가산기에 한하여 반가산기로 대체될 수 있다.

리플 자리올림수 가산기는 틀이 간단하여 빠르게 디자인할 수 있는 장점이 있다. 하지만 전가산기의 자리 올림수 입력이 이전 가산기의 자리 올림수 출력이므로 하나의 전가산기가 계산되기 위해 이전 가산기의 연산을 기다려야한다. 이 때문에 비트 수가 커질수록 연산이 느려지는 단점이 있다. 이 [[회로 지연|전달 지연]]은 전가산기의 회로를 보면 쉽게 계산할 수 있다. 각 전가산기는 3레벨의 로직을 필요로 하는데, N비트 가산기의 경우, 임계 경로(critical path) 회로 지연은 3(첫 가산기의 지연 시간) + 2*(N-1)(다음차 가산기의 지연 시간, 주어진 두 수의 합은 자리 올림수가 도달하기 전에 미리 계산되어 있다) 값을 가지게 된다. 이는 ''2N''에 해당하는 회로 지연을 가지며, AND, OR 게이트로 구성된 가산기의 경우 ''3N''에 해당하는 회로 지연을 갖는다.
아래 그림은 4비트 가산기의 회로도이다. (A<sub>3</sub>A<sub>2</sub>A<sub>1</sub>A<sub>0</sub>+</sub>B<sub>3</sub>B<sub>2</sub>B<sub>1</sub>B<sub>0</sub>→C<sub>4</sub>S<sub>3</sub>S<sub>2</sub>S<sub>1</sub>S<sub>0</sub>)
[[파일:4-bit_ripple_carry_adder.svg|섬네일|none|505px|4비트 가산기]]

=== 자리올림수 예측 가산기 ===
{{본문|자리올림수 예측 가산기}}

덧셈은 정보 처리의 기본이기 때문에 고속 정보처리를 위해서 우선 가산기 동작의 고속화가 요구된다. 논리회로의 동작속도는 입력에서 출력까지 사이에 있는 논리소자(논리곱이나 논리합 회로)의 개수가 크게 영향을 주기 때문에 가산기에서 이 단수를 고찰해 보자.

위의 반가산기는 입력 A와 B로부터 출력 S까지의 기본 논리소자의 단수는 2이고, 출력 C까지의 기본 논리소자의 단수는 1이다. (일반적으로 NOT은 단수에 포함하지 않는다. 기본 논리소자를 구성하는 회로의 입력용 트랜지스터를 반대로 사용하는 것만으로 NOT를 구현할 수 있기 때문이다.)

동일하게 전가산기는 S의 단수는 4이고, C의 단수도 4가 된다. 이것보다 위의 4자리수 가산기에서 최대의 단수가 되는 입력 A<sub>0</sub>에서 C<sub>4</sub>출력까지는 전가산기 C의 단수 × 4, 즉 4 x 4 = 16단이 된다.

자리수가 커지면 이 단수는 고속처리의 큰 장해가 된다. 그렇기 때문에 단수를 크게하는 자리올림수 신호(캐리어 신호)의 부분을 따로 계산하여 단수를 줄이는 방법이 자주 행해진다. 이 자리올림수 신호를 다른 논리회로로 생성하는 방법을 '''자리올림수 예측'''({{lang|en|carry look ahead}})라고 부른다.

[[파일:4-bit_carry_lookahead_adder.svg|섬네일|none|505px|자리올림수 예측방식의 가산기]]
구체적으로는, S<sub>1</sub>를 생성하고 있는 전가산기의 자리올림수 입력은,
 X<sub>1</sub> ← A<sub>0</sub> AND B<sub>0</sub>
가 되어서, S<sub>2</sub>를 생성하고 있는 전가산기의 자리올림수 입력은,
 X<sub>2</sub> ← (A<sub>1</sub> AND B<sub>1</sub>) OR (A<sub>0</sub> AND B<sub>0</sub> AND A<sub>1</sub>) OR (A<sub>0</sub> AND B<sub>0</sub> AND B<sub>1</sub>)
가 된다. 게다가, S<sub>3</sub>를 생성하고 있는 전가산기의 자리올림수 입력은,
 X<sub>3</sub> ← (A<sub>2</sub> AND B<sub>2</sub>) OR (A<sub>1</sub> AND B<sub>1</sub> AND A<sub>2</sub>) OR (A<sub>1</sub> AND B<sub>1</sub> AND B<sub>2</sub>)
     OR (A<sub>0</sub> AND B<sub>0</sub> AND A<sub>1</sub> AND A<sub>2</sub>) OR (A<sub>0</sub> AND B<sub>0</sub> AND A<sub>1</sub> AND B<sub>2</sub>)
     OR (A<sub>0</sub> AND B<sub>0</sub> AND B<sub>1</sub> AND A<sub>2</sub>) OR (A<sub>0</sub> AND B<sub>0</sub> AND B<sub>1</sub> AND B<sub>2</sub>)
가 된다. 이와 같이 자릿수가 커지면 회로는 비약적으로 복잡하게 되지만, 모두 2단만으로 자리올림수 신호가 생성된다. (두 개 입력의 AND이나 세 개 입력의 AND도 회로상에서 트랜지스터를 직렬로 늘어놓으므로 1단임에는 변화가 없다. OR에 대해서도 동일함)

이 방법을 이용하면, 자리수가 몇 개가 되어도 4단만 필요하기 때문에 획기적인 고속화를 도모할 수 있다. 그러나, 필요한 회로 소자 수가 현격히 많아지기 때문에 소비전력과 회로의 비용이 커지게 된다.

=== 예측 자리올림수 장치 ===
{{본문|예측 자리올림수 장치}}

복수 자리올림수 예측 가산기를 조합하여 더 큰 가산기라도 만들 수 있다. 이것은 더 큰 가산기를 만드는 복수 단계에 사용할 수 있다. 예시로, 아래의 가산기는 자리올림수 예측 장치의 두 단계와 16 4비트 자리올림수 예측 가산기를 사용한 64비트 가산기이다.

[[파일:64-bit lookahead carry unit.svg|none|framed|64비트 가산기]]

== 감산기 ==
{{본문|감산기}}

일반적으로 감산은 가산기에 옮겨서 계산할 수 있다. 우선은 이해하기 쉽게 십진수로 생각해 보자.

예시로 4자리수의 "5714 - 2840"라는 계산을 생각하자. 이 감산을 직접 계산하는 대신에 이 식을 "5714 + 1 + (9999 - 2840) - 10000"라고 고쳐 써 보자.

"9999 - 2840"의 부분은 "7159"이지만, 9999에서 4자리수를 빼는 경우에 자리빌림수가 발생하지 않기 때문에 다른 자리수를 고려할 필요가 없고, 각 행마다 "9-2", "9-8", "9-4", "9-0"을 행하면 된다. 즉 "더하면 9가 되는 수"에 각 비트를 옮겨놓는 것만으로 "9999 - 2840"의 계산을 할 수 있게 된다.

즉, 위의 감산은 다음의 순서로 계산할 수 있게 된다.
<syntaxhighlight lang="text" line>
 피감수 2840의 각 비트를 보수화 한다. →  7159
 거기에 1을 더한다.               →  7160
 거기에 감수 5714를 더한다.        → 12874
 마지막으로 10000을 뺀다.         →  2874
</syntaxhighlight>
계산의 마지막에 감산이 나왔지만, 3행의 계산 결과가 20000 이상 되는 경우가 없는 것을 생각하면, 이 계산은 단지 만의 자리수를 무시하는 것만으로 끝난다.

그런데 이진수로 같은 계산을 생각하면 9의 보수 대신에 1의 보수를 계산할 수 있으며, 감산에 가산기를 이용하여 계산할 수 있음을 알 수 있다. 1의 보수는 "더해서 1이 되는수"이므로, 이진수의 경우에 "0 → 1", "1 → 0"이 되며, 이것은 NOT과 동일하다.

예시로 "100101-010110"이라는 계산은 다음의 순서로 계산할 수 있게 된다.
<syntaxhighlight lang="text" line>
 피감수 010110의 각 비트를 반전(NOT)한다. →  101001
 거기에 1을 더한다.                    →  101010
 거기에 감수 100101을 더한다.           → 1001111
 최상위 비트를 무시한다.                 →  001111
</syntaxhighlight>
이것을 회로로 그리면 다음과 같다.

[[파일:Subtracter.png|섬네일|none|505px|전가산기(全加算器)를 이용한 6비트 감산기]]

이 회로는 최하위 비트의 가산에 반가산기가 아닌 전가산기를 사용해서, 자리올림수 입력 X를 강제적으로 1로 함에 따라 위의 2행과 3행을 동시에 행하고 있는 것에 주의하자. 또한, 이 회로에서는 뺄셈의 결과가 음의 수가 되는 경우에만 출력 C가 0이 된다.

== 같이 보기 ==
* [[감산기]]
* [[논리 회로]]
* [[논리 연산]] ([[불 대수]])
* [[디지털 회로]]

[[분류:디지털 전자공학]]
[[분류:컴퓨터 산술]]