[Crash Course: Computer Science] #5 컴퓨터는 어떻게 계산할까?

이민선(Jasmine)·2022년 11월 30일
0
post-thumbnail

ALU(Arithmetic $ Logic Unit) : 논리적 연산 등 컴퓨터의 수학적 두뇌를 일컫는다.
가장 유명한 ALU는 Intel74181로, 1970년에 출시되었을 당시 하나의 칩 안에 완전히 딱 들어맞는 완벽한 ALU였다.

오늘 우리는 부울 논리 게이트를 사용해서 74181과 같은 기능을 할 수 있는 단순한 ALU회로를 만들어보며, 컴퓨터가 기본적인 수학 연산을 디지털로 수행하는 방법을 공부한다.

ALU는 2개의 구성 단위를 가지고 있다.
산술 단위(Arithmetic unit)과 논리 단위(Logic Unit).

<<산술 단위>>
덧셈 뺄셈 등 모든 수치 연산을 처리한다. 증분(increment) 작업 포함.

2개의 숫자를 더함에 있어, 높은 수준의 abstraction을 통해 논리 게이트(AND, OR, NOT, XOR 게이트)의 구성 요소를 만들 수 있다.

<반가산기>

가장 단순한 덧셈 회로는 2개의 2진수를 더하는 것.
X와 Y, 2개의 입력을 갖고, 두 수의 합인 하나의 출력을 갖는다.
X와 Y, 그리고 출력(output)은 모두 단일 비트다.
가능한 입력 조합은 4가지이고,
0+0=0
1+0=1
0+1=1
1+1=10 //⭐️

1+1일 때를 생각해보자.
XOR게이트 사용하면 1+1=0을 출력하지만(SUM이 FALSE),
1+1=10에서 1을 받아올려야 하므로 여분의 출력선(CARRY가 TRUE)이 더 필요하다.
따라서 두 회로를 합해야 하는데, 이 회로를 반가산기(Half Adder)라고 부른다.

<전가산기>

전가산기에서는 3개의 비트를 입력받을 수 있기 떄문에 가능한 최대 입력은 1+1+1. 이 때도 sum(합계)과 carry(받아올림) 총 2개의 출력선이 필요하다.

우리는 반가산기를 이용해 전가산기를 만들 수 있다.
X와 Y를 더할 떄는 반가산기를 쓰고, 그 결과를 Z와 함께 두번째 반가산기에 입력한다.
마지막으로, 우리는 2가지 반가산기 중 하나가 참인지 확인하기 위해 OR게이트가 필요하다.
즉, 전가산기는 2개의 반가산기와 1개의 OR게이트의 조합이다.

유튜브 링크 참고
https://www.youtube.com/watch?v=F3vyljV4soo

<8의 올림수 가산기(8bit ripple carry adder)>

A0와 B0라는 2개의 비트를 더하는 데에 첫번째 반가산기를 쓰자. => 합계를 sum0라고 하자. 만약 carry 비트가 나오면 어떡하냐구? ㄱㄷㄱㄷ
다음으로는 A1와 B1라는 2개의 비트를 더하고, 앞에서 나온 carry비트를 함께 더한다. 이때 전가산기를 쓰자. => 합계 sum1이 나오고, carry 또 나온다면? ㄱㄷㄱㄷ
A2와 B2라는 2개의 비트를 더하고, 앞에서 나온 carry 비트를 함께 더한다. 이때 또 전가산기 사용.~~~ 8비트가 모두 추가될 때까지 반복!
그런데 만약 9번째 비트가 캐리에 있는 경우 두 숫자(A7과 B7인 듯?이들의 캐리는 9번째 비트니까. sum이 8번째고.)의 합이 8비트에 들어가기에는 너무 크다는 것이다. 이를 오버플로(overflow)라고 한다.
우리가 사용중인 비트수보다 덧셈의 결과가 더 커서 표현할 수 없을 때 오버플로가 발생한다. -> 에러 발생할 수도 있다. 회로를 확장하면 되기는 하지만, 게이트를 많이 써야 한다.
ex. 팩맨 게임은 8비트를 사용하는데, 8비트 안에서 저장할 수 있는 256레벨을 넘어버리면 ALU는 오버플로가 된다. 오버플로로 인한 에러는 ⭐️팩맨 더쿠⭐️들의 통과 의례였다고 한다.

ALU의 산술 유닛은 다른 수학 연산을 하는 회로를 갖고 있는데, 일반적으로 8가지가 항상 지원되며 이들은 개별 논리 게이트로 만들어졌다.

  • ADD
  • ADD with CARRY
  • SUBTRACT
  • SUBTRACT with BORROW
  • NEGATE
  • INCREMENT
  • DECREMENT
  • PASS THROUGH

어라 근데 곱셈과 나눗셈이 없네? 단순한 ALU는 이를 위한 회로는 따로 없다. 만약 12 * 5를 계산한다면 5개의 12를 더하는 것임. 이 한 번의 곱셈을 위해 ALU를 5번 지나간다. 온도 조절 장치, TV리모컨, 전자레인지 등의 프로세서들도 마찬가지로 이렇게 곱셈을 한다.

하지만 스마트폰이나 노트북에 있는 고급 프로세서들은 곱셈 전용 회로가 있는 산술 유닛을 가지고 있다. 물론 논리 게이트가 더 많이 필요하고 복잡함.

<<논리 유닛>>
AND, OR, NOT과 같은 논리연산을 하거나 음수인지 확인하는 등 숫자 테스트를 하기도 한다.

74181은 4비트의 입력만 처리할 수 있다. 무려 70개의 논리게이트를 사용했고 곱셈과 나눗셈은 할 수 없었지만, 소형화하는 데에 큰 발걸음이 되었고 더 싸고 유능한 컴퓨터로의 문을 열어주었다.

8비트 ALU는 완전히 구축하려면 수백개의 논리게이트가 필요했다. 기술자들은 ALU를 사용할 때 이러한 복잡성에 대해 V와 같은 특수 기호로 마무리했다.

8비트 ALU는 A와 B 2개의 각 8비트 짜리 입력이 있다. ALU가 수행해야 하는 연산(더하기, 빼기)을 지정함에 있어 4비트 연산코드를 사용한다.
1000은 덧셈 명령이고, 1100은 뺄셈 명령이다.
A와 B를 입력한 연산의 결과는 8비트로 출력된다.

또한 ALU는 특정 상태나 상황들에 대해 1비트로 일련의 신호를 출력하기도 한다.
ZERO : 2개의 수를 뺐는데 결과가 0인지 확인. 이미 만들어진 0 테스트 회로가 0깃발을 1로 놓는다. 2개의 수가 같은지 확인할 때 유용.
NEGATIVE : A가 B보다 작은지 테스트 할 때 음의 신호가 참인지 살펴보면 된다.
OVERFLOW : 오버플로 신호가 있는지 테스트
물론 고급 ALU는 더 많은 신호들을 가지고 있지만, 이 3가지 신호들은 보편적이고 자주 사용된다!

우리는 이 ALU를 이후 강의에서 CPU를 구성하기 위해 사용한다. 다음 시간에는 메모리에 대해 이야기 하는 걸루~!
byebye~!~!

profile
기록에 진심인 개발자 🌿

0개의 댓글