cyphen156

2장 논리 연산 본문

프로젝트/Nand2Tetris

2장 논리 연산

cyphen156 2023. 7. 7. 15:16

1장에서 논리 게이트를 만들었으니 

2장에서는 만들어진 논리게이트들을 조합해 산술논리연산장치(Arithmetic Logical Unit)를 만들 것이다.

ALU는 CPU에서 연산을 담당하는 핵심 부품이다.

먼저 컴퓨터는 항상 모든 연산을 2진수의 덧셈을 통해 처리한다.때문에 우리는 맨 처음 덧셈 연산을 수행해주는 가산기(Adder)를 만들어야 한다.

2진수의 덧셈 연산

예를 들어 10진법 수 2개 15, 6을 덧셈연산한다고 생각해보자

10진수 체계에서의 두 자리 수 덧셈은

한 자리 수 5+6은 1의 올림수가 발생하고, 결과가 1이고, 

두 자리 수 1+0은 한 자리 수 덧셈연산에서 발생한 올림 수 1을 추가로 더해 2라는 결과를 출력하고, 

최종적으로 21이라는 결과를 출력한다.

코드로 표시하면 이렇게 된다.

그럼 이걸 이진수로 표현하면 어떻게 될까?

우선 두 자리 수 정수이니 8비트 이진 표현법으로 변환해야 한다.

그 후 각 비트의 자릿수들에 대한 덧셈 연산을 수행한다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

void print_bit(int bit) {
    printf("%d", bit);
}

void print_bits(int bit1, int bit2, int carry, int step) {
    printf("Step %d, bits: ", step);
    for (int i = 0; i < 8; i++) {
        if (i == 8 - step) {
            print_bit(bit1);
        }
        else {
            printf("0");
        }
    }
    printf(" + ");
    for (int i = 0; i < 8; i++) {
        if (i == 8 - step) {
            print_bit(bit2);
        }
        else {
            printf("0");
        }
    }
    if (carry) {
        printf(" + ");
        for (int i = 0; i < 8; i++) {
            if (i == 7 - step) {
                printf("1");
            }
            else {
                printf("0");
            }
        }
    }
    printf("\n");
}

void print_result(int bit, int carry, int step) {
    printf("Step %d, result: ", step);
    for (int i = 0; i < 8; i++) {
        if (i == 8 - step) {
            print_bit(bit);
        }
        else {
            printf("0");
        }
    }
    if (carry) {
        printf(" / ");
        for (int i = 0; i < 8; i++) {
            if (i == 7 - step) {
                printf("1");
            }
            else {
                printf("0");
            }
        }
    }
    printf("\n");
}

int main() {
    // a = 15, b = 6, result = 연산 결과, carry = 올림 수
    int a = 15, b = 6, carry = 0;
    int a2[8] = { 0 }, b2[8] = { 0 }, result[8] = { 0 };

    // 2진수로 변환
    for (int i = 7; i >= 0; i--) {
        a2[i] = a % 2;
        a /= 2;
        b2[i] = b % 2;
        b /= 2;
    }

    printf("a2: ");
    for (int i = 0; i < 8; i++) {
        print_bit(a2[i]);
    }
    printf("\nb2: ");
    for (int i = 0; i < 8; i++) {
        print_bit(b2[i]);
    }
    printf("\n");

    // 덧셈 연산하기
    for (int i = 7; i >= 0; i--) {
        print_bits(a2[i], b2[i], carry, 8 - i);
        int temp = a2[i] + b2[i] + carry;
        result[i] = temp % 2;
        carry = temp / 2;
        print_result(result[i], carry, 8 - i);
    }

    printf("\nFinal result: ");
    for (int i = 0; i < 8; i++) {
        print_bit(result[i]);
    }

    return 0;
}

0

생각보다 그리 간단하지 않다. 

이제 덧셈 연산을 해봤으니 뺄셈은 어떻게 하는지 알아보자 

생각보다 뺄셈연산은 간단하다

뺄셈 연산을 하는 수(b)를 2의 보수 형태로 2진 비트들을 모두 뒤집은 뒤(0은 1로, 1은 0으로)+1연산을 수행한 뒤 덧셈연산을 하면 된다.

 

가산기에는 반가산기와 전가산기가 있는데

전가산기는 2개의 반가산기로 구성되어있다. 

 

자세한 내용은 이산수학과 디지털 논리 회로에서 다루겠습니다.

'수학/이산수학' 카테고리의 글 목록 (tistory.com)

 

'수학/이산수학' 카테고리의 글 목록

Cyphen의 개인 공부 블로그입니다. 프사는 아는 동생이 그려준 그림 주인장과 싱크로율 0%

cyphen156.tistory.com

'수학/디지털 논리 회로' 카테고리의 글 목록 (tistory.com)

 

'수학/디지털 논리 회로' 카테고리의 글 목록

Cyphen의 개인 공부 블로그입니다. 프사는 아는 동생이 그려준 그림 주인장과 싱크로율 0%

cyphen156.tistory.com

 

//모든 자료들은 Nand2Tetris홈페이지에서 찾을 수 있습니다.

또는 cyphen156/Work-space: Studying (github.com)에서 찾으실 수 있습니다.

 

 

 

 

 

'프로젝트 > Nand2Tetris' 카테고리의 다른 글

3장 메모리 : 모든것은 결국 기억장치 관리다  (0) 2023.07.10
2장 프로젝트 : 가산기  (0) 2023.07.07
1장 프로젝트  (0) 2023.07.07
1장 논리 : Boolean  (0) 2023.07.06
컴퓨팅 시스템 구현하기 : Bottom Up  (0) 2023.06.27