컴퓨터 구조 4-4강. 단순한 구현

기타/[컴퓨터 구조]

2019. 12. 9. 18:45

 

[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-형식 명령어의 데이터패스

# 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