## 목차 ##

  1. 제어 유닛의 기능
  2. 제어 유닛의 구조
  3. 마이크로명령어 형식
  4. 마이크로프로그래밍
  5. 마이크로프로그램의 순서 제어


## 0. Intro ##

앞서 배운 ALU 및 레지스터들의 동작은 명령어를 인출하고 실행하는 과정 자체이었다. 그런데 이러한 일들의 순서 및 동작이 일어나게 하기 위한 제어 신호를 발생시키는것은 제어유닛이다. 제어유닛이 발생시키는 제어신호들로 하여금 각각의 모듈들이 어떠한 일을 실행할지 결정된다.


## 1. 제어 유닛의 기능 ##

제어유닛이 담당하는 중요한 기능 두 가지는 아래와 같다.

  • 명령어 해독
  • 명령어 실행을 위한 제어신호 발생

인출된 명령어를 해독하고 실행에 필요한 동작을 수행시키기 위한 제어신호를 발생하는 것이다. 즉, 명령어 사이클이 수행될 수 있도록 모든 동작을 제어하는 컨트롤타워 역할을 한다.

하나의 명령어 사이클은 여러개의 마이크로 연산으로 구성되는것을 상기해보자. 아래는 인출 사이클을 위한 마이크로 연산 과정이다.

t0 : MAR ← PC

t1 : M\[MAR\] ← MBR, PC ← PC + 1

t2 : IR ← MBR

하나의 마이크로 연산은 한 번의 CPU 클럭 주기동안 수행된다. 즉, 인출 사이클에는 3 CPU 클럭 주기가 소요된다.

위와에서 단 하나의 마이크로 연산 역시 수행되어야 할 하나의 명령어이므로 2진 비트로 구성된다. 이처럼 하나의 마이크로연산을 위한 명령어를 마이크로 명령어(micro-instruction)라고 부른다. 한 주기에 실행되는 명령어라는 의미에서 제어 단어(control word)라고도 부른다. 마이크로 명령어들의 집합을 마이크로 프로그램(microprogram)이라고 부른다.

명령어 사이클을 하나의 마이크로 프로그램으로 본다면 이는 3개의 루틴(routine)으로 구성되어있다고 할 수 있다.(인출 사이클 루틴, 간접 사이클 루틴, 실행 사이클 루틴) 루틴은 CPU의 특정 기능 수행을 위한 마이크로 명령어들을 논리적으로 묶은 마이크로명령어 그룹이다.


## 2. 제어 유닛의 구조 ##

아래 그림은 제어유닛의 구조를 보여준다.

control_unit_structure

1) 명령어 해독기(instruction decoder)

명령어의 연산코드를 해독하여 해당 연산의 수행을 위한 루틴의 시작 주소를 결정한다. 즉, 모든 마이크로 명령어를 위한 루틴들이 저장되어있는 제어 기억장치에서 해당 연산의 루틴이 저장된 곳의 주소를 알려주는 역할이다.

2) 제어 주소 레지스터(control address register : CAR)

명령어 해독기가 알려준 마이크로 명령어의 주소가 임시로 저장되는 레지스터이다.

3) 제어 기억장치(control memory)

마이크로 명령어들로 이루어진 루틴들이 저장된 곳이다. 마이크로 명령어들은 CPU 설계 단계에서 확정되기때문에 제어 기억장치는 ROM(Read-Only Memory)로 만들어진 후 CPU칩 안에 포함된다.

4) 제어 버퍼 레지스터(control buffer register : CBR)

제어 기억장치에서 빼낸 마이크로 명령어가 일시적으로 저장되는 레지스터

5) 서브루틴 레지스터(subroutine register : SBR)

CBR에 임시로 저장된 마이크로명령어의 실행에서 서브루틴이 호출되는 경우에 현재의 CAR 내용을 임시적으로 저장하기 위한 레지스터

6) 순서제어 모듈(sequencing module)

마이크로명령어들의 실행 순서를 결정한다.


제어 기억장치에는 루틴들이 저장되어 있다고 했는데, 내부 구성은 아래 그림과 같다.

control_memory_structure

위 그림에 나타난 제어 기억장치에는 0~63번지 까지는 공통 루틴들이, 64~127번지 까지는 실행 사이클 루틴들이 저장되어 있다.



명령어 해독기는 연산코드(op-code)를 해독하여 해당 실행 루틴이 저장된 제어 기억장치의 주소를 찾아야한다. 이를 위한 여러 방법들 중 매핑(mapping)에 대해 알아본다.

매핑에서는 연산 코드를 특정 비트 패턴과 혼합시켜 실행 사이클 루틴이 저장된 제어 기억장치의 주소를 찾아낸다. 아래 그림을 보자.

routine_mapping

먼저 명령어 형식이 16비트이고 이는 4비트의 연산코드와 1비트의 간접비트, 11비트의 오퍼랜드로 구성되어있다고 가정해보자.

위 그림에서는 1XXXX00이라는 사상함수에 연산코드 4비트를 매핑시킨다.

만약 연산코드가 0001이라면 사상결과는 1000100이 되고 이는 10진수로 68번지가 된다. 즉, 제어 주소 레지스터(CAR)에는 제어 기억장치의 68번지가 저장된다. 이후로 실행 사이클이 시작되면 68번지에서 시작되는 루틴의 마이크로 명령어들을 순차적으로 꺼내어 수행하게 된다.


## 3. 마이크로명령어 형식 ##

제어 기억장치에 저장된 루틴들은 각각이 여러개의 마이크로 명령어들로 이루어져있다. 아래 그림은 하나의 마이크로 명령어 형식의 예시이다.

micro_instruction_format

a) 연산 필드

마이크로 연산의 종류를 지정한다. 종류들의 예시는 아래 표와 같이 정리될 수 있다.

