컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (11)

나빌레라의 이미지

#11. 더하기.

이 이야기를 하고 있는 나는 국민학교에 입학해서 초등학교를 졸업했다. 아니 좀더 정확히 옆 학교는 초등학교였고 나는 국민학교 졸업장을 받았다. 같은 학교를 졸업한 내 동생은 초등학교를 졸업했다. 중요한 것은 초등학교, 국민학교가 아니다. 우리가 정규 교육을 처음 시작하면서 산수라는 것을 배울 때 숫자 읽는 법을 배우고 사칙 연산을 배운다. 그 사칙 연산 중 가장 먼저 배우는 것이 더하기다. 요즘 애들은 학교 가기전에 유치원에서 이미 다 배우고 간다. 그만큼 더하기는 쉬운 계산이다.

어쩜 이리 컴퓨터는 사람과 비슷한지. 역시 컴퓨터에게도 더하기를 먼저 가르쳐 준다. 다만 사람은 더하기 다음에 빼기, 곱하기, 나누기를 배우지만 컴퓨터는 오로지 더하기 밖에 할 줄 모른다. 지금 내가 이 이야기를 쓰고 있는 컴퓨터도 더하기 밖에 할 줄 모르고 여러분이 이 이야기를 읽고 있는 컴퓨터도 더하기 밖에 할 줄 모른다. 컴퓨터는 더하기로 모든 연산을 다 처리한다. 컴퓨터에게 더하기는 유일하게 할 줄 아는 연산이다.

자, 그럼 컴퓨터에게 더하기를 가르쳐 보자.

XOR 게이트와 AND 게이트로 이뤄진 단순한 회로다. 이 회로가 가장 간단한 더하기 회로다. 무슨 말도 안되는 소리냐고 반문 할수도 있다. 위 회로의 진리표를 보자.

0 + 0 = 00
0 + 1 = 01
1 + 0 = 01
1 + 1 = 10

1비트 이진수 덧셈의 결과와 정확히 일치하는 진리표다. 논리 회로는 진리표로 말한다. 진리표가 덧셈을 말하고 있으니 저 회로는 더하기 회로가 맞다. 위 회로를 반가산기(half adder)라고 한다. 가산기면 그냥 가산기지 왜 ‘반’이 붙은건가? 왜냐하면 말 그대로 반만 계산하기 때문이다. 반만 계산한다는게 무슨 말인가?

10진수 더하기에서 16+5를 하면 답은 21이다. 6과 5를 더하면 11이 된다. 십의 자리수 1을 올려서 앞 자리가 2가 되고 남은 일의 자리수를 붙여 21이 되는 것이다. 이진수의 덧셈도 이와 동일하게 2가 넘어가는 숫자에 대해서는 자리 올림을 해줘야 한다. 하지만 위 회로에는 자리 올림에 대한 배려가 없다. 즉 위 회로를 연달아 두 개 붙인다고 2비트 더하기가 제대로 동작하지 않는다는 것이다. 그래서 반가산기라고 부른다. 그러면 당연히 다음은 자리 올림을 모두 고려한 가산기가 나올 차례다.

반가산기 주변에 게이트가 몇 개 더 붙었다. 자세히 보면 알겠지만 전가산기는 반가산기 두 개를 붙이고 그 출력을 OR 게이트로 묶어서 올림수로 보낸 것이다. 잘 안보이는가?

이름 처럼 전가산기의 반은 반가산기다. 반가산기 두 개가 붙으면 한 개의 전가산기가 된다. 누가 지었는지 참 이름을 재미있게 지었다. Cin은 자리 올림 수가 입력되는 핀이고 Cout은 자리 올림 수가 나가는 핀이다. 자리 올림수를 영어로 캐리(Carry)라고 부른다. 그래서 Carry In, Carry Out이라고 두 핀을 읽으면 된다. 자리 올림까지 고려한 위 회로를 전가산기(full adder)라고 부른다. 위 회로는 연달아 이어 놓으면 붙인 만큼 계산이 가능하다.

