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

[컴퓨터][22] 제어장치 - 1 (디코더 그리고 산술/논리 장치(ALU : Arithmetic and Logical Unit ))

core-basic 2024. 9. 18. 22:36
728x90

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.
※ 해당 게시글은 J. 클라크 스코트, 『그래서 컴퓨터는 어떻게 동작하나요?』, 지유록, 인사이트(2019) 책을 참고하였습니다. 


컴퓨터는 처음에 계산을 자동화하기 위해 산술/논리 연산 회로로 설계되었지만

나눗셈 연산과 같이 중간 결괏값을 저장하고 다시 사용하는 등의

복잡한 연산을 하지 못한다는 한계가 있었다.

그래서

신호 및 데이터를 저장하고 재사용할 수 있는 래치와 레지스터 등과 같은

메모리 회로가 도입되었다.

이는 초기의 컴퓨터 발전에서 중요한 첫 번째 전환점이었다.

 

이에 따라,

산술/논리연산회로와 메모리회로와 결합해서

나눗셈 연산과 같은 복잡한 연산을 자동으로 수행할 수 있게 되었지만,

연산 자체만 자동일 뿐 사용자가 연산 결과를 직접 확인하고,

이후 사용할 각 장치에 수동으로 입력해 주어야 한다는 한계가 있었다.

그래서

이를 극복하기 위해 서로 다른 장치들을 자동으로 연결해 주고 동기화해 주는

제어장치와 클럭이 도입되었다.

이는 메모리 회로에 이어서 초기의 컴퓨터 발전에 중요한 두 번째 전환점이었다.

 

이에 따라서 이전글들을 통해 초기의 컴퓨터인 산술/논리 연산 회로와

중요한 전환점 중 하나였던 메모리 회로까지 구현해 보았으며,

산술/논리 연산 회로와 메모리 회로를 결합하여

실질적으로 나눗셈 연산이 어떻게 진행되는지 살펴보면서

복잡한 연산까지 할 수 있다는 것을 확인했다.

 

[컴퓨터][21] 나눗셈 연산 회로 (산술/논리연산 회로와 레지스터)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.이전 글을 통해 초기의 컴퓨터는8bit 단위로 연산하고 데이터를 처리하는 것이 효율적임을 알 수 있었다.그래서

core-basic.tistory.com

그러면 이어서

산술/논리 연산회로와 메모리회로만으로 컴퓨터를 구현하였을 때의

한계점을 극복시켜 줄 제어장치와 클럭 대해 알아보겠다.

< 제어장치 >
( 디코더 그리고 산술/논리 장치) 
(Arithmetic and Logical Unit : ALU)


< 제어장치와 버스(Bus) >

제어장치란 무엇인가?

제어장치란 정확히 어떤 역할을 하는가?

제어장치는 모든 장치의 입력제어기(Set)와 출력제어기(Enable)를 연결하여,

적절한 시점에,

각 장치의 제어기를 활성화하거나, 비활성화할 수 있도록 해주어,

각 장치가 '모든 장치와 연결되어 있는 전선'으로 데이터를 전송할 수 있게 해 주거나,

전선에 있는 데이터를 받을 수 있도록 조율해 준다.

그리고

명령어를 해석하여 어떤 산술/논리 연산 장치를 수행할지 결정한다.

이때, '모든 장치와 연결되어 있는 전선'을 '버스(Bus)'라고 부른다.


< 간단한 제어장치 동작 과정 예시 >

예를 들어 만약에

적절한 시점을 1초 간격으로 하여,

‘A레지스터’에 있는 값을 ‘B레지스터’에 있는 값과

AND 연산을 진행한다고 하였을 때

회로적인 관점에서 그 과정을 살펴보면 다음과 같다.

 

예를 들어 만약에 적절한 시점을 1초 간격으로 하여,

‘A레지스터’에 있는 값을 ‘B레지스터’에 있는 값과

AND 연산을 진행한다고 하였을 때

회로적인 관점에서 그 과정을 살펴보면 다음과 같다.

 

[0초 일 때]

제어장치는 명령어를 해석하여 AND 연산을 수행할 것을 결정한다.


[1초 일 때]

A 레지스터의 출력 제어기(E)를 활성화 함으로써,

버스에 A레지스터의 값을 전송한다.


[2초 일 때]

AND 장치의 입력제어기(S)를 활성함으로써, 버스에 있는 데이터를 입력받는다.


[3초 일 때]

AND 장치의 입력 제어기(S)를 비활성화한다.


[4초 일 때]

이후 A 레지스터의 출력 제어기(E)를 비활성화 함으로써,

최대한 정확하고 안전하게 데이터를 입력받는다.


[5초 일 때]

B레지스터의 출력 제어기(E)를 활성화 함으로써,

버스에 B레지스터의 값을 전송한다.


[6초 일 때]

다시 AND 장치의 입력제어기를 (S)를 활성화 함으로써,

버스에 있는 데이터를 입력받는다.


[7초 일 때]

AND 장치의 입력 제어기(S)를 비활성화한다.


