[MCU강의③] CPU란 무엇인가?

2014.09.29 15:40:39
  • 프린트

<편집자 주> 디지털데일리는 총 11회에 걸쳐 마이크로컨트롤러유닛(MCU)의 면면을 파헤치는 해설 기사를 게재합니다. MCU는 다양한 전자제품에 탑재되는 핵심 반도체 가운데 하나입니다. 글 싣는 순서는 다음과 같습니다. ①MCU란 무엇인가? ②MCU의 내부 구성 ③CPU란 무엇인가? ④MCU 소프트웨어 개발 ⑤CPU 실행방법 ⑥ALU의 구성 ⑦MCU용 언어 ⑧호스트 PC를 타겟 보드에 연결하는 툴 선택하기 ⑨범용 IO ⑩MCU 개발에 사용되는 소프트웨어 개요 ⑪MCU의 팹 공정.

이번에는 마이크로컨트롤러(MCU)의 핵심 구성요소인 CPU를 살펴보자. 약 30년 전의 마이크로컨트롤러유닛(MCU)은 오로지 중앙처리장치(CPU)만을 의미했다. 메모리와 주변 장치 모듈은 동일한 인쇄회로기판(PCB)에 별도의 IC 형태로 MCU와 연결되어 있었다. 그러니 왜 CPU를 MCU의 핵심이라고 부르는지 알 수 있을 것이다.

CPU는 중앙처리장치(Central Processing Unit)를 의미한다. 입/출력 디바이스(주변 장치 모듈)를 제어함으로써, 데이터를 수신하고 연산 실행의 결과를 출력한다. CPU에는 두 가지 유형이 있으며, 각 유형은 연산중의 데이터를 임시로 저장하기 위해 각기 다른 유형의 레지스터를 사용한다. 한 CPU는 범용 레지스터(레지스터 CPU)를 사용하고 다른 하나는 어큐뮬레이터(어큐뮬레이터 CPU)를 쓴다.

◆범용 레지스터와 어큐뮬레이터

MCU와 같은 디지털 회로에서 플립플롭(flip-flop)이나 데이터를 저장하는 기타 회로들을 ‘레지스터’라고 부른다. 레지스터는 데이터를 저장하는 데 사용된다는 점에서는 메모리와 유사하지만 상대적으로 용량이 작은 저장회로다. 범용 레지스터(general-purpose register)는 명령에 사용되는 데이터를 임시로 저장하는, CPU내부에서 볼 수 있는 유형의 레지스터다. CPU에는 다수의 범용 레지스터가 포함되어 있다. 반면에 주변 장치 레지스터(peripheral register)는 주변 장치 모듈(예, 타이머, USART 및 ADC)에 대한 설정 값이나 측정 결과를 저장하는 레지스터다. MCU에 따라 주변 장치 레지스터를 부르는 이름이 다를 수 있다. ST마이크로일렉트로닉스가 생산하는 STM32에 사용되는 ARM Cortex-M3 프로세서는 범용 레지스터를 사용한다.

어큐뮬레이터는 유형이 다른 레지스터이다. 이 레지스터는 범용 레지스터와 구조가 동일하며, 데이터를 저장한다. 하지만 레지스터 CPU가 다수의 범용 레지스터를 탑재하고 레지스터 사이에서 연산이 수행되는 반면, 어큐뮬레이터 CPU는 하나의 어큐뮬레이터만 탑재되고  어큐뮬레이터와 메모리 사이에서만 연산이 실행된다. 연산 결과는 어큐뮬레이터(일부 MCU는 메모리)에 입력된다.

어큐뮬레이터는 연산 결과들의 누적 값이 반복적으로 더해진 연산 결과가 항상 어큐뮬레이터의 입력으로 사용되기 때문에 이런 이름을 얻게 되었다. 어큐뮬레이터 CPU 장점 중 하나는 레지스터 CPU보다 회로 구조가 단순하다는 것이다. 현재는 거의 모든 MCU가 레지스터 CPU를 사용하지만, ST의 STM8 시리즈 제품은 어큐뮬레이터 CPU를 사용하는 고성능 MCU 라인이다.

◆CPU 블록 다이어그램

▲그림1. CPU 블록도

그림 1은 CPU의 블록도를 볼 수 있다. 블록도 맨 윗부분은 CPU 레지스터의 실행 유닛, 밑부분에는 어큐뮬레이터 CPU가 표시되어 있다. 이 두 가지 유형의 CPU에 대한 기본 개념을 이해하는 데 도움이 될 수 있도록 블록도에는 주요 요소만 표시했다. 레지스터 CPU와 어큐뮬레이터 CPU의 유일한 차이점은 실행 유닛의 내부구조에 있다.

메모리(ROM)에서 명령코드가 입력될 때, 먼저 FIFO 프리패치 버퍼(pre-fetch buffer)에 저장된다. FIFO는 선입(First In), 선출(First Out)을 의미한다. 다르게 발음할 수도 있지만, 일반적으로는 ‘파이포(fai-fo)’와 ‘피포(fee-fo)’로 발음한다. 버퍼는 데이터를 임시로 저장하는 메모리이며, FIFO 버퍼는 데이터를 순차적으로 처리하는 메모리이다. ‘프리패치(pre-fetch)’라는 단어는 ‘사전에 읽다(to read in advance)’라는 뜻이다. 이를 요약하면, FIFO 프리패치 버퍼는 ‘사전에 데이터를 읽어 저장하는 버퍼’다. 이 고속 연산 메모리는 연산 성능을 향상시키기 위해 고안됐다.

디코더(Decorder)는 이름에서 알 수 있듯 명령어를 해석한다. FIFO 프리패치 버퍼의 명령을 순서대로 읽고 어떤 명령의 유형인지를 결정한다. 또한 명령어들의 기능에 따라 명령어를 실행 유닛으로 전송한다.

