# 가산기

### 위키백과 ― 우리 모두의 백과사전.

가산기란 이진수의 덧셈을 하는 논리 회로이며 디지털 회로, 조합 회로의 하나이다. 전자계산기가 발명된 당시에는 진공관에 의해서 구성되었고 현재는 집적 회로로 설계되어서 다양한 기능을 가지는 것이다.

입력신호 전압의 덧셈을 출력하는 디지털 회로를 가산 회로라고도 부른다.

## [편집] 가산기의 종류

### [편집] 반가산기

반가산기 회로도

반가산기 (영어: half adder)는 이진수의 한자리수를 연산하고, 자리올림수는 자리올림수 출력 (영어: carry out)에 의하여 출력한다. AND, OR, NOT의 세가지 종류의 논리회로만으로 구성할 수 있다.

입력 A, 입력 B, 출력 (S), 자리올림수 출력(C)의 관계를 보여주는 진리표는 다음과 같다.

A B | C S
--- | ---
0 0 | 0 0
0 1 | 0 1
1 0 | 0 1
1 1 | 1 0

### [편집] 전가산기

전가산기 회로도

전가산기 (영어: full adder)는 이진수의 한자리수을 연산하고, 하위의 자리올림수 입력을 포함하여 출력한다. 하위의 자리올림수 출력을 상위의 자리올림수 입력에 연결함으로써 임의의 자리수의 이진수 덧셈이 가능해 진다. 하나의 전가산기는 두개의 반가산기와 하나의 OR로 구성된다.

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

입력 A, 입력 B, 자리올림수 입력 (X), 출력 (S), 자리올림수 출력 (C)의 관계를 보여주는 진리표는 다음과 같다.

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

## [편집] 복수비트의 가산기

### [편집] 리플 자리올림수 가산기

앞에 설명한 반가산기 한개로 이 전가산기를 몇개로 조합하는 과정에 의하여 임의의 자리수의 이진수 가산기를 구성할 수 있다. 아래그림은 4비트 가산기의 회로도이다. (A3A2A1A0+B3B2B1B0→C4S3S2S1S0)

4비트 가산기

### [편집] 자리올림수 예측 가산기

  이 부분의 본문은 자리올림수 예측 가산기입니다.

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

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

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

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

자리올림수 예측방식의 가산기

구체적으로는, S1를 생성하고 있는 전가산기의 자리올림수 입력은,

    X1 ← A0 AND B0

가 되어서, S2를 생성하고 있는 전가산기의 자리올림수 입력은,

    X2 ← (A1 AND B1) OR (A0 AND B0 AND A1) OR (A0 AND B0 AND B1)

가 된다. 게다가, S3를 생성하고 있는 전가산기의 자리올림수 입력은,

    X3 ← (A2 AND B2) OR (A1 AND B1 AND A2) OR (A1 AND B1 AND B2)
        OR (A0 AND B0 AND A1 AND A2) OR (A0 AND B0 AND A1 AND B2)
        OR (A0 AND B0 AND B1 AND A2) OR (A0 AND B0 AND B1 AND B2)

가 된다. 이와같이 자리수가 커지면 회로는 비약적으로 복잡하게 되지만, 모두 2단만으로 자리올림수 신호가 생성된다. (두개 입력의 AND이나 세개 입력의 AND도 회로상에서 트랜지스터를 직렬로 늘어놓으므로 1단임에는 변화가 없다. OR에 대해서도 동일함)

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

### [편집] 예측 자리올림수 장치

  이 부분의 본문은 예측 자리올림수 장치입니다.

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

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"의 계산을 할 수 있게 된다.

즉, 위의 감산은 다음의 순서로 계산할 수 있게 된다.

    1: 피감수 2840의 각 비트를 보수화 한다. → 7159
    2: 거기에 1을 더한다. → 7160
    3: 거기에 감수 5714를 더한다. → 12874
    4: 마지막으로 10000을 뺀다. → 2874

계산의 마지막에 감산이 나왔지만, 3:의 계산결과가 20000이상 되는 경우가 없는것을 생각하면, 이 계산은 단지 5자리수를 무시하는것 만으로 끝난다.

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

예시로 "100101-010110"이라는 계산은 다음의 순서로 계산할 수 있게 된다.

    1: 피감수 010110의 각 비트를 반전 (NOT)한다. → 101001
    2: 거기에 1을 더한다. → 101010
    3: 거기에 감수 100101을 더한다. → 1001111
    4: 최상위 비트를 무시한다. → 001111

이것을 회로로 그리면 다음과 같다.

6비트 감산기

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

## [편집] 같이 보기

- 감산기
- 논리 회로
- 논리 연산 (불 대수)
- 디지털 회로

원본 주소 ‘http://ko.wikipedia.org../../../%EA%B0%80/%EC%82%B0/%EA%B8%B0/%EA%B0%80%EC%82%B0%EA%B8%B0.html’

분류: 디지털 회로 | 컴퓨터 산술

##### Views

- 문서
- 토론
- 현재 버전

##### 찾기

##### 다른 언어

- Български
- Dansk
- Deutsch
- English
- Español
- Suomi
- Français
- Bahasa Indonesia
- Italiano
- 日本語
- Polski
- Svenska
- Українська