operation_field_table

각각은 연산필드1과 연산필드2의 마이크로 연산들의 예시를 보여준다. 예를들어 명령어 인출의 두 번째 마이크로연산에서 MBR ← M[MAR]과 PC ← PC + 1은 동시에 일어나야하므로 다른 연산 필드에 위치해야 한다.

위에서 제시한 마이크로 명령어 형식에서는 연산필드가 2개이므로 2개의 마이크로 명령어가 동시에 실행될 수 있다.

b) 조건 필드

분기에 사용될 조건 플래그를 지정한다. 조건필드가 검사하는 조건이 1(SET)인지 0(CLEAR)인지에 따라 분기필드가 지정하는 분기가 일어날지 말지 결정된다.

conditional_field_table

조건 필드는 2개의 비트로 지정된다. 예를 들어 00이면 무조건 분기가 일어나고 11이면 AC에 저장된 데이터가 0인지 검사 후 true(1=SET)이면 분기가 일어나고 false(0=CLEAR)면 분기가 일어나지 않는다.

c) 분기 필드

분기의 종류를 지정한다. 분기의 종류에따라 다음에 실행될 마이크로 명령어의 주소가 결정된다.

branch_field_table

만약 분기 필드의 비트가 01이면 이는 서브루틴 호출을 나타낸다. 조건필드가 만족되어 1이면 주소필드(ADF) 값이 제어 주소 레지스터(CAR)로 적재된다. 이 때 서브루틴 호출이 끝난 후 복귀를 위해 다음에 실행되어야 할 CAR + 1 값은 서브루틴 레지스터(SBR)에 잠시 저장해둔다. 만약 조건필드가 만족되지 않는다면 CAR값이 1 증가하고 이에따라 다음 순서의 마이크로 명령어가 수행된다.

d) 주소 필드

분기가 발생하는 경우 분기될 마이크로명령어가 있는 목적지 주소이다.


## 4. 마이크로프로그래밍 ##

제어 기억장치에 저장된 각각의 루틴들을 하나씩 마이크로프로그래밍 해보자.



1) 인출 사이클 루틴

인출 사이클 루틴은 3개의 마이크로 명령어들로 구성된다.

fetch_routine

인출 사이클 루틴은 제어 기억장치의 0번지부터 시작된다. 따라서 각각의 마이크로 명령어는 00000000, 00000001, 00000010 번지에 저장되어 있다.

마지막 사이클에서는 조건필드가 U이고 분기필드가 MAP이므로 실행 사이클의 루틴 시작주소를 CAR로 매핑시킨다. 따라서 다음 사이클에서는 해당 실행 사이클 루틴으로 분기가 된다.



2) 간접 사이클 루틴

간접 사이클 루틴은 명렁어의 I 비트가 SET 일때 호출된다.

indirect_routine

간접 사이클 루틴의 마지막 마이크로명령어의 분기 필드는 원래의 실행 사이클로 복귀하기위한 RET이다. 간접 사이클 루틴을 호출할 때 서브루틴 레지스터(SBR)에 저장해두었던 목적지 주소를 다시 CAR에 적재하게 된다.



3) 실행 사이클 루틴

아래 테이블은 명령어의 대표적인 연산 코드들을 정리한 것이다.

operation_codes

각각의 연산코드별로 제어 기억장치에 저장된 루틴의 시작주소들의 매핑값이 표시되어 있다.

아래는 각각의 실행 루틴의 마이크로 프로그래밍 순서들을 나타낸다.



execute_routine

여기서 중요한점은 모든 실행 루틴의 마지막 마이크로 명령어의 분기 목적지 주소인 주소필드의 내용이 FETCH인 것이다. 즉, 실행사이클 루틴이 끝나면 다음 명령어 인출을 위한 인출 사이클 루틴으로 분기하게 된다.


## 5. 마이크로프로그램의 순서 제어 ##

지금까지의 내용 중 핵심은 제어 기억장치에 저장된 마이크로 명령어 혹은 루틴을 적절히 인출하는 것이다. 이번 포스팅의 가장 처음에 보여준 그림의 순서제어 모듈을 좀더 세부적으로 뜯어보면 아래 그림과 같다.

sequencing_module

제어 주소 레지스터에 어떤 값이 들어가냐에 따라 다음에 인출할 마이크로 명령어가 달라진다. 현재 실행중인 마이크로 명령어의 조건 필드(CD)가 MUX2로 들어와 네 개의 조건 비트 중 하나의 값이 주소 선택회로의 입력으로 들어간다. 주소선택회로의 또다른 입력은 현재 실행중인 마이크로 명령어의 분기 필드(BR) 값이다. 즉, 조건필드와 분기필드에 따라 다음에 어떤 마이크로 명령어를 인출할지가 결정되는 것이다. MUX1에는 다음 순서의 마이크로 명령어 시작주소(0), 현재 실행중인 마이크로 명령어에 있는 목적지 주소(1), 서브루틴 호출이 끝난 후의 복귀 주소(SBR), 명령어 실행의 연산코드에 따른 매핑 주소(3) 4개가 입력으로 들어오며, 주소선택 회로의 결과에 따라 4개 중 어떤 주소가 선택될지 결정되는 것이다.

최종적으로 선택된 주소가 제어 주소 레지스터(CAR)로 들어오게 되며 제어 기억장치의 해당 주소에서 마이크로 명령어가 인출된다.

그리고 인출된 마이크로 명령어의 연산 코드는 제어 신호가 되어 외부로 전송된다. 연산 코드 이외의 조건필드, 분기필드, ADF는 다음 마이크로 명령어 인출을 위해 순서 제어 모듈로 들어가 CAR에 적절한 제어 기억장치의 루틴 시작 주소를 적재시킨다.

+ Recent posts