실행 유닛(Execution Unit)도 마찬가지로 이름에서 알 수 있듯이 명령어를 실행하는 장치다. 이 장치는 연산 기능을 하는 ALU와 시프터를 통해 레지스터나 어큐뮬레이터의 데이터를 계산하는데 사용된다. ALU(Arithmetic Logic Unit)는 사칙연산과 같은 산술연산과 AND, OR, NOT과 같은 논리 연산을 수행하는 장치(산술논리연산장치)를 뜻한다. 시프터는 데이터의 비트를 좌우로 이동시키는 연산을 하는 장치를 의미한다.

◆연산 수행 방법

▲그림 2. 레지스터 CPU의 명령 처리 과정

그림 2는 레지스터 CPU가 어떻게 연산을 수행하는지를 나타내고 있다.

각 단계의 상세 설명

①CPU는 메모리(ROM)로 부터 명령 코드를 로딩한다. 메모리에는 MCU에 의해 실행될 명령어 코드가 포함되어 있다. 만약 코드가 덧셈 명령이나 뺄셈 명령인 경우에는 산술 연산이 수행된다. 코드가 ‘AND,’ ‘OR’ 또는 ‘XOR’ 명령일 경우에는 논리 연산이 수행된다. 예를들어 ‘덧셈’ 명령은 2진수로 정의된다. 원래 이 2진수 숫자는 MCU 디자이너에 의해 결정되지만, 여기에서는 이 ‘덧셈’ 명령에 해당하는 2진수 숫자를 00000001b로 정의해 보자.

다음 단계는 어떤 숫자가 어떤 숫자에 더해질지 것인지 결정하는 것이다. 여기서 ‘덧셈’ 명령 이진 숫자(00000001b) 다음에 나타나는 8비트의 상위 4비트와 하위 4비트는 각각 덧셈 연산의 대상이 되는 데이터가 위치한 범용 레지스터의 번호를 나타낸다고 가정해 보자. 이 예에서는 레지스터 1과 레지스터 2를 계산에 사용할 것이다. 그리고 연산 결과를 어디에 저장할 지 정의할 필요가 있다. 그래서 다음 8비트는 연산 결과를 수신하는 레지스터의 번호로 정의한다. 단순하게 하기 위해, 레지스터 3을 사용하도록 하자. 요약하자면, 2진수(명령 코드)는 다음 순서로 메모리에 입력한다. 

- ‘덧셈’ 명령: 0000 0001 b
- 더해질 숫자가 저장된 레지스터 번호들: 0001 0010 b (1번과 2번 레지스터)
- 연산 결과가 저장될 레지스터 번호: 0000 0011 b (3번 레지스터)

위에 언급한 2진수들은 우선 메모리에서 읽은 다음 FIFO 프리패치 버퍼에 저장한다.

②디코더가 명령 코드를 해독한다. 단계 ①에서 정의된 규칙에 따라 디코더는 FIFO 프리패치 버퍼의 2진 데이터를 해독한다.

- 0000 0001 b: 덧셈을 실행한다.
- 0001 0010 b: 레지스터 1과 2의 데이터를 읽는다.
- 0000 0011 b: 연산 결과를 레지스터 3에 입력한다.

③디코더가 실행 장치에 연산 명령을 발행한다.

- 덧셈을 실행한다: ALU를 XOR로 설정한다. (덧셈 모드)
- 레지스터 1과 2의 데이터를 읽는다: 레지스터 1과 2의 데이터를 버스에 출력하도록 한다.
- 연산 결과를 레지스터 3에 입력한다: 레지스터 3에 버스를 통해 데이터가 수신되도록 한다.

④연산에 사용할 레지스터 데이터를 내부 버스로 출력한다.

- 레지스터 1의 데이터는 녹색 버스로 출력한다.
- 레지스터 2의 데이터는 청색 버스로 출력한다.

⑤ALU가 연산을 실행한다.

- 덧셈 모드(XOR)에서는 ALU가 청색 버스값을 녹색 버스값에 추가한다.

⑥ALU는 연산 결과를 내부 버스로 출력한다. 이 데이터는 분홍색 버스로 출력된다.

⑦연산 결과는 범용 레지스터 또는 메모리에 저장된다.

- 레지스터 3이 분홍색 버스를 통해 데이터를 수신한다.
 
이로써 레지스터 1에 저장된 숫자와 레지스터 2에 저장된 숫자를 더하는데 필요한 연산을 종료한 후 결과를 레지스터 3에 입력한다. 어큐뮬레이터 CPU도 기본적인 동작은 레지스터 CPU와 동일하다. 여기서 잊지 말아야 할 점은 어큐뮬레이터 CPU에는 하나의 레지스터밖에 없다는 점이다. 이는 레지스터 1(즉, 어큐뮬레이터)과 메모리가 연산을 실행하고 난뒤 그 결과가 다시 레지스터 1에 입력된다는 의미다.

◆CPU가 수행하는 다른 작업

이 글은 연산을 수행하는 CPU의 주요 임무에 초점을 맞추고 있다. CPU는 어드레스 계산, 인터럽트(interrupt) 처리 및 연산 결과 처리(운반 및 가져오기)를 포함해 다른 여러 가지 유형의 임무를 수행한다. 이러한 여러 임무에 대해서는 이후에 더 상세하게 설명할 예정이다.

글 : 마사루 스가이(ST마이크로 MMS그룹)

  • 프린트




follow us
  • 트위터바로가기
  • 페이스북바로가기
  • 구글플러스바로가기
  • 유투브바로가기
  • rss바로가기