위 그림처럼 전가산기 네 개를 붙여 놓으면 4비트 가산기가 된다. 유의해서 볼 점은 하위 비트 가산기의 Cout은 상위 비트 가산기의 Cin으로 들어간다는 것이다. 당연히 그렇게 되어야 한다. 아랫 자리 숫자의 올림 숫자는 당연히 윗 자리에 더해지는 것이 덧셈의 규칙이니까.

플립플롭과 마찬가지로 가산기도 네모 심볼로 그 회로를 대체해서 그린다. 아래 그림은 8비트 가산기를 표현한 그림이다. 나도 앞으로 가산기를 그릴때 게이트 회로 대신 이렇게 사각형으로 그리겠다.

A[0]부터 A[7], 그리고 B[0]부터 B[7]까지 각 8비트씩 16개의 입력이 들어가고 이 값을 더해서 S[0]부터 S[7]까지의 결과가 나온다. 만약 캐리가 발생한다면 Cout에 1이 출력된다. 8비트 가산기를 두 개 붙이면 16비트 가산기가 된다. 그렇게 사용하려면 Cin도 있어야 한다. 또한 조작의 편의를 위해 CLK 신호선도 달았다. CLK는 플립플롭을 설명했을 때와 마찬가지로 클록 펄스를 입력으로 준다. 그러면 위 8비트 가산기 역시 라이징 엣지가 생겼을 때 계산을 수행한다. 기존 회로에 CLK를 붙여 라이징 엣지에 동작하게 만드는 방법은 간단하다. A[0..7], B[0..7] 이렇게 16개의 모든 입력선에 AND 게이트를 붙인 다음 나머지 입력선은 CLK로 하면 된다. 그림은 따로 그리지 않겠다.

컴퓨터에게 더하기를 가르쳐 준다기에 거창한줄 알았는데, 별거 없었다. 그냥 논리 게이트 몇 개 잘 조합해서 덧셈과 동일한 진리표가 나오게했을 뿐이다. 사실 그거면 다 한것이다. 논리 회로에서는 그 이상 더 해 줄것이 없다. 하지만 아직은 약간 심심하다. 언제나 그렇듯 내 이야기는 조금씩 살을 붙여나간다. 오늘 본 이 간단한 가산기는 앞으로 얼마나 위대해 질 것인가! 기대해 주시기 바란다.

댓글

netop의 이미지

입사하고 바쁘실텐데 짬내서 새로운연재를 하고계시는군요..ㅎㅎ

디지털시간에 대충 외웠던 내용이 쏙쏙 이해되네요..항상 열심히 하시는모습이 부러워요!

계속해서 좋은내용 부탁드려요!
-------------------------------------------

-------------------------------------------

때로는 알면서도 모르는척..
때로는 모르면서도 아는척..

바보가 아니면서도 바보인척..
바보이면서도 바보가 아닌척

이원형의 이미지

감사합니다.

퀘이크의 이미지

이상한 질문일 수도 있는데, 저런 회로 자기가 직접 만들어 볼 수 있나요?

익명 사용자의 이미지

납땜 인두하고, 실납, 빵판(만능기판, 브레드보드), 7400 시리즈 IC 를 구입하여 자신이 만들 수 있습니다.
LED 도 구입하여 회로 구성하면 눈으로 확인 가능합니다.

통상,
1일때, 3.3V 또는 5V 값을 가지고
0일때, 0V 값을 가집니다.

자세한 볼트(전압)값은 IC 데이터쉬트(datasheet) 보시면 나옵니다.

j9500404의 이미지

내용 잘 알았습니다. 많은 도움이 되네요. 한편, Cout에서 Cin으로 들어가기전에 중간에 1bit 지연회로가 추가되면 독자들이 좀더 이해가 쉬울것 같지 않을까 생각됩니다. 물론 회로를 단순화하여 알기쉽게 만드시기 위해서 그렇게 하신것은 이해가 가지만요.