[ALU 제어]
: 명령어에 따라 ALU에서 수행하는 연산작업이 다른데, 그에 따른 ALU에 전달되는 제어 신호
# ALU 제어 신호의 종류 6가지
ALU 제어 신호 | 연산 종류 |
0000 | AND |
0001 | OR |
0010 | add |
0110 | subtract |
0111 | set on less than |
1100 | NOR |
# 명령어별 ALU 제어 신호
지시어 opcode | ALUop(명령어 제어 필드) | 연산자 종류 | funct | 필요한 ALU 연산 | 들어오는 ALU 제어 신호 |
R-type | 10 | add | 100000 | add | 0010 |
R-type | 10 | subtract | 100010 | subtract | 0110 |
R-type | 10 | AND | 100100 | and | 0000 |
R-type | 10 | OR | 100101 | or | 0001 |
R-type | 10 | set on less then | 101010 | set on less than | 0111 |
lw | 00 | lw | xxxxxx | add | 0010 |
sw | 00 | sw | xxxxxx | add | 0010 |
beq | 01 | branch on equal | xxxxxx | subtract | 0110 |
: R-타입 명령어를 제외한 명령어 lw, sw, beq 명령어는 add와 subtract 연산으로 해결할 수 있다.
# 4비트 ALU 제어 신호를 위한 진리표
: 입력된 명령어에 따른 ALUop와 Funct 필드에 따라 ALU 제어 신호를 생성한다.
명령어의 ALUop(제어필드) - Op1, Op0 | Funct field | Operation(발생하는 ALU 제어 신호) | 비고 |
0 0 | xxxxxx | 0010 | 둘다 0이면 sw, lw => add |
X 1 | xxxxxx | 0110 | Op1값 1인게 beq밖에 없다 |
1 X | xx0000 | 0010 | add |
1 X | xx0010 | 0110 | subtract |
1 X | xx0100 | 0000 | and |
1 X | xx0101 | 0001 | or |
1 X | xx1010 | 0111 | set on less then |
: R타입은 Op1이 항상 1이다.
: ALUop가 00이면 기능 필드 값 상관없이 제어신호 정해진다.
: 이 진리표가 만들어지면, 최적화후 게이트로 변환작업을 기계적으로 수행한다.
[ALU 제어장치의 구현]
: 위에서 구한 명령어에 따른 ALU 제어 신호를 만들어 내기 위한 제어장치를 구현한다.
# 주 제어 유닛의 설계
[데이터패스의 제어신호]
# 제어신호와 멀티플랙서가 있는 데이터 패스
# 제어신호의 기능
신호 이름 | 인가되지 않은 경우(0) | 인가된 경우(1) |
RegDst | 명령어 rt 필드(20:16)가 Write reg로 입력 | 명령어 rd 필드(15:11)가 Write reg로 입력 |
RegWrite | 아무 일 발생 X | Write reg에 저장된 레지스터에 Write data 작성 |
ALUSrc | Read data 2가 ALU의 두번째 피연산자가 된다 | 부호확장된 하위 16비트가 ALU의 두번째 피연산자가 된다. |
PCSrc | PC+4가 새로운 PC값이 된다. | 분기 목적지 주소가 새로운 PC값이 된다. |
MemRead | 아무 일 발생 X | 데이터 메모리의 내용을 Read data 출력으로 내보낸다. |
MemWrite | 아무 일 발생 X | 데이터 메모리의 내용을 Write data 입력 값으로 바꾼다. |
MemtoReg | ALU 출력이 레지스터의 Write data 입력이 됨 | 데이터 메모리 출력이 레지스터의 Write data 입력이 된다 |
[명령어에 따른 데이터 패스와 제어신호]
1. R형식 명령어의 실행과정
1) 명령어 인출 및 PC 증가
2) 두 Read reg의 레지스터의값을 읽고, 해당 값을 계산
3) ALU는 읽어들인 값에 대한 연산 (funct 필드 값을 사용해 ALU 제어신호 생성)
4) ALU 계산 결과를 Write reg에 저장된 레지스터에 저장
# R-형식 명령어의 제어신호
RegDst | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUOp |
1 | 0 | 0 | 1 | 0 | 0 | 0 | 10 |
2. 적재(lw) 명령어의 실행과정
1) 명령어 인출 및 PC 증가
2) read용 reg 읽어 값 계산
3) 읽어들인 read reg의 주소 값에 부호확장한 하위 16비트 값 더해 유효주소 계산
4) ALU 계산 결과를 주소로 사용해 데이터 메모리 읽기
5) 가져온 데이터를 Write reg에 저장
# 적재 명령어의 제어신호
RegDst | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUOp |
0 | 1 | 1 | 1 | 1 | 0 | 0 | 00 |
3. 저장(sw) 명령어의 실행과정
1) 명령어 인출 및 PC 증가
2) read용 reg 읽어 값 계산
3) 읽어들인 read reg의 주소 값에 부호확장한 하위 16비트 값 더해 유효주소 계산
4) ALU 계산 결과를 주소로 사용해 데이터 메모리에 쓰기
# 저장 명령어의 제어신호
RegDst | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUOp |
X | 1 | X | 0 | 0 | 1 | 0 | 00 |
4. 분기 명령어의 실행 과정
1) 명령어 인출 및 PC 증가
2) 두 Read reg의 레지스터의값을 읽고, 해당 값을 계산
3) ALU에서 두 reg 값을 뺌, 별도의 주소 덧셈기는 하위 16비트 부호확장하고 자리이동한값과 PC+4 더해 주소 계산
4) ALU zero 출력 이용해 PC에 넣을 값 선택
# 분기 명령어의 제어신호
RegDst | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUOp |
X | 0 | X | 0 | 0 | 0 | 1 | 01 |
5. 점프 명령어가 추가된 데이터 패스
: jump는 직접 워드 주소를 사용한다 => 새로운 멀티플렉서와 제어신호가 필요
# 점프 명령어의 제어신호
RegDst | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUOp | Jump |
X | X | X | 0 | 0 | 0 | X | XX | 1 |
# 각 명령어의 제어신호 종합
명령어 | opcode | RegDst | ALUSrc | MemtoReg | RegWrite | memRead | MemWrite | Branch | ALUOp1 | ALUOp2 | Jump |
R-형식 | 000000 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
lw | 100011 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
sw | 101011 | X | 1 | X | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
beq | 000100 | X | 0 | X | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
j | 000010 | X | X | X | 0 | 0 | 0 | X | X | X | 1 |
'기타 > [컴퓨터 구조]' 카테고리의 다른 글
컴퓨터 구조 4-6강. 파이프라인 데이터패스 및 제어 (3) | 2019.12.10 |
---|---|
컴퓨터구조 4-5강. 파이프라이닝(Pipelining) (1) | 2019.12.10 |
컴퓨터구조 4-3강. 데이터패스 만들기 (0) | 2019.12.05 |
컴퓨터 구조 4-1강. 서론과 MIPS 부분집합 구현의 추상적 개관 (1) | 2019.11.21 |