기록하는삶
[CS/컴퓨터 구조] ALU의 기본 구조, input과 output 본문
본문에 첨부하는 내용과 이미지의 상당 부분은 유튜브 CrashCourse의 컴퓨터 과학 특강을 참고하였음을 밝힙니다.
컴퓨터에서 연산을 처리하는 장치는 CPU, 그 중에서도 ALU(Arithmetic Logic Unit)다. 앞서 공부했던 기본적인 논리 회로(and, or, xor, not 등)의 결합으로 사칙 연산 등의 산술 연산과 논리합, 논리곱 등의 논리 연산을 할 수 있는 ALU에 대해 알아본다.
1) 산술 연산
먼저 1bit의 덧셈 연산을 살펴보면, 4가지의 연산이 존재한다.
앞의 세 연산은 xor 연산으로 처리 가능하지만, 1+1의 경우 올림하여 10으로 표기해야하므로, 추가적인 장치가 필요하다.
올림하는 숫자를 carry라는 output으로 하는 and 연산을 두 입력에 추가해주면, carry와 sum의 조합으로 1bit 덧셈 연산이 가능한 논리 회로가 만들어진다. 이를 Half Adder(반가산기)라 명명하여 앞으로는 and, xor 연산처럼 활용한다.
2bit 이상의 숫자들에 대한 덧셈 연산을 할 때에는, 하늘색으로 색칠된 부분의 연산처럼 하위 자릿수 연산에서 carry(올림)가 발생할 수 있기 때문에 출력은 carry와 sum 2개로 동일하지만 입력으로는 3개(A, B, carry)의 입력을 갖는 회로가 필요하다. 이를 Full Adder(전가산기)라 칭하는데, 구조는 아래와 같다.
두 개의 half adder를 결합하여 (A+B)+C의 연산을 하되, 둘 중 하나라도 carry가 발생했다면 carry(올림)를 넘겨줄 수 있도록 or 연산이 추가된 구조이다. 이렇게 full adder와 half adder를 하나의 단위로 구성하고 나면, 이들을 결합해 n-bit adder를 만들 수 있다. n-bit adder를 구성하기 위해서는 1개의 half adder와 (n-1)개의 full adder를 사용한다(마지막 자릿수 연산에는 half adder가, 나머지에는 full adder가 필요하기 때문). 8-bit adder를 예로 들면 아래와 같다.
이전 자릿수 연산의 carry를 다음 연산의 input으로 활용해 'ripple carry adder(올림수 가산기)'라 칭한다고 한다. 이때 '129+129=258'과 같이 마지막 full adder의 carry가 1이 되게 하는 연산을 진행하게 되면, 이는 8bit로 표현이 불가능한 숫자가 되므로 연산 결과를 표현할 수 없게 되고, 이러한 현상을 오버플로우(overflow)라 부른다. 현대에는 이러한 방식보다 더 빠른 속도로 연산이 가능한 "Carry-look-ahead adder"를 사용한다.
외에도 ALU는 유사한 논리 회로의 집합으로 위와 같은 연산들을 지원하며, 온도 조절 장치, TV 리모컨, 전자레인지 등에 사용되는 저비용 프로세서(CPU)들은 연산 장치가 곱셈 회로를 따로 포함하지 않아 덧셈을 반복하는 것으로 곱셈을 대신하지만, 스마트폰이나 노트북 등에 사용되는 고급 프로세서는 곱셈과 나눗셈 전용 회로를 가지고 있다. (찾아보니 덧셈과 shift 연산 등을 조합해 곱셈과 나눗셈 연산을 구성할 수 있는데, 꽤나 복잡한 것 같아 지금은 넘어간다.)
2) 논리 연산
and, or 연산 등과 비슷한 역할을 하거나 특정 숫자가 0인지, 혹은 양수인지 음수인지 판별하여 A=B, A>B 등의 비교 연산을 수행할 수 있다.
위 예시처럼 모든 자릿수가 0인지 확인하는 회로에 not 연산을 더해 특정 수가 0인지 확인하는 연산을 구성할 수 있고, A-B의 값을 산술 연산으로 구해 해당 숫자가 0인지 확인하는 방법으로 두 숫자가 같은지 여부를 판별하는 연산을 수행할 수 있다.
3) ALU의 input과 output
일반적으로 ALU는 V 기호로 표기하며, 두 숫자와 어떤 연산을 수행할 지의 정보인 operation code를 input으로 받는다. input과 동일한 크기의 output을 내며, 외에도 1bit짜리 flag들을 내보내기도 하는데, overflow 발생 여부, 0 여부, 음수 여부 등이 여기에 해당하며 고급 ALU는 더 많은 flag를 포함하기도 한다.
'CS(Computer Science)' 카테고리의 다른 글
[CS/컴퓨터구조] 프로세스와 쓰레드, 파이썬의 병렬 처리 (1) | 2023.03.15 |
---|---|
[CS/컴퓨터 구조] C언어 컴파일 과정 (0) | 2023.03.09 |
[CS/컴퓨터 구조] 컴퓨터의 숫자와 문자 표현, 부동소수점, ASCII, 유니코드 (0) | 2022.03.13 |
[CS/컴퓨터 구조] 논리 회로의 기초, Not/And/Or/Xor Gate (0) | 2022.03.09 |
[CS/컴퓨터 구조] 계전기와 삼극 진공관, 트랜지스터 (0) | 2022.03.09 |