본문 바로가기

[Chapter 2] 산술 논리 장지 (Arithmetic Logic Unit, ALU)

(밑바닥부터 만드는 컴퓨팅 시스템 2판,  인사이트(insight), 2023)을 학습하고 개인 학습용으로 정리한 내용입니다.

 

 

 

 

 

여기서 정의하는 산술 논리 장치는, 지금까지 설명한 일반적인 논리 게이트나 가산기들과 달리, Nand to Tetris 프로젝트에서 만들 핵(Hack)이라는 컴퓨터에 맞춤으로 설계된 것이다. 그래도 핵 ALU에 깔린 설계 원리는 일반적이어서 다른 설계에도 도움이 될 것이다.

 

핵 ALU에는 다음과 같은 특징을 가진다. (비용과 효율성을 고려한 설계)

  • 정수 산술 연산만 지원 (부동 소수점 산술은 미지원)
  • 18개의 산술-논리 함수만 계산하도록 설계

 

 

계산 가능한 18개의 산술-논리 함수

 

out(x, y, zx, nx, zy, ny, f, no) =

      0, 1, -1,

      x, y, !x, !y, -x, -y,

      x+1, y+1, x-1, y-1,

      x+y, x-y, y-x,

      x&y, x|y

 

 

 

 

 

    * 기호 !, &, |는 각각 16-bit 버전 Not, And, Or를 의미한다.

    * 지금은 zr과 ng 출력 비트는 무시하자

 

왼쪽에서 오른쪽으로 연산을 수행한다. zx → nx → zy → ny → f → no → out (결과출력)
x 입력이 미리 설정됨 y 입력이 미리 설정됨 + 또는 &, 계산 출력이
나중에
설정됨
ALU
출력 결과
if zx then x=0 if nx then x=!x if zy then y=0 if ny then y=!y if f then
out=x+y
else out=x&y
if no then
out=!out
out(x, y) =
zx nx zy ny f no out
1 0 1 0 1 0 0
1 1 1 1 1 1 1
1 1 1 0 1 0 -1
0 0 1 1 0 0 x
1 1 0 0 0 0 y
0 0 1 1 0 1 !x
1 1 0 0 0 1 !y
0 0 1 1 1 1 -x
1 1 0 0 1 1 -y
0 1 1 1 1 1 x+1
1 1 0 1 1 1 y+1
0 0 1 1 1 0 x-1
1 1 0 0 1 0 y-1
0 0 0 0 1 0 x+y
0 1 0 0 1 1 x-y
0 0 0 1 1 1 y-x
0 0 0 0 0 0 x&y
0 1 0 1 0 1 x|y
입력 : x[16], y[16] // 두 개의 16비트 데이터 입력
  zx, // 입력 x 0으로
  nx, // 입력 x를 반전
  zy, // 입력 y를 0으로
  ny, // 입력 y를 반전
  f, // f==1 이면 out=add(x,y), 아니면 out=and(x,y)
  no, // 출력 out을 반전
출력 : out[16], // 16-bit 출력
  zr, // out==0이면 zr=1, 아니면 zr=0
  ng // out<0이면 ng=1, 아니면 ng=0
기능 : if zx x=0 // 16-bit 상수 0
  if nx x=!x // 비트 반전
  if zy=y0 // 16-bit 상수 0
  if ny y=!y // 비트 반전
  if f out=x+y // 2의 보수법으로 정수 덧셈
  else out=x&y // 비트 And
  if no out=!out // 비트 반전
  if out=0 zr=1 else zr=0 // 16-bit 동일 값 비교
  if out<0 ng=1 else ng=0 // 2의 보수법 비교
설명 : 오버플로 비트는 무시한다  

 

명세에 따라 어떻게 동작하는 확인해보자.

다음은 x=27일 때, x-1 함수에 대한 동작 예시이다.

  1. 27의 16-bit 2진 코드를 x에 입력한다.
  2. y 값은 계산에 영향을 미치지 않으므로 신경쓰지 않는다.
  3. x-1 함수에 해당하는 ALU 제어 비트는 001110이고, 이 값을 제어 비트에 설정한다.
    (zx=0, nx=0, zy=1, ny=1, f=1, no=0)
  4. zx, nx 비트는 0이므로, x 입력은 0이 되지도, 반전되지도 않고 그대로 남는다.
  5. zy, ny 비트는 1이므로, y 입력을 0으로 만들고 결과를 반전하여, 16-bit 값 1111111111111111이 된다.
  6. 1111111111111111은 2의 보수법에서 -1을 뜻하는 2진 코드이므로, ALU의 두 데이터 입력은 \( x-1 \)이 된다.
  7. f 비트가 1이므로, 덧셈 연산이 선택되고, ALU는 \( x + (-1) \)을 계산한다.
  8. 마지막으로 no 비트가 0이므로 출력은 반전되지 않는다.

결론적으로 ALU에 x,y 값을 입력하고 6개의 제어 비트를 001110으로 설정하면, ALU는 정의대로 \( x-1 \)을 계산하게 된다.

핵 ALU는 두 개의 입력에 대해 정해진 함수를 계산하는 일 외에도, 두 개의 출력 비트 zr과 ng도 계산한다. 이 비트들은 각각 ALU 출력이 0인지 음수인지 여부를 나타내며, 앞으로 만들 CPU에서 사용될 것이다.

 

핵 ALU 설계과정은 다음과 같았다.

  1. 컴퓨터가 수행할 기본 연산들의 목록을 잠정적으로 결정 (위 표에서 out에 해당하는 열)
  2. 원하는 연산을 수행하려면 x, y, out이 2진수로 어떻게 조작되어야 하는지 역으로 추론
  3. ALU 논리를 가능한 한 단순하게 만들자는 목표에 맞춰서 추론을 해 보니, 6개의 제어 비트를 각각 기본 논리 게이트로 쉽게 구현할 수 있는 연산들에 직접 연결시키는 방법이 좋겠다는 결론에 도달