[CA] Chapter 8-1: Processor(3-1)
[CA] Chapter 8-1: Processor(3-1)
⚙ Computer Architecture 공부
ALU
📚ALU: 모든 계산과 논리 연산 수행
Load/Store instruction
: 메모리 주소를 계산하기 위해add
를 사용Branch instruction
: 두 레지스터 값을 비교하기위해sub
을 사용R-type instruction
: 6-bit function field 값에 따라 다름
ALU Control Unit
Input
- ALUOp(2bits): 명령어 타입을 지정
00
: load/store01
: branch10
: R-type11
: I-type
- Funtion field(6bits): R-type intruction에서 추출된 연산 코드
- 예:100000(
add
), 100010(sub
), 100100(and
) 등
- 예:100000(
Output
- ALU Control Signal(4bits): ALU가 수행할 연산 지정
0000
: AND 연산0001
: OR 연산0010
: Add0110
: Subtract0111
: Set on less than
Seven Control Signals
- RegDst (Register Destination)
- 용도: 어떤 레지스터가 쓰기 작업의 대상이 될지 결정
- 값이 0일 때: 쓰기 레지스터의 대상 번호가
rt
필드(bits 20:16)에서 옴 - 값이 1일 때: 쓰기 레지스터의 대상 번호가
rd
필드(bits 15:11)에서 옴
- RegWrite (Register Write)
- 용도: 레지스터 파일에 데이터를 쓸지 말지를 결정
- 값이 0일 때: 아무 동작 없음 (레지스터에 쓰기 작업을 수행하지 않음)
- 값이 1일 때: 쓰기 레지스터 입력에 있는 레지스터에 쓰기 데이터 입력의 값이 기록됨
- ALUSrc (ALU Source)
- 용도: ALU의 두 번째 입력이 레지스터에서 오는지 or immediate value에서 오는지 결정
- 값이 0일 때: ALU의 두 번째 피연산자는 두 번째 레지스터 파일 출력(
Read data 2
)에서 옴 - 값이 1일 때: ALU의 두 번째 피연산자는 명령어의 부호 확장된 하위 16bits
- PCSrc (Program Counter Source)
- 용도: 다음 명령어의 주소(PC)가 순차적으로 계산되는지 or 분기에 의해 결정되는지 제어
- 값이 0일 때: PC는
PC+4
값을 계산하는 가산기의 출력으로 대체 - 값이 1일 때: PC는
분기 대상
을 계산하는 가산기의 출력으로 대체
- MemRead (Memory Read)
- 용도: 메모리에서 데이터를 읽을지 여부를 결정
- 값이 0일 때: 아무 동작 없음 (메모리에서 읽지 않음)
- 값이 1일 때: 주소 입력에 의해 지정된 데이터 메모리 내용이 읽기 데이터 출력에 배치됨
- MemWrite (Memory Write)
- 용도: 메모리에 데이터를 쓸지 여부를 결정
- 값이 0일 때: 아무 동작 없음 (메모리에 쓰지 않음)
- 값이 1일 때: 주소 입력에 의해 지정된 데이터 메모리 내용이 쓰기 데이터 입력의 값으로 대체됨
- MemtoReg (Memory to Register)
- 용도: 레지스터에 쓰여질 데이터가 ALU 결과인지 메모리에서 읽은 데이터인지 결정
- 값이 0일 때: 레지스터 쓰기 데이터 입력으로 전달되는 값이 ALU에서 옴
- 값이 1일 때: 레지스터 쓰기 데이터 입력으로 전달되는 값이 데이터 메모리에서 옴
Control Unit for Datapath
📚Control Unit: 명령어를 해석하고 해당 명령어 실행에 필요한 모든 제어 신호를 생성
Input
: 명령어의 opcode 부분 (Instruction [31-26])Output
: 7개의 제어 신호 (RegDst, Branch, MemRead, MemtoReg, ALUOp, MemWrite, ALUSrc, RegWrite)
위 사진에는 PCSrc control signal이 AND gate로 대체되었다
- AND gate 입력:
- branch 신호: 현재 명령어가 branch instruction인지 표시 (
Branch = 1
이면 branch 명령어) - Zero 신호: ALU의 연산 결과가 0인지 표시 (
Zero = 1
이면 두 값이 같음)
- branch 신호: 현재 명령어가 branch instruction인지 표시 (
- AND gate 작동 방식:
- 두 입력이 모두 1일 때만 AND gate 출력이 1
- 즉,
branch = 1 and zero = 1
AND gate = 1
→ 계산된 분기 대상 주소가 PC에 기록된다
명령어 타입에 따른 Control Signal 분석
R-type
RegDst = 1
: 목적지 레지스터 필드로 rd(bits 15-11)를 선택ALUSrc = 0
: ALU의 두 번째 입력으로 레지스터 값을 사용(즉시값 아님)MemtoReg = 0
: 레지스터에 쓰일 데이터는 ALU 결과에서 옴(메모리에서 읽은 값이 아님)RegWrite = 1
: 레지스터에 쓰기 작업을 수행MemRead = 0
: 데이터 메모리에서 읽기 작업 수행 XMemWrite = 0
: 데이터 메모리에 쓰기 작업 수행 XBranch = 0
: 분기 명령어 XALUOp = 10
: ALU 제어 유닛에 R-타입 명령어임을 전달, 이 값을 통해 ALU는 function 필드(비트 5-0)를 검사하여 구체적인 연산(add, sub, and 등)을 결정
✅동작 과정:
- 명령어를 가져와 해석
- 두 소스 레지스터(rs, rt)에서 값을 읽음
- Function 필드에 따라 ALU 연산을 수행
- ALU 결과를 목적지 레지스터(rd)에 저장
- PC를 다음 명령어로 증가시킴(PC+4)
lw
RegDst = 0
: 목적지 레지스터 필드로 rt(비트 20-16)를 선택ALUSrc = 1
: ALU의 두 번째 입력으로 즉시값(오프셋)을 사용MemtoReg = 1
: 레지스터에 쓰일 데이터는 메모리에서 읽은 값에서 옴RegWrite = 1
: 레지스터에 쓰기 작업을 수행MemRead = 1
: 데이터 메모리에서 읽기 작업을 수행MemWrite = 0
: 데이터 메모리에 쓰기 작업 수행 XBranch = 0
: 분기 명령어 XALUOp = 00
: ALU는 주소 계산을 위해 덧셈 연산을 수행
✅동작 과정:
- 명령어를 가져와 해석
- 기본 주소 레지스터(rs)에서 값을 읽음
- 기본 주소에 부호 확장된 즉시값(오프셋)을 더하여 메모리 주소를 계산
- 계산된 주소에서 데이터 메모리 값을 읽음
- 읽은 데이터를 목적지 레지스터(rt)에 저장
- PC를 다음 명령어로 증가시킴(PC+4)
sw
RegDst = X
: don’t care, 레지스터에 쓰기 작업을 수행하지 않기 때문ALUSrc = 1
: ALU의 두 번째 입력으로 즉시값(오프셋)을 사용MemtoReg = X
: don’t care, 레지스터에 쓰기 작업을 수행하지 않기 때문RegWrite = 0
: 레지스터에 쓰기 작업 수행 XMemRead = 0
: 데이터 메모리에서 읽기 작업 수행 XMemWrite = 1
: 데이터 메모리에 쓰기 작업 수행Branch = 0
: 분기 명령어 XALUOp = 00
: ALU는 주소 계산을 위해 덧셈 연산을 수행
✅동작 과정:
- 명령어를 가져와 해석
- 기본 주소 레지스터(
rs
)와 저장할 데이터를 담은 레지스터(rt
)에서 값을 읽음 - 기본 주소에 부호 확장된 즉시값(오프셋)을 더하여 메모리 주소를 계산
- 레지스터(
rt
)의 값을 계산된 메모리 주소에 저장 - PC를 다음 명령어로 증가시킴(PC+4)
beq
RegDst = X
: don’t care, 레지스터에 쓰기 작업을 수행하지 않기 때문ALUSrc = 0
: ALU의 두 번째 입력으로 레지스터 값을 사용MemtoReg = X
: don’t care, 레지스터에 쓰기 작업을 수행하지 않기 때문RegWrite = 0
: 레지스터에 쓰기 작업 수행 XMemRead = 0
: 데이터 메모리에서 읽기 작업 수행 XMemWrite = 0
: 데이터 메모리에 쓰기 작업 수행 XBranch = 1
: 분기 명령어 OALUOp = 01
: ALU는 두 레지스터 값을 비교하기 위해 뺄셈 연산을 수행
✅동작 과정:
- 명령어를 가져와 해석
- 비교할 두 레지스터(rs와 rt)에서 값을 읽음
- ALU가 두 값의 차이를 계산(sub 연산)
- 결과가 0이면(두 값이 같으면), Zero 신호가 1
- Branch와 Zero 신호가 모두 1이면, AND 게이트의 출력이 1이 되어 분기가 발생
- 분기가 발생하면, PC에 분기 대상 주소(PC+4+부호 확장된 즉시값*4)가 기록됨
- 분기가 발생하지 않으면, PC는 단순히 다음 명령어로 증가(PC+4)
This post is licensed under CC BY 4.0 by the author.