[無에서 시작하는 컴퓨터&과학]

[컴퓨터][14] 산술/논리 연산 회로 - 2 (덧셈 회로 : 전가산기, 8bit 전가산기)

core-basic 2024. 9. 1. 20:50
728x90

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.


이전 글을 통해서

컴퓨터는 초기에 산술/논리 연산 등 수학적 계산을 자동화하고자 설계되었고,

이에 따라 산술/논리 연산 회로를 구현했다는 것을 알게 되었다.

이때 전자 회로는 본질적으로 전류가 흐르는가, 흐르지 않는가에 대해

참과 거짓으로 답할 수 있는 논리적 시스템이므로,

부울 대수를 통해서 전자 회로를 설계하고 구현할 수 있었다.

 

하지만 산술 연산은 숫자를 대상으로 하는 연산이기에,

부울 대수의 참과 거짓으로는 산술 연산 과정을 파악할 수 없었다.

 

따라서 두 가지 상태만으로 모든 숫자를 표현할 수 있는 이진법을

전자 회로와 부울 대수에 대응시켜 산술 과정을 논리적으로 파악할 수 있었다.

이에 따라

한 자리 덧셈 연산이 가능하나, 자리올림은 처리하지 못하는

반쪽짜리 덧셈회로, 반가산기(Half adder) 회로를 구현할 수 있었다.

 

[컴퓨터][13] 산술/논리 연산 회로 - 1 (이진법과 비트 그리고 반가산기)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.이전 글을 통해서 컴퓨터 설계 목적과 그 목적에 알맞은 폰 노이만 컴퓨터 구조를 살펴보았다.컴퓨터는 초기에

core-basic.tistory.com

반가산기는 이름 그대로 덧셈 연산에 절반의 기능만 하는 회로이다.

따라서 이번 글을 통해서 완전한 가산기 회로를

어떻게 구현할 수 있는지 탐구해 보겠다.

 

< 산술/논리 연산 회로 >
(전가산기, 8bit 전가산기) 


< 2bit(두 자릿수) 이진수 덧셈 >

반가산기 보다 좀 더 정교한 덧셈 회로를 구현하기 위해서는

자리올림을 처리해야 한다.

즉,

여러 자릿수를 더하는 연산을 할 경우,

아랫자리에서 생성되는 자리올림을 처리해야 한다

 

이에 대한 과정을 더 자세히 살펴보기 위해

두 개의 2비트 이진수 11, 11의 덧셈과정을 살펴보겠다.
11 + 11 = 110  (십진수 : 3 + 3 =  6 )

이때 출력은 최대 두 자릿수로 제한한다.

- 0 -
자리올림 비트의 값은 0으로 초기화한다.
(만약 0 번째 자리가 존재한다면 0번째 자리에서 발생된 자리올림 값은 0이다.)

- 1 -
두 개의 이진수의 1 번째 비트[첫 번째 자리]의 값을 더하여 
1 + 1 = 0 (자리올림 : 1)

- 2 -
 앞서 구한 합과 이전 0 번째에서 발생된 자리올림값을 더한다.
0 + 0 = 0 (자리올림 : 0)

- 3 -
“두 이진수의 1 번째 비트의 합 + 0 번째 자리올림 값”은
출력의 1 번째 비트[첫 번째 자리]의 값이 된다.

그리고 - 1 -,  - 2 -  에서 발생한 자리올림은 더하여,
두 번째 자릿수 덧셈에 사용된다.
(첫 번째 자리에서 생성된 자리올림 : 1 + 0 = 1 )

- 4 -
두 개의 이진수의 2 번째 비트[두 번째 자리]의 값을 더하여 
1 + 1 = 0 (자리올림 : 1)

- 5 -
 앞서 구한 합과 이전 1 번째에서 발생된 자리올림값을 더한다.
0 + 1 = 1 (자리올림 : 0)

- 6 -
“두 이진수의 2 번째 비트의 합 + 1 번째 자리올림 값”은
출력의 2 번째 비트[두 번째 자리]의 값이 된다.

그리고 - 1 -,  - 2 -  에서 발생한 자리올림은 더하여,
두 번째 자릿수 덧셈에 사용된다.
(첫 번째 자리에서 생성된 자리올림 : 1 + 0 = 1 )

 

따라서 출력은 최대 두 자릿수로 제한하였기에
'10 (자리올림 : 1) '이 된다.

 

위의 과정을 보면 -1-, -2-, -3- 의 내용이 반복적임을 알 수 있다.

따라서 반복적인 내용을 토대로 이진수 덧셈 과정을 요약하면

(1)
두 이진수의 k번째 비트의 값을 더해 합을 구한다.

(2)
두 이진수의 k번째 비트의 합과 k-1번째에서 발생된 자리올림 값을 더한다.

(3)
"두 이진수의 k번째 비트의 합 + k-1번째에서 생성된 자리올림 값"은
출력의 k번째 비트의 값이 된다.
그리고,
(1), (2)에서 발생한 자리올림 값을 더하여 다음 자릿수 덧셈의 입력이 된다.

 

이진수 덧셈 요약 과정에 대해서 모든 경우의 수를 표현할 경우 다음과 같다.

CI
[자리올림입력]
A