[8초 일 때]

이후 B 레지스터의 출력 제어기(E)를 비활성화 함으로써,

최대한 정확하고 안전하게 데이터를 입력받는다.


[9초 일 때]

AND 연산을 진행한다.


[10초 일 때]

AND 장치의 출력 제어기(E)를 활성화하여 연산 결과를 출력한다.

: 버스에 연산 결과를 전송한다.

(실제 컴퓨터 회로 동작과정과는 다르나, 이러한 메커니즘을 통해 동작한다.)

 

이처럼 컴퓨터의 회로 동작은 모든 장치가 적절한 시점에 동기화되어,

저장되어 있는 데이터를 이용한 연산과

각 장치의 입출력제어가 자동으로 진행된다.

 

이때 시점을 제어하는 기능은 클럭이라는 장치가 담당하고,

데이터를 저장하는 기능은 레지스터와 같은 메모리 회로가 맡으며,

연산은 산술/논리 연산 회로들이 처리한다.

그리고

입출력제어와 시스템의 동작을 자동화 하는 기능은 제어장치가 담당하게 된다.

제어장치는 또한 명령어를 해석하여

산술/논리 연산 중에 어떤 연산을 수행할지 결정한다.


< 제어장치 구현 준비의 준비 >

하지만 위의 예시에는 클럭과 제어장치를 어떻게 구현해야 하는지

그리고 명령어를 어떻게 해석하고 처리하는지에 대한 중요한 문제를 제외해도

여러 문제가 있다.

(1)
지금까지 구현한 1byte 장치들을 살펴보면,

레지스터와 같은 메모리 회로를 제외한 산술/논리 연산 회로들은

별도의 입력제어장치나, 출력제어장치가 존재하지 않는다.

 

(2)
또한, 산술/논리 연산 회로들은 2개의 입력(A, B)을 받는데,

각 입력마다 입력 제어장치를 배치해야 할지,

아니면 둘 중 하나만 입력제어기를 배치해도 충분한지 명확하지 않다.

 

(3)
더 나아가, 산술/논리 연산 회로들에 대해 연산 결과, 즉 출력은 다르더라도,

입력형태는 모두 같기 때문에

각 장치마다 입력제어기를 배치해야 하는 방식이 비효율적이다.

이에 따라 산술/논리 연산 회로들의 입력 전선을 하나로 통일해야 한다.

 

지금까지는 산술/논리 연산 회로들을 따로 분리한 상태로 사용하였는데

이를 통합함으로써 하나의 입력 전선과 하나의 입력 제어기로

관리하는 것이 효율적이며,

통합 산술/논리 연산 회로는 제어장치가 명령어를 해석해서

어떤 장치를 선택하는지를 회로를 구성하는 데 있어서 더 효율적이다.

그러므로

산술/논리 연산 회로들을 어떻게 통합할 수 있는지 파악해야 한다.


< 산술/논리 연산 회로 통합 : 산술/논리 장치(ALU) >

※ 그래서 컴퓨터는 어떻게 동작하나요? (J. 클라크 스코트 지음, 지유록 옮김)을 참고하였습니다.

지금까지 알아본 산술/논리 연산 회로는 다음과 같다.

1. AND 연산

2. OR 연산

3. NOT 연산

4. XOR 연산

5. NAND 연산

6. NOR 연산

7. XNOR 연산

8. 덧셈/뺄셈 연산

9. 왼쪽 시프트 연산

10. 오른쪽 시프트 연산

11. 비교 연산

이때, NAND, NOR, XNOR 연산은

AND/OR/XOR+NOT 게이트 이므로 AND, OR, XOR, NOT 게이트로 축약할 수 있다.

또한,

뺄셈 연산은 덧셈기와 XOR 그리고 NOT 게이트만 있으면 되므로,

다시 AND, OR, XOR, NOT, 덧셈기로 축약할 수 있다.

그리고 비교연산은 XOR의 연장선상으로 볼 수 있다.

따라서

산술/논리 연산 회로들을 통합하면 다음과 같이

총 7~8가지 연산으로 축약할 수 있다.

[1] 8bit (1byte) AND 연산 회로




[2] 8bit (1byte) OR 연산



[3] NOT 연산 회로




[4] XOR연산 회로


[5] 덧셈 연산 회로





[6] 왼쪽 시프트 연산 회로



[7] 오른쪽 시프트 연산 회로







[8] XOR + 비교 연산 회로


 

그리고 이를 통합한 회로를 표현하면 다음과 같다.

하지만 위의 그림처럼 모든 산술/논리 연산 회로에 출력제어기가 없어서,

연산되는 결과가 그대로 출력되어 버스에 여러 연산 결과가 충돌하는 현상이 발생한다.

따라서

각 장치에 출력제어기를 배치해 주면 다음과 같다.

 

이때 7~8가지의 연산 장치의 출력제어기를 활성화하는 방법은

각 장치의 출력 신호를 특정한  2진수에 대응시키는 것이다.

예를 들면 다음과 같다.

CMP = 000

XOR = 001

NOT = 010

