yeolyi.com성열의 컴퓨터공학

제어 장치

CPU는 메모리에서 명령어를 가져오고(Fetch), 해석하고(Decode), 실행하는(Execute) 명령어 사이클을 끝없이 반복합니다. 이 글에서는 가운데 단계인 해석을 맡는 제어 장치를 들여다봅시다.

opcode와 operand

가져온 명령어는 01100011 같은 이진수일 뿐입니다. 이걸 어떻게 해석할까요?

이 시리즈의 8비트 ISA에서는 명령어를 두 부분으로 나눠서 해석합니다. 앞 4비트는 opcode, 즉 무엇을 하라는 명령입니다. 뒤 4비트는 operand, 즉 어디에/무엇에 대해라는 대상입니다. 예를 들어 0110 0011이면 opcode 0110(LDI)에 operand 0011(레지스터와 값)이므로, 레지스터에 값을 저장하라는 뜻이 됩니다.

제어 신호

이 해석을 담당하는 것이 제어 장치입니다. 제어 장치의 핵심은 앞서 배운 디코더와 MUX입니다.

opcode 4비트가 디코더에 들어가면, 해당 명령어에 대응하는 제어 신호 하나만 활성화됩니다. 예를 들어 opcode가 0110(LDI)이면 레지스터에 값을 쓰라는 신호가 켜지고, 0001(ADD)이면 ALU로 덧셈하라는 신호가 켜집니다. 나머지 신호는 모두 꺼진 상태입니다.

operand 쪽도 비슷합니다. 명령어에 레지스터 번호(2비트)가 포함되어 있으면, 그 번호가 MUX의 선택 신호가 되어 네 개의 레지스터 중 하나를 골라 읽거나 씁니다.

0110
Rd
Imm
LDI R0, 3

즉시값을 Rd에 로드한다.

레지스터즉시값 → Rd
메모리사용 안 함
ALU사용 안 함
  1. opcode 비트를 바꿔 다른 명령어로 만들어봅시다.
  2. 명령어가 바뀌면 레지스터, 메모리, ALU 각각에 어떤 신호가 가는지 확인해봅시다.

마무리

제어 장치는 opcode를 디코더로 풀어 어떤 부품이 일할지 정하고, operand의 레지스터 번호로 MUX를 움직여 어떤 값을 쓸지 고릅니다. 이 부품들을 하나로 조립한 폰 노이만 시뮬레이터에서 Fetch-Decode-Execute 사이클을 한 단계씩 실행해봅시다.

0과 1에서 시작해 논리 게이트, 가산기, 래치, 튜링 머신, 폰 노이만 구조를 거쳐 동작하는 컴퓨터를 조립했습니다.

그런데 한 가지 문제가 있습니다. 오늘날 CPU는 1초에 수십억 개의 명령어를 처리할 수 있지만, 메모리에서 데이터를 가져오는 속도는 이에 비해 수백 배 느립니다. Fetch 단계에서 매번 메모리에 접근해야 하니, CPU가 아무리 빨라도 메모리를 기다리는 시간이 병목이 됩니다. 다음 글에서는 이 속도 차이를 어떻게 해결하는지 살펴봅시다.