CPU 제어 장치가 명령어 실행을 조율하는 방식

CPU 제어 장치의 명령어 해석, 제어 신호 생성, 명령어 사이클과 Hardwired·Microprogrammed 설계 방식을 정리한다.

2026-08-14 · 최초 발행 2026-01-03

명령어를 실행 가능한 동작으로 바꾸는 제어 장치

CPU가 메모리에서 명령어를 가져왔다고 해서 곧바로 연산이 일어나는 것은 아니다. 명령어의 의미를 해석하고, 어느 레지스터를 읽을지, ALU가 어떤 연산을 수행할지, 메모리에 접근할지 결정해야 한다. 이 흐름을 맡는 구성 요소가 제어 장치(Control Unit)다.

제어 장치는 Instruction Register(IR)에 보관된 명령어를 해석하고, 연산 장치와 레지스터, 메모리로 제어 신호를 보낸다. Sequence Counter는 실행 단계를 추적하며, Control Signal Generator는 타이밍에 맞는 신호를 각 구성 요소에 전달한다.

CPU 안에서 제어 장치가 다루는 대상은 다음과 같다.

  • ALU: 산술·논리 연산 제어
  • 레지스터: 데이터 읽기와 쓰기 제어
  • 캐시 메모리: 고속 데이터 저장
  • 메모리: 주소 및 데이터 전송 제어
제어 신호제어 신호명령어데이터데이터CPUControl Unit(제어 장치)ALU(연산 장치)Registers(레지스터)Memory(메모리)

인출부터 실행까지 제어하는 흐름

명령어 처리는 Fetch, Decode, Execute 순서로 진행된다. 제어 장치는 시스템 클록을 기준으로 각 단계의 시작과 종료를 맞추고, 파이프라인 단계도 동기화한다.

Fetch 단계에서는 프로그램 카운터(PC)가 가리키는 주소에서 명령어를 인출해 IR에 저장하고 PC 값을 증가시킨다. 이어지는 Decode 단계에서 Instruction Decoder가 Opcode를 분석하고 피연산자 주소를 파악한다. 해석 결과는 필요한 제어 신호 패턴을 결정하는 근거가 된다.

실행이 끝난 뒤에는 PC가 순차적으로 증가하거나, 조건부 분기와 무조건 분기에 따라 대상 주소로 바뀐다. 외부 인터럽트가 감지되면 인터럽트 서비스 루틴(ISR)을 호출한 뒤 원래 프로그램으로 복귀하는 흐름도 제어 장치가 관리한다.

NoYesFetch(인출)Decode(해석)Execute(실행)분기?PC++PC = Target

명령어 해석과 신호 생성을 맡는 내부 구성

IR은 현재 실행 중인 명령어를 저장한다. Fetch 단계에서 메모리로부터 로드된 명령어는 Opcode 필드와 Operand 필드로 나뉘며, 각각 연산 종류와 피연산자 주소를 담는다.

Instruction Decoder는 IR의 Opcode를 비트 패턴으로 해석한다. 룩업 테이블이나 조합 논리 회로를 이용할 수 있고, Microprogrammed 방식에서는 마이크로 명령어를 생성한다. 해석 결과는 Control Signal Generator에 전달된다.

Sequence Counter는 명령어가 어느 실행 단계에 있는지 추적하고 다음 마이크로 연산을 지정한다. Fetch에서 Decode, Execute로 넘어가는 순서를 제어하며, 분기 상황에서는 그 순서를 바꾼다.

Control Signal Generator는 명령어 해석 결과와 타이밍 신호를 결합해 최종 제어 신호를 만든다. 이 신호는 각 구성 요소에 병렬로 전달되며, ALU 연산 선택, 레지스터 읽기·쓰기, 메모리 읽기·쓰기, 버스 활성화에 사용된다.

제어 신호가 다루는 대상

ALU 제어 신호는 ADD, SUB, AND, OR, NOT, SHIFT 같은 연산을 선택하고 Zero Flag, Carry Flag, Overflow Flag, Sign Flag의 설정과 관련된다.

레지스터 제어 신호는 읽을 레지스터를 선택해 데이터 버스로 값을 출력하거나, 데이터 버스의 값을 특정 레지스터에 저장한다. 쓰기 동작은 클록 에지에 동기화된다. 예를 들어 R1_READ는 레지스터 R1을 읽고, R2_WRITE는 레지스터 R2에 값을 쓴다.

