본문 바로가기
Computer/Computer Architecture

처리장치(II)

by curious week 2025. 10. 13.

ALU–상태 레지스터–시프터–제어단어

연산 기호

 

Electronic symbol - Wikipedia

From Wikipedia, the free encyclopedia Pictogram used to represent various electrical and electronic devices or functions Common circuit diagram symbols (US ANSI symbols) An electronic symbol is a pictogram used to represent various electrical and electroni

en.wikipedia.org


1) 산술논리연산장치(ALU)

역할
레지스터에서 온 두 입력(A, B)에 대해 산술/논리 연산을 수행하는 조합논리 회로. 결과는 버스/레지스터로 나가고, 부수적으로 상태 플래그(C,Z,N,V)를 산출.

구성 느낌

  • 입력 선택: MUX_A, MUX_B가 각각 ‘어느 레지스터를 A/B로 보낼지’를 선택
  • 핵심 연산부: 가산기(전가산기들의 병렬 연결) + 논리 게이트 묶음
  • 연산선택: F[ ](예: 4비트)가 어떤 연산을 할지 고름

대표 연산(예)

  • 산술: ADD(A+B), SUB(A−B), INC(A+1), DEC(A−1), NEG(2의 보수), PASSA(A), PASSB(B)
  • 논리: AND, OR, XOR, NOT(A), NAND, NOR, XNOR
  • (필요시) 비교: CMP(A−B) → 결과는 버리지 않고 플래그만 갱신

F[3:0] (또는 s2 s1 s0 sX, 4비트 제어 코드, opcode/selector)에 매핑

원칙: 논리 연산은 Cin 무시, 산술/회전 일부만 Cin 사용.

g=0 -산술/논리
s2 s1 s0 | cin | Mnemonic | F(출력식)                  | 오퍼랜드·Carry-in 해석
---------+-----+----------+----------------------------+------------------------------------------
0  0  0  |  x  | PASSA    | F = A                      | A=사용, B=무시, cin=무시
0  0  1  |  x  | PASSB    | F = B                      | A=무시, B=사용, cin=무시

0  1  0  |  0  | ADD      | F = A + B                  | A=사용, B=사용, cin=0(강제)
0  1  0  |  1  | ADC      | F = A + B + 1              | A=사용, B=사용, cin=1(외부 입력)

0  1  1  |  1  | SUB      | F = A + (~B) + 1  (=A−B)   | A=사용, B=사용(~B), cin=1 → borrow 없음
0  1  1  |  0  | SBC      | F = A + (~B) + 0  (=A−B−1) | A=사용, B=사용(~B), cin=0 → borrow 1

1  0  0  |  x  | AND      | F = A AND B                | A=사용, B=사용, cin=무시
1  0  1  |  x  | OR       | F = A OR  B                | A=사용, B=사용, cin=무시
1  1  0  |  x  | XOR      | F = A XOR B                | A=사용, B=사용, cin=무시
1  1  1  |  x  | NOT      | F = ~A                     | A=사용(반전), B=무시, cin=무시

g=1 쉬프트/회전/증감
s2 s1 s0 | cin | Mnemonic | F(출력식)                               | 오퍼랜드·Carry-in 해석
---------+-----+----------+-----------------------------------------+-----------------------------------------------
0  0  0  |  x  | INC      | F = A + 1                               | A=사용, B=0(강제), cin=1(내부 강제)  ※가산기 재사용
0  0  1  |  x  | DEC      | F = A − 1  (=A + ~1 + 1)                | A=사용, B=1(강제, 내부 ~1), cin=1(내부 강제)
0  1  0  |  x  | SHL      | F = A << 1                              | A=사용, B=무시, cin=무시, C=MSB 유출 비트
0  1  1  |  x  | SHR      | F = A >> 1   (LSR/ASR 중 설계로 결정)   | A=사용, B=무시, cin=무시, C=LSB 유출 비트
1  0  0  |  0  | ROL0     | F = (A << 1) | 0                        | A=사용, B=무시, cin=0(강제), C=MSB 유출 비트
1  0  0  |  1  | ROL      | F = (A << 1) | 1                        | A=사용, B=무시, cin=1(외부 입력), C=MSB 유출
1  0  1  |  0  | ROR0     | F = (A >> 1) | (0 << (n−1))             | A=사용, B=무시, cin=0(강제), C=LSB 유출
1  0  1  |  1  | ROR      | F = (A >> 1) | (1 << (n−1))             | A=사용, B=무시, cin=1(외부 입력), C=LSB 유출
1  1  0  |  x  | PASSA    | F = A                                   | A=사용, B=무시, cin=무시   (예비/유지보수용)
1  1  1  |  x  | NOP/RES  | F = F                                   | 변경 없음(예비 코드로 예약)

실제 설계에서는 “어떤 코드가 어떤 연산인지” 표로 고정해 놓고, 제어단어의 F 필드가 그 코드를 내보냅니다.


2) 상태 레지스터(플래그 레지스터)

역할
ALU/시프터 수행 직후 결과의 성질(상태)을 기억. 분기/조건부 연산의 근거.