B

A + B

CO₁
[A+B 자리올림 출력]
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 0 0
1 0 1 1 0
1 1 0 1 0
1 1 1 0 1
(A + B) + CI

CO₂
[(A + B) +CI 자리올림 출력]
CO₁ + CO₂ = CO₃
[ 자리올림 출력 ]
0 0 0
1 0 0
1 0 0
0 0 1
1 0 0
0 1 1
0 1 1
1 0 1

그리고 위의 표를 논리 게이트와 비교해 보면

A + B의 결과는  A, B에 대해서 XOR게이트와 같고,

CO₁의 결과는 A, B에 대해서 AND게이트와 같고,

(A+B)+CI의 결과는 A, B, CI에 대해서 XOR게이트와 같고,

CO₂의 결과는 A, B, CI에 대해서 AND게이트와 같고,

CO₃의 결과는 C0₁, C0₂에 대해서 OR게이트와 같다.

따라서 이를 논리 게이트 표에 대응시키면 다음과 같다.

CI
[자리올림입력]
A B A XOR B

A + B
A AND B
CO₁
[A+B 자리올림 출력]
거짓(0) 거짓(0) 거짓(0) 거짓(0) 거짓(0)
거짓(0) 거짓(0) 참(1) 참(1) 거짓(0)
거짓(0) 참(1) 거짓(0) 참(1) 거짓(0)
거짓(0) 참(1) 참(1) 거짓(0) 참(1)
참(1) 거짓(0) 거짓(0) 거짓(0) 거짓(0)
참(1) 거짓(0) 참(1) 참(1) 거짓(0)
참(1) 참(1) 거짓(0) 참(1) 거짓(0)
참(1) 참(1) 참(1) 거짓(0) 참(1)
(A + B) XOR CI

(A + B) + CI
(A + B) AND CI
CO₂
[(A + B) +CI 자리올림 출력]
CO₁ OR CO₂  
CO₁ + CO₂ = CO₃
[ 자리올림 출력 ]
거짓(0) 거짓(0) 거짓(0)
참(1) 거짓(0) 거짓(0)
참(1) 거짓(0) 거짓(0)
거짓(0) 거짓(0) 참(1)
참(1) 거짓(0) 거짓(0)
거짓(0) 참(1) 참(1)
거짓(0) 참(1) 참(1)
참(1) 거짓(0) 참(1)

따라서 이진수 덧셈 과정을 모두 논리 게이트로 표현할 수 있으므로,

자리 올림까지 처리하는 덧셈 회로를 구현할 수 있다.


< 덧셈 회로 : 전가산기(full adder) 회로) >

입력으로 1bit 이진수의 값만 받을 수 있고,

출력도 1bit 이진수만 출력 가능한 덧셈 회로인

“1bit 전가산기 회로”는 다음과 같다.

 

< 0 + 0 + CI(0) = 0 (자리올림 : 0) >

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

< 0 + 1 + CI(0) = 1 (자리올림 : 0) >

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

< 1 + 0 + CI(0) = 1 (자리올림 : 0) >

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

< 1 + 1 + CI(0) = 0 (자리올림 : 1) >

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

< 0 + 0 + CI(1) = 1 (자리올림 : 0) >

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

< 0 + 1 + CI(1) = 0 (자리올림 : 1) >

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

< 1 + 0 + CI(1) = 0 (자리올림 : 1) >

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

 

< 1 + 1 + CI(1) = 1 (자리올림 : 1) >

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.


< 반가산기, 전가산기 기호 >

게이트 회로를 게이트 기호로 나타낼 수 있듯이

반가산기와 전가산기도 기호로 나타낼 수 있다.

따라서 우선 반가산기를 기호로 나타내면 다음과 같다.

A, B : 입력, SUM : A+B의 합, CO : 자리올림출력

그리고 반가산기 기호와 게이트 기호를 통해

전가산기 회로를 다음과 같이 더 간단히 나타 낼 수 있다.

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

더 나아가 전가산기도 하나의 기호로 나타낼 수 있다.


< 8bit 덧셈 회로 : 8bit 전가산기 >

앞에서는 1bit 이진수 덧셈만 가능한 회로를 구현하였다.

하지만 좀 더 실용적인 덧셈기로 활용하려면

더 다양한 크기의 숫자들을 처리할 수 있어야 한다.

따라서 전가산기 기호를 이용해 8비트 덧셈 회로를 설계하면서

전가산기를 확장하는 방법에 대해 알아보겠다.

다음 그림은 8bit 전가산기 회로이며, 예시로

0000 0010 + 0001 0000 = 0001 0010 (2+16 = 18) 계산을 확인할 수 있다.

※ 해당 이미지는 Paul falstad 사이트를 통해 제작하였습니다.

이 처럼 8개의 전가산기를 연속해서 연결하면 8bit 전가산기가 되고,

n개의 전가산기를 연속해서 연결하면 n bit 전가산기로 확장할 수 있다.

이는 n자릿수 덧셈 회로와 같다. 

 

이번 글은 요기서 마치며,

다음 글은 산술 연산 회로 중 덧셈 회로에 이어서

뺄셈 회로에 대해 탐구해 보겠다.


※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.

728x90