제어 장치
개요
- 목적: 제어 장치는 DigiSim의 8비트 컴퓨터 아키텍처에서 조율을 담당하는 구성요소입니다. 프로그램 카운터, 메모리(RAM), 명령 레지스터, ALU, 플래그 레지스터 및 기타 구성요소를 조율하여 완전한 명령어 세트를 실행하는 데 필요한 제어 신호를 생성합니다.
- 기호: 제어 장치는 다양한 CPU 구성요소와 인터페이스하기 위한 여러 입출력 핀이 있는 직사각형 블록으로 표현됩니다.
- DigiSim.io 역할: 제어 장치는 인출-해독-실행-저장 사이클을 통해 모든 시스템 구성요소를 적절히 순서화하고 제어함으로써 완전하고 기능적인 8비트 컴퓨터의 생성을 가능하게 합니다.

기능 설명
상태 기계 동작
제어 장치는 다음 4가지 상태를 순환하는 유한 상태 기계로 동작합니다:
- FETCH (인출): 메모리에서 다음 명령어를 가져옴
- DECODE (해독): 명령어를 해독하고 프로그램 카운터를 증가시킴
- EXECUTE (실행): 명령어에 지정된 연산을 수행함
- STORE (저장): 결과를 저장하고 필요에 따라 플래그를 업데이트함
입력 및 출력
입력 (7핀):
| 핀 | 핀 이름 | 유형 | 설명 |
|---|---|---|---|
| 0 | CLK | 입력 | 동기 동작을 위한 시스템 클록 |
| 1 | RST | 입력 | 제어 장치를 초기화하기 위한 리셋 신호 |
| 2 | OP0 | 입력 | 명령 레지스터의 연산 코드 비트 0 |
| 3 | OP1 | 입력 | 명령 레지스터의 연산 코드 비트 1 |
| 4 | OP2 | 입력 | 명령 레지스터의 연산 코드 비트 2 |
| 5 | OP3 | 입력 | 명령 레지스터의 연산 코드 비트 3 |
| 6 | Z_FLAG | 입력 | 조건부 점프를 위한 플래그 레지스터의 제로 플래그 |
출력 (18핀):
| 핀 | 핀 이름 | 유형 | 설명 |
|---|---|---|---|
| 0 | PC_INC | 출력 | 프로그램 카운터 증가 |
| 1 | PC_LD | 출력 | 프로그램 카운터 로드 (점프용) |
| 2 | PC_OE | 출력 | 프로그램 카운터 출력 활성화 (주소 버스로) |
| 3 | MEM_RD | 출력 | 메모리 읽기 활성화 |
| 4 | MEM_WR | 출력 | 메모리 쓰기 활성화 |
| 5 | RAM_OE | 출력 | RAM 출력 활성화 (데이터 버스로) |
| 6 | IR_LD | 출력 | 명령 레지스터 로드 |
| 7 | IR_ADDR_OE | 출력 | IR 주소 출력 활성화 (주소 버스로) |
| 8 | ALU_OP0 | 출력 | ALU 연산 코드 비트 0 |
| 9 | ALU_OP1 | 출력 | ALU 연산 코드 비트 1 |
| 10 | ALU_OP2 | 출력 | ALU 연산 코드 비트 2 |
| 11 | ALU_OE | 출력 | ALU 출력 활성화 (데이터 버스로) |
| 12 | ACC_LD | 출력 | 누산기 로드 |
| 13 | ACC_OE | 출력 | 누산기 출력 활성화 (데이터 버스로) |
| 14 | FLG_LD | 출력 | 플래그 레지스터 로드 |
| 15 | HALT | 출력 | 시스템 정지 표시기 |
| 16 | STATE0 | 출력 | 상태 비트 0 (2비트 상태 인코딩의 LSB) |
| 17 | STATE1 | 출력 | 상태 비트 1 (2비트 상태 인코딩의 MSB) |
상태 인코딩 (STATE1:STATE0):
00→ FETCH (인출)01→ DECODE (해독)10→ EXECUTE (실행)11→ STORE (저장)
명령어 세트 아키텍처
제어 장치는 4비트 연산 코드를 가진 16개의 명령어 세트를 지원합니다:
| 연산 코드 | 16진수 | 니모닉 | 설명 | 동작 |
|---|---|---|---|---|
| 0000 | 0x0 | NOP | 무연산 | PC ← PC + 1 |
| 0001 | 0x1 | LDA addr | 누산기 로드 | ACC ← M[addr] |
| 0010 | 0x2 | STA addr | 누산기 저장 | M[addr] ← ACC |
| 0011 | 0x3 | ADD addr | 누산기에 더하기 | ACC ← ACC + M[addr] |
| 0100 | 0x4 | SUB addr | 누산기에서 빼기 | ACC ← ACC - M[addr] |
| 0101 | 0x5 | AND addr | 논리 AND | ACC ← ACC & M[addr] |
| 0110 | 0x6 | OR addr | 논리 OR | ACC ← ACC | M[addr] |
| 0111 | 0x7 | XOR addr | 논리 XOR | ACC ← ACC ^ M[addr] |
| 1000 | 0x8 | NOT | 논리 NOT | ACC ← ~ACC |
| 1001 | 0x9 | SHL | 왼쪽 시프트 | ACC ← ACC << 1 |
| 1010 | 0xA | SHR | 오른쪽 시프트 | ACC ← ACC >> 1 |
| 1011 | 0xB | JMP addr | 무조건 점프 | PC ← addr |
| 1100 | 0xC | JZ addr | 제로일 때 점프 | if (Z=1) PC ← addr |
| 1101 | 0xD | JNZ addr | 제로가 아닐 때 점프 | if (Z=0) PC ← addr |
| 1110 | 0xE | LDI | 즉시 로드 | 향후 사용을 위해 예약됨 |
| 1111 | 0xF | HLT | 정지 | 실행 중지 |
명령어 형식
| 비트 위치 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 필드 | OPCODE (4비트) | OPERAND (4비트) | ||||||
| 설명 | 수행할 연산 | 메모리 주소/값 |
마이크로코드 아키텍처
제어 신호 생성
제어 장치는 마이크로코드 ROM 방식을 사용하며, 각 명령어는 네 가지 상태에 걸쳐 마이크로 연산으로 분해됩니다. 연산 코드와 상태의 각 조합은 특정 제어 신호 세트를 생성합니다.
예시: LDA (누산기 로드) 명령어
FETCH 상태:
- PC_OE = 1 (PC가 주소 버스를 구동)
- MEM_RD = 1 (메모리에서 명령어 읽기)
- IR_LD = 1 (IR에 명령어 로드)
DECODE 상태:
- PC_INC = 1 (다음 명령어로 PC 증가)
EXECUTE 상태:
- IR_ADDR_OE = 1 (IR 주소가 주소 버스를 구동)
- MEM_RD = 1 (메모리 주소에서 데이터 읽기)
STORE 상태:
- RAM_OE = 1 (RAM이 데이터 버스를 구동)
- ACC_LD = 1 (누산기에 데이터 로드)
- FLG_LD = 1 (플래그 업데이트)
버스 제어 및 트라이스테이트 관리
제어 장치는 한 번에 하나의 구성요소만 각 버스를 구동하도록 하여 버스 경합을 신중하게 관리합니다:
- 주소 버스: PC_OE 또는 IR_ADDR_OE로 제어
- 데이터 버스: RAM_OE, ALU_OE 또는 ACC_OE로 제어
다른 구성요소와의 통합
구성요소 호환성
제어 장치는 DigiSim의 기존 구성요소와 원활하게 작동하도록 설계되었습니다:
- 8비트 ALU: 연산 코드(ALU_OP0-2)를 수신하고 플래그와 함께 결과 제공
- 프로그램 카운터: PC_INC, PC_LD, PC_OE 신호로 제어
- RAM (256×8): MEM_RD, MEM_WR, RAM_OE 신호로 관리
- 명령 레지스터: IR_LD를 통해 로드되고 연산 코드/주소 분리 제공
- 플래그 레지스터: FLG_LD를 통해 업데이트되고 조건부 점프를 위해 읽힘(Z_FLAG)
- 누산기: ACC_LD 및 ACC_OE 신호로 제어
신호 타이밍
제어 장치는 모든 구성요소에 대한 적절한 설정 및 유지 시간을 보장합니다:
- 주소 설정: 메모리 동작 전에 주소 신호가 안정화됨
- 데이터 유효: 로드 신호가 활성화될 때 데이터가 유효함
- 클록 동기화: 모든 상태 변경은 클록 상승 에지에서 발생
- 리셋 동작: 알려진 상태로의 즉각적인 비동기 리셋
사용 예시
간단한 프로그램: 두 수 더하기
; 메모리에 저장된 두 수 더하기
0x0: LDA 0x8 ; 주소 0x8에서 첫 번째 수 로드
0x1: ADD 0x9 ; 주소 0x9의 두 번째 수 더하기
0x2: STA 0xA ; 주소 0xA에 결과 저장
0x3: HLT ; 실행 정지
...
0x8: 0x05 ; 첫 번째 수 (5)
0x9: 0x03 ; 두 번째 수 (3)
0xA: 0x00 ; 결과 위치
반복 예시: 1에서 10까지 세기
; 0에서 10까지 세기
0x0: LDA 0x8 ; 카운터 로드
0x1: ADD 0x9 ; 1 더하기
0x2: STA 0x8 ; 카운터 저장
0x3: SUB 0xA ; 10 빼기
0x4: JNZ 0x0 ; 0이 아니면 돌아가기
0x5: HLT ; 완료 시 정지
...
0x8: 0x00 ; 카운터
0x9: 0x01 ; 상수 1
0xA: 0x0A ; 상수 10
기술 참고사항
클록 요구사항
- 최소 주파수: 교육적 관찰을 위한 1 Hz
- 최대 주파수: 구성요소 전파 지연에 의해 제한됨
- 듀티 사이클: 최적의 타이밍 마진을 위해 50% 권장
리셋 동작
- 비동기 리셋: 상태를 즉시 FETCH로 설정
- 신호 클리어: 모든 제어 신호가 비활성 상태로 리셋
- 정지 복구: 실행을 재개하려면 리셋이 필요함
성능
- 모든 명령어: 4 클록 사이클 (인출-해독-실행-저장)
- 초당 명령어 수: 클록 주파수 ÷ 4
- 메모리 대역폭: 명령어 사이클당 한 번의 읽기 또는 쓰기