자주 쓰는 플래그

  • Z (Zero, 결과가 0인지): 결과가 0이면 1
  • N (Sign, 부호가 뭔지): 결과의 최상위 비트(MSB, 부호비트)가 1이면 1
  • C (Carry, 올림작업이 있었는지): 무부호 덧셈의 자리올림 / 뺄셈의 자리빌림 발생 시 1
  • V (Overflow, 오버플로우가 있었는지): 부호 있는 덧셈/뺄셈에서 수 범위 초과(산술 오버플로) 시 1

주의점(시프터 포함 시)

  • ADD 후 바로 SHL(왼쪽 시프트)을 하면 최종 결과는 시프터 출력. 플래그를 ALU 결과 기준으로 잡을지, 시프터 결과 기준으로 잡을지 아키텍처 정책으로 정해야 해요. 보통 “마지막에 데이터 경로에 있는 블록” 기준(= 시프터 결과)으로 플래그를 갱신합니다.

3) 시프터(Shifter)

역할
ALU 결과(또는 A/B 입력)를 비트 단위로 이동/회전.

대표 동작(예)

  • SHL(논리 왼쪽 시프트): LSB에 0 주입, MSB 탈락 → C에 탈락 비트 저장 가능
  • SHR(논리 오른쪽): MSB에 0 주입
  • SAR(산술 오른쪽): MSB(부호) 유지하며 우시프트
  • ROL/ROR(회전): 탈락 비트가 반대편으로 들어옴
  • RCL/RCR(캐리 포함 회전): C까지 포함해 1비트 링처럼 굴림
  • NOP: 시프트 없음(통과)

실장 팁
멀티플렉서 체인으로 1/2/4/8비트 단위 선택 시프트를 저지연으로 구성하거나, 배럴 시프터 구조를 사용.


4) 제어단어(Control Word)

정의
“이번 클럭에서 무엇을 할지”를 한 덩어리 비트로 표현한 제어변수(선택신호)의 묶음.

예시 시스템(문제에서 준 스펙)

  • 레지스터 7개: R1~R7
  • ALU 연산 12개
  • 시프터 연산 6개
  • 제어단어 필드 구성(총 16비트)
    • A[2:0] : ALU A 입력 소스 선택 (3비트 → 8개 소스 가능)
    • B[2:0] : ALU B 입력 소스 선택 (3비트)
    • D[2:0] : 목적지 레지스터 선택 (3비트)
    • F[3:0] : ALU 연산 선택 (4비트 → 16개 중 12개 사용)
    • H[2:0] : 시프터 연산 선택 (3비트 → 8개 중 6개 사용)

합계 3+3+3+4+3 = 16비트. 하드웨어에서는 이 16비트가 각 블록의 선택선으로 펴져 들어갑니다.

A/B/D/H 인코딩 예

  • A/B/D는 (000~110) → R1~R7, 111 → (상수0/1/PC 등 확장) 같은 식으로 정의해 둘 수 있어요.
  • H는 000:NOP, 001:SHL, 010:SHR, 011:SAR, 100:ROL, 101:ROR, 110~111:미정 등.

제어단어 작성 예 1
R3 ← R1 − R2 (시프트 없음)

  • A = code(R1)
  • B = code(R2)
  • D = code(R3)
  • F = SUB
  • H = NOP
    → CW = A | B | D | F | H (비트 자리에 맞춰 결합)

제어단어 작성 예 2
R0 ← SHL( R1 + R2 )

  • A = R1, B = R2, D = R0, F = ADD, H = SHL
  • (정책) 플래그는 시프터 결과 기준으로 SETF=1 시 래치

실제 마이크로코드/제어기억장치에서는 위 제어단어들이 순서대로 저장되어 있고, 제어장치(하드와이어드 FSM 또는 마이크로시퀀서)가 이를 읽어 각 사이클에 배포합니다.


5) 마이크로연산 실행 흐름

예: R0 ← SHL( R1 + R2 )

  1. 소스 선택: A←R1, B←R2 (A/B MUX 선택)
  2. ALU 연산: F=ADD → Sum 산출, 임시 C/V 계산
  3. 시프터: H=SHL → 최종 결과 ShOut
  4. 플래그 래치: SETF=1 → Z/N/C/V 갱신(시프터 기준)
  5. 적재: D=R0, LD_R0=1 → R0에 기록

6) ALU/시프터가 수행하는 연산

ALU 산술(예)

  • ADD, ADC(캐리포함), SUB, SBB(보로우 포함), INC, DEC, NEG, CMP(플래그만)
    ALU 논리(예)
  • AND, OR, XOR, NOT, (옵션) NAND/NOR/XNOR, CLEAR(0), SET(−1)
    시프터(예)
  • SHL/SHR/SAR/ROL/ROR, (옵션) RCL/RCR, NOP

플래그 발생 규칙(대표)

  • Z: 결과 == 0
  • N: 결과 MSB
  • C: ADD 시 최상위 자리올림, SUB 시 A<B(무부호 기준)일 때 1, 시프트 시 탈락 비트
  • V: 부호있는 연산에서 오버플로(예: A=+127, B=+1, 8비트 ADD → −128)