OR = 011

AND = 100

ADD = 101

SHL = 110

SHR = 111

 이처럼 3bit만 있으면 각  최대 8가지의 출력 제어기에

이진수를 대응시킬 수 있으며 특정한 3bit 입력이 들어오면

대응되는 장치의 출력 제어기가 활성화되도록 구성하면 된다.


< 디코더 >

즉, 3bit 입력을 받고, 8bit 출력을 하는데

입력에 따라  8개의 출력 비트 중 하나의 비트만 활성화되어,

출력 결과가 모두 달라야 하는 장치를 구현해야 한다.

입력 출력
CMP = 000 1000 0000
XOR = 001 0100 0000
NOT = 010 0010 0000
OR = 011 0001 0000
AND = 100 0000 1000
ADD = 101 0000 0100
SHL = 110 0000 0010
SHR = 111 0000 0001

이에 대해 입력과 출력의 상호관계를 논리적으로 파악하면

다음과 같은 회로를 얻을 수 있으며, 이러한 회로를 디코더(Decoder)라고 부른다.

 

입력 출력 < 회로 >
CMP = 000
1000 0000
XOR = 001 0100 0000
NOT = 010 0010 0000
OR = 011 0001 0000
AND = 100 0000 1000
ADD = 101 0000 0100
SHL = 110 0000 0010
SHR = 111 0000 0001

 


< OP Code >

그리고 이처럼 특정 연산 회로를 활성화시키는 신호들을

OPcode(operation code)라고 부른다.

 

(2024-09-22 추가)

이에 따라 실질적으로 제어장치가 명령어를 해석한다는 것은

사실, 설계 목적에 따라 미리 특정 신호와  장치가  연결된 회로로부터

명령어 및 OPcode가 생성되어 사용자에게 제공하는 것을 의미한다. 

그러므로

사용자는 제공된 명령어와 임의의 값을 입력 해주면

설계된 대로 명령어에 대응된 회로가  동작하게 된다.


< 산술/논리 장치 (Arithmetic and Logical Unit : ALU)  >

이에 따라 앞에서 통합한 산술/논리 연산 회로들과 출력 제어기

그리고 디코더를 연결시키면 다음과 같다.

그리고 더 나아가 '외부'  =  '모든 장치를 연결하는 전선' = '버스(Bus)' 

 로부터 데이터가 ALU에 들어올 때

A와 B에 동시에 들어오는 것을 방지하기 위해서는

출력제어기와 같은 입력제어기가 적어도 하나가 필요하다.

하나만 필요한 이유는 만약

A레지스터의 값은 A에, B레지스터의 값은 B로 입력하고 싶을 때

(1) A레지스터 출력 활성화

(2) A의 입력제어기를 활성화

(3) A, B 모두 A레지스터의 값 받음

(4) A의 입력제어기 비활성화 및, B레지스터 출력 활성화

(5) B만 B레지스터의 값을 받는다.
(A는 입력제어기로 인해 받지 못한다.)

(6) 이에 따라 A = A레지스터의 값, B = B 레지스터의 값이 입력되며

이후 OPcode에 맞는 연산을 진행한다.

따라서, A와 B 중 하나만 입력제어기가 있어도 된다.

 

입력제어기는 다음 그림처럼 

레지스터(D래치 + 출력제어기)에 출력제어기가 없는  D래치 회로와 같다.

출력제어기와 다르게

메모리 회로가 필요한 이유는 버스(Bus)에서 전달되는 외부 신호가

변동성이 크고 불안정적이기 때문이다.

따라서 레지스터를 통해 안정적으로 값을 유지할 수 있도록 하고 처리한다. 

 

그래서 입력제어기를 연결한  산술/논리 장치(ALU)는 다음과 같다.

ex)
OPcode : 101 (ADD) 
A : 0000 0011
B : 0000 0001

< 실질적인 입력 >

이때  스위치/릴레이 관점에서 입력이 무엇인지 살펴보면

스위치가 아닌 릴레이로 연결되어 있거나, 스위치 따위 없이 바로 연결되어 있다.

< 3 상태 버퍼 >

실질적으로 AND게이트만으로 형성된 출력제어기는 결국 버스로 가는 길에서 충돌한다.

왜냐하면 '0'은 낮은 전압으로 전압이 없다는 것이 아니기 때문이다.

따라서 정말로 전압이 없는 상태를 만들어 주기 위해서는

AND게이트가 아닌 3 상태 버퍼를 이용해야 한다.

3 상태 버퍼는 어떻게 구현하는지에 대해서는 아직 알지 못했다.

이에 대해서는 또 다른 탐구가 필요할 것 같다.

논리표는 다음과 같다.

입력 Enable 출력
0 0 High Impedance (Z)
: 출력없음
1 0 High Impedance (Z)
: 출력없음
0 1 0
1 1 1

 

 

다음 주제는 이어서, 제어장치와 클럭이

명령어에 따라 통합된 산술 논리 장치를 어떻게 자동화 처리하고,

동기화할지 탐구해 보겠다.


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

728x90