컴퓨터구조 4-3강. 데이터패스 만들기

기타/[컴퓨터 구조]

2019. 12. 5. 14:15

앞서 봤던 MIPS 기본 구현의 장치 하나하나를 연결해보며 장치들 이해해보는 장입니다.

---------------------- 모든 명령어의 공통 작업인 1,2 단계에 수행 과정 ----------------------

[명령어 인출을 위한 데이터 패스 구성 요소]

1. 명령어 메모리(Instruction memory)

  : 프로그램의 명령어를 저장하고, 주소가 주어지면 해당 명령어를 보내 주는 메모리 유닛

  : ROM(읽기 전용) 취급 - 단, 실제 컴퓨터에선 읽기/쓰기 가능하다.

 

2. 프로그램 카운터(PC)

  : PC는 현재 명령어의 주소를 가지고 있는 레지스터

  : 제어신호 필요 없음(항상 클럭사이클 끝에서 쓰기가 실행되기 때문)

 

3. 덧셈기(Adder)

  : PC를 다음 명령어 주소로 증가시키는 덧셈기

  : 두개의 입력을 받는데 하나는 PC, 다른하나는 32비트 상수 4로 고정 / 출력은 항상 PC + 4

 

# 각 장치의 모습

a. 명령어 메모리 / b. 프로그램 카운터 / c. 덧셈기

 

# 명령어를 인출하고 프로그램 카운터를 증가시키는데 사용되는 데이터패스의 일부분

 

명령어 인출후 PC 증가해 다음명령어 주소지정

: 1단계(명령어 인출, PC + 4) 작업을 수행

 

 

 

---------------------- 이제부터 명령어 형식에 따른 서로 다른 3,4단계 수행 과정 ----------------------

[(1) R-형식 명령어의 실행]

1. 레지스터(Register)

  : R-형식 명령어는 3개의 피연산자(5,5,5bit)를 사용한다 (2개의 읽기 포트, 1개의 쓰기 포트)

  : 레지스터에서 2개의 reg 주소에 위치해 있던 데이터 두개를 내보내 준다.

  : 출력 제어 신호는 필요없지만 레지스터에 입력(쓰기)에 대한 제어신호는 필요하다(RegWrite)

레지스터의 모습

 

2. ALU

  : 위에서 보낸 두개의 데이터는 ALU에 전송되고, 제어신호(ALU operation - 4비트)으로 보내진 연산 명령을 수행한다.

  : 나중에 분기 존재시 Zero 사용.

ALU의 모습

 

# R-형식 명령어로 주어진 데이터와 연산 결과를 다시 레지스터에 저장시키는 데이터 패스

  : ALU의 연산 결과가 다시 레지스터로 와, 쓰기 포트로 들어온 주소 위치에 해당 데이터를 저장한다. (RegWrite에 따라 저장 여부 결정)

 

 

 

[(2)메모리 참조 명령어(sw,lw)의 실행]

: 메모리 참조 명령어는 위의 두 작업(레지스터 파일, ALU)를 거지고 2개의 유닛이 추가로 더 필요하다.

: 우선 sw, lw 명령어는 2개의 피연산자만 사용된다(읽기포트1개, 쓰기포트 1개)

: 그래서 레지스터에서 data한개만 내보내주면 되는데, 이때 출력포트 한개가 남게 된다.

1. 데이터 메모리(Data memory)

  : 2개의 입력(주소와 Write data)와 1의 출력(Read data)로 구성되어 있다.

  : 명령어가 sw, lw에 따라 2개의 제어신호(MemWrite, MemRead)가 작동해 Write data와 Read data 둘중에 하나만 사용된다.

  

2. 부호확장 유닛(Sign-extend)

  : 16비트의 입력을 32비트의 부호 있는 값으로 확장시켜주는 유닛

  : 16비트의 값중 제일 왼쪽의 있는 값을 복제해 16개를 추가시켜 32비트로 만드는 구조이다.

부호확장 유닛
부호확장 유닛의 구현

 

# 저장(sw) 명령어 데이터패스

 

# 적재(lw) 명령어 데이터패스

 

 

 

[(3) 분기 명령어(beq)의 실행]

: 레지스터와 ALU외의 2개의 유닛(왼쪽자리이동 유닛, 별도의 덧셈기)이 추가로 필요하다

1. 왼쪽 자리이동 유닛(shift-left-2 unit)

  : 분기명령어가 true일때 지정한 주소로 이동하는데 이때, 이동시에 offset(4칸)의 표현영역을 생략해주기 위한 유닛(3강에서 배움)

자리이동 유닛의 구현

2. 별도의 덧셈기

  : 이동해줘야하는 주소의 PC값으로 지정해줘야하기 때문에 필요하다(상대주소기때문에 입력은 PC+4와 shift한 상대주소값)

 

# 분기명령어 데이터 패스

 

 

 

 

[단일 데이터패스]

: 이제 위에서 만들어본 데이터패스를 합쳐서, 모든 명령어를 한 클럭 사이클 내에 실행되게끔 만들기

: 어느 데이터 패스 자원도 명령어당 두번 이상 사용 불가능

 

# MIPS 구조를 위한 단순한 데이터 패스

  : Mux는 분기일때 분기중 하나 선택해주는 역할 (멀티플렉서)