메모리 읽기에서는 주소 버스에 주소를 설정하고 메모리 읽기를 활성화해 데이터 버스로 값을 받는다. 메모리 쓰기에서는 주소와 데이터를 각각 버스에 설정한 뒤 메모리 쓰기를 활성화한다.

버스 제어에서는 주소 버스, 데이터 버스, 제어 버스를 활성화한다. 한 번에 하나의 소스만 버스를 사용하도록 하고, 필요하면 버스 중재(Bus Arbitration)를 수행해 충돌을 막는다.

논리 회로와 마이크로프로그램의 설계 차이

Hardwired Control Unit은 조합 논리 회로와 순차 논리 회로를 이용해 제어 신호를 직접 만든다. AND, OR, NOT 게이트와 플립플롭, 디코더, 멀티플렉서가 구성에 사용된다. 실행 속도가 빠르고 하드웨어 효율이 좋으며 단순한 명령어 집합에 적합하지만, 설계와 디버깅이 복잡하고 수정에는 하드웨어 변경이 필요하다.

Microprogrammed Control Unit은 제어 메모리(Control Memory)에 저장한 마이크로프로그램으로 제어 신호를 생성한다. 제어 메모리(ROM, RAM), 마이크로 명령어 레지스터(MIR), 마이크로 프로그램 카운터(MPC), 시퀀서(Sequencer)로 구성된다. 복잡한 명령어 집합을 지원하고 마이크로프로그램 변경으로 수정할 수 있으며 디버깅도 용이하다. 반면 메모리 접근 때문에 실행 속도가 느리고 제어 메모리라는 추가 하드웨어가 필요하다.

구분 Hardwired Microprogrammed
속도 빠름 느림
설계 복잡도 높음 낮음
수정 용이성 어려움 쉬움
명령어 집합 단순 복잡
사용 예 RISC 프로세서 CISC 프로세서
대표 사례 ARM, MIPS x86 초기 모델, VAX
제어 장치설계 방식HardwiredControl UnitMicroprogrammedControl Unit조합/순차논리 회로고속실행수정어려움제어메모리마이크로프로그램수정용이

명령어 사이클에서 나타나는 제어 신호

Fetch Cycle은 명령어를 메모리에서 가져와 실행 준비를 하는 단계다.

  1. MAR ← PC (메모리 주소 레지스터에 PC 값 로드)
  2. MBR ← Memory[MAR] (메모리 읽기)
  3. IR ← MBR (명령어 레지스터에 저장)
  4. PC ← PC + 1 (프로그램 카운터 증가)

이 과정에서는 MAR_WRITE, MEM_READ, IR_WRITE, PC_INCREMENT 신호가 사용된다.

Decode Cycle에서는 IR의 상위 비트에서 Opcode를 추출하고, Instruction Decoder가 이를 해석한다. 제어 장치는 명령어별 제어 신호를 설정하고 피연산자 주소를 파악한다. 이때 DECODER_ENABLE 신호가 디코더를 활성화한다.

Execute Cycle의 동작은 명령어 종류에 따라 달라진다. ALU 연산, 메모리 접근, 분기 등이 여기에 포함된다. ADD R1, R2 (R1 ← R1 + R2)를 실행한다면 R1과 R2를 ALU 입력으로 읽고 ADD 연산을 수행한 뒤 결과를 R1에 저장한다. 필요한 신호는 R1_READ, R2_READ, ALU_ADD, R1_WRITE다.

Fetch CycleMAR_WRITEMEM_READIR_WRITEPC_INCREMENTDecode CycleDECODER_ENABLE제어 신호패턴 결정Execute Cycle명령어별제어 신호(예: ALU_ADD)
클록 사이클 동작 제어 신호
T0 Fetch 시작 MAR_WRITE, MEM_READ
T1 Fetch 완료 IR_WRITE, PC_INCREMENT
T2 Decode DECODER_ENABLE
T3 Execute 시작 R1_READ, R2_READ, ALU_ADD
T4 Execute 완료 R1_WRITE
컴퓨터구조CPU제어 장치명령어 사이클제어 신호