들어가며CourseGoal실습 환경 구성하기요구사항NAND 게이트레지스터1 bit 메모리8 bit 메모리8 bit 레지스터버스를 이용한 데이터 전송 및 충돌 해결다중 입력 게이트, 다중 출력 게이트(디코더)다중 입력 게이트 디코더RAM1 byte RAM 256 byte RAM바이트 덧셈 장치더하기 연산기(가산기, Adder)를 만들어보자 8 bit Adder비트 시프트 장치오른쪽으로 시프트 하는 SHR왼쪽으로 시프트하는 SHLShifter로 무엇을 할 수 있을까?바이트 인버터바이트 AND 장치바이트 OR 장치XOR 장치,비교기8 bit XOR 비교기데이터 크기 검사(ZEROer)산술 논리 장치 (ALU)enabler 수정ALU 구현클럭 (Clock)출력제어 클럭 (clk_e)와 입력제어 클럭(clk_s)을 구현해 보자. 마이크로 코드 실행 순서 단계 지시 장치스테퍼 (Stepper)자동으로 reset 해서 반복하게 할 수는 없을까?CPU 전원 문제 래치와 플리플롭의 차이SR LatchD Latch D 플립플롭덧셈(가장 간단한 제어장치)단일 명령어 CPU명령어 가져오기 (fetch) 단계 추가전초작업fetch를 위한 control unit 구현step 마다 실행돼야 할 동작별로 연결한다step 1 step2step3step4~6명령어 주소 레지스터 추가ALU 명령어 처리를 위한 스태퍼ALU 레지스터 선택 모듈제어장치의 배선 신박한 정리LOAD, STORE 명령어 추가하기데이터 명령어 추가레지스터와 램 모듈 수정변수를 이용한 뺄셈 코딩반복 명령어조건 분기 명령어 | 튜링 완전 컴퓨터 완성하기곱셈 프로그램 구현후기Reference

티스토리 뷰

컴퓨팅 시스템

CPU from scratch

jiggyjiggy 2024. 4. 22. 14:55

들어가며

컴퓨터 구조 교과서로 불리는 유명한 책

대학교재로 널리 쓰이는 컴퓨터 구조 전공서적이다. 아카데믹한 개념을 이해하는데 매우 좋은 책이다.

 

하지만 VHDL 또는 Verilog을 이용해서 설계를 구현하는 방법을 채택하고 있다. 처음부터 보기에는 약간의 장벽이 있는 셈이다.

전문적으로 파고들기 이전에, "동작"하는 CPU를 직접 만들어보는 것이다.

그 이후 deep dive 해보면, 받아들여지는 정도가 다를 것이다.

Course

해당 시리즈는 유튜브의 구석기 컴공과 : 밑바닥부터 만드는 CPU (cpu from scratch)를 따라가며 작성했다.

도서 "그래서 컴퓨터는 어떻게 동작하나요?"을 강의하는 동영상이다. 책에 있는 내용에 한계를 두지 않고, 확장해서 알려준다.

 

해당 포스팅에서는, 책에서 다루는 범위에 더해 강의자가 추가한 몇 가지의 아이디어를 따라간다.


Goal

  • 8비트 프로세서를 만든다
  • 내부 동작을 파악한다
    • Logisim evolution에는 (RAM, register 등)이 이미 존재한다. 하지만 곧장 사용하는 게 아니라, 가장 밑바닥이 되는 게이트를 쌓아서 만든다.

실습 환경 구성하기

Logisim evolution(오픈소스 프로젝트) 시뮬레이션 소프트웨어를 사용한다. 

직관적인 UI이므로, 몇 개 클릭해 보면 감을 잡을 수 있다.

Logisim evolution 실행 창

요구사항

소프트웨어 설치 요구조건 요약

  1. 자바 16 이상의 버전이 필요하다.
  2. Logisim evolution의 Releases 들 중 본인의 머신 환경에 맞는 파일을 다운로드하여 설치한다.

NAND 게이트

NAND 게이트는 universal 게이트이다. 즉, NAND 게이트만 있다면, 다른 게이트를 만들 수 있다.

 

NAND 게이트의 동작을 확인해 보자.

NAND 게이트의 동작

 

다른 게이트를 만들어 보자.

AND, OR, XOR 게이트

다른 게이트들도 NAND 게이트를 조합해서 만들 수 있다.

게이트는 추상화하지 않고, 그대로 쓰도록 하겠다.


레지스터

컴퓨터는 어떻게 기억할까?

1 bit 메모리

 

1 bit를 기억해 보자.

1 bit 메모리

이를 "1 bit 메모리"라 한다. s(set) pin 이 활성화되어 있을 때만 동작한다.

 

확장시켜서 8 bit 메모리를 만들어보자.

1 bit 메모리를 이용해 만들 것이므로, 1 bit 메모리를 하나의 부품으로 추상화하겠다.

1 bit 메모리, 추상화

 

8 bit 메모리

1 bit 메모리를 이용해 8 bit 메모리를 만들어보자

8 bit 메모리

 

8 bit 레지스터

8 bit 레지스터를 만들어보자. 

8 bit 레지스터, Enabler 

enabler를 분리하여 구현했다.

 

cf) label을 안 붙였더니 추상화한 부품에서 라벨이 확인되지 않았다. 보충작업을 해주었다.

깜빡한 label 붙히기

버스를 이용한 데이터 전송 및 충돌 해결

두 개의 레지스터가 있을 때, A 레지스터에서 B 레지스터로 데이터를 복사하려면 어떻게 해야 할까?

 

각 레지스터의 output을 버스에 연결하여 input을 주면 될까?

안된다.

 

이를 충돌이 생겼음을 의미한다. 회로만 봐도 버스의 현재상태가 무엇인지 알 수 없을 것이다.

이때 controled buffer로 버스 충돌 상황을 해결할 것이다.

controlled buffer는 controll input이 켜져 있을 때만 buffer로 동작한다

 

enable 상황인 경우 NOT 게이트를 추가하고, AND 게이트를 추가한다. 둘 다 enable 이 아닌 경우에 controlled buffer가 활성화되는 것이다.

 

그러나 해결된 것은 아니다. 

레지스터 출력이 다시 입력으로 들어갈 수 있는 상황이 남아있다.

레지스터가 enable 상황에만 동작되도록 해야 한다. 따라서 출력에도 controlled buffer를 추가하고, enable에 연결한다.

 

충돌을 해결한 동작을 확인해 보자

 

Resister A 가 enable 인 동안, Resister B 가 set을 한다.

다른 입력을 끄고, Resister B의 enable을 켜보면 데이터가 기록되어 있음을 확인할 수 있다.


다중 입력 게이트, 다중 출력 게이트(디코더)

다중 입력 게이트

AND 게이트의 입력이 2개보다 클 때는 어떻게 해야 하나?

입력이 3개인 AND 게이트

원리도 알았고, Logisim evolution에서 다중 입력 게이트를 지원해 주므로, 곧바로 쓰도록 하자.

 

 디코더

다중 출력 게이트 들 중 가장 기본적인 것이 디코더다. 디코더는 입력에 따라 하나의 출력을 선택하는 역할을 한다.

 

input의 조합으로 output의 가능 개수가 결정된다.

input의 값의 경우는 2가지(on/off) 이므로 2의 input 개수개의 제곱으로 결정된다.

  • input 3개 = 2^3 = 8 출력의 경우의 수 가능
  • input 4개 = 2^4 = 16 출력의 경우의 수 가능

 

원리도 알았고, Logisim evolution에서 다중 입력 게이트를 지원해 주므로, 곧바로 쓰도록 하자.

 


RAM

Random Access Memory

주소값(2차원일 때를 가정하면 x, y 좌표)을 통해 특정하여 접근하는 개념의 메모리이다

 

1 byte RAM 

주소는 여러 개가 존재할 것이므로, 본인의 주소가 선택되었을 때만 동작하도록 controlled buffer를 추가하자

256 byte RAM

가로, 세로 각각 4x16 디코더를 두어 2차 평면의 좌표를 선택하는 아이디어다.

 

우선 주소가 들어올 수 있도록 구성하자.

하위 4 bit는 수평방향, 상위 4 bit는 수직방향 디코더에 연결하자

 

이 부분을 MAR (Memory Address Resister)이라 한다.

이제 데이터를 저장할 16 X 16의 각 셀을 구성해 보자. 

 

하나의 셀의 구현을 먼저 보자.

한 개의 셀을 구성한 모습이다.

 

이것을 16 X 16 개를 작업하면 아래와 같다.

이를 추상화 하면 

 

입력 시

  • 주소를 입력하고, set address를 켰다 끈다 -> 해당 주소의 셀을 선택함
  • bus input에 원하는 값을 넣고 bus set을 켰다 끈다

출력 시

  • 주소를 입력하고, set address를 켰다 끈다 -> 해당 주소의 셀을 선택함
  • bus enable을 켰다 끈다 -> bus output에 셀에 저장되어 있던 값이 출력된다.

 


바이트 덧셈 장치

컴퓨터의 최소 조건은 RAM + CPU이다.

CPU는 ALU(Arithmetic and Logical unit)와 CU(Control Unit)으로 구성한다.

 

ALU는 +, -, %, x, 나머지연산, 논리연산(and, or, xor)을 지원해야 한다.

더하기 연산기(가산기, Adder)를 만들어보자 

더하기 연산은 자리올림이 필요하다

 

1 bit에 대해서 먼저 해보자.

자리 올림이 이미 있는 경우도 고려해야 한다.

자리올림이 연산 내부에서도 이뤄질 수 도 있다.

8 bit Adder

추상화 시, 사다리 모양으로 나타낸다

 


비트 시프트 장치

두 가지의 비트 시프트 장치(오른쪽, 왼쪽)를 만들어 보자. 

오른쪽으로 시프트 하는 SHR

만약 회전을 시키고 싶다면, shift output을 shift input에 연결시킨다.

왼쪽으로 시프트하는 SHL

SHR과 같은 맥락이다.

마찬가지로, 회전을 하고 싶다면 shift output을 shift input에 연결시킨다.

 

 

Shifter로 무엇을 할 수 있을까?

바로, 나눗셈과 곱셈이다.

2의 거듭제곱으로 표시되는 수를 비트쉬프트하는 것이다.

 

예를 들어,

1000 0000 은 십진수로 128이다. 

0100 0000 으로 오른쪽 비트 쉬프트를 하면 십진수로 64이다.

다만, 홀수인 경우 하나가 밀려 나간다


바이트 인버터

인버터는 0은 1로, 1은 0으로 뒤집는 장치다.

NOT 게이트를 8개 쓰면 될 것 같다.

 

다만, Logisim evolution에서는 다중 입력을 지원하므로 바로 쓰도록 하자


바이트 AND 장치

장치에 대해서는 별 다른 언급을 할 게 없으므로 넘어간다.

 

아스키코드 중 알파벳의 특이한 특징이 있는데, 그건 대, 소문자 간 2번 인덱스가 다르다.

예시로,

E의 아스키코드는 69 이고, 이진수로 표현하면 01000101이다.

e의 아스키코드는 101 이고, 이진수로 표현하면 01100101이다.

 

이러한 특징을 이용하여, 대소문자의 변환을 빠르게 할 수 있다.

지우고 싶은 부분을 0으로 채운다


바이트 OR 장치

 

마찬가지로, 아스키 문자의 특징을 이용한 연산 예시이다.

2번 인덱스 비트를 1로 켜두어, 소문자로 변환할 수 있다.


XOR 장치,

비교기

1 bit xor 장치를 먼저 만들어보자

 

비교기는 무엇을 의미할까?

같은지 다른지 비교하는 것이다. 

 

a와 b 가 같다면 isSame_output이 켜진다

a와 b 중 a 가 크다면 isLarge_output이 켜진다

 

8 bit XOR 비교기

8 bit 로 묶었다

출력 부는 XOR 로 출력된다.


데이터 크기 검사(ZEROer)

ALU에 들어가는 마지막 모듈이다.

출력된 바이트가 모두 0인지 검사하는 장치를 추가한다. 이를 zero 검사기라 한다.

input 중 1이 존재하면 출력이 0이 된다.


산술 논리 장치 (ALU)

현재까지 구성한 모듈로 ALU를 완성해 보자.

8가지의 ALU 연산을 지원하도록 한다.

 

각 연산의 op코드는 3x8 디코더로 고를 수 있을 것으로 예상이 갈 것이다.

enabler 수정

기존 enabler는 전원의 끊어짐을 표현할 수 없다. 1(high), 0(low), 끊어짐 서로 다르다.

따라서 controlled buffer의 상태를 0으로 만들어 출력을 끊는다.

 

ALU 구현

모듈 배치를 기본적으로 했다. opcode에 맞게 디코더를 설정하자.

000 ADD
001 SHR

같은 방식으로 나머지도 opcode에 맞게 연결한다

 

Adder, SHR, SHL에서 자리올림이 발생할 수 있다. 

따라서 연산이 선택되고(opcode) 자리올림 출력이 존재할 경우, 자리올림 출력을 킨다.

 

zero 검사기도 연결한다

비교기의 출력도 뽑아내준다

마지막 opcode 111에 controlled buffer를 연결하여 비교연산 시 zero 검사기의 값을 error가 아닌, 1로 둔다.

추상화 하여, ALU 동작 예시

 

 

이후에는, 컴퓨터를 "자동"으로 동작할 수 있도록 해보자.


클럭 (Clock)

  • 컴퓨터의 심장이다.
  • 자동제어 장치부를 만드는데 이용한다
  • 입력/출력 명령 동기화에 사용한다

클럭 신호는 0과 1의 주기적 반복이다

클럭은 디지털 회로로 만들 수 없다. 원본 클럭이 있다는 가정하에 들어간다.

 

클럭의 모양은 다음과 같다

우리는 출력제어 클럭, 입력제어 클럭이 필요하다. 이 둘은 원본 클럭을 이용해서 만든다.

출력제어 클럭은 1의 상태가 길다. 이 구간은, 어떠한 레지스터나 장치에서 버스로 데이터가 들어가는 상황이다.

그 구간 사이에, 입력제어 클럭이 1이 되고, 버스로부터 레지스터나 장치에 데이터를 복사하는 것이다.

따라서 입력제어 클럭은 출력제어 클럭 속에서 켜진다.

 

출력제어 클럭 (clk_e)와 입력제어 클럭(clk_s)을 구현해 보자.

 

 

 

JK-플리플롭은 간단하게 말하면 메모리다.

 

이전 Q값이 0이었다면, 다음 Q값은 1이 되고

이전 Q값이 1이었다면, 다음 Q값은 0이 된다.

이를 토글 한다고 표현할 수 있다.

 

clk_raw에 비해서, Q는 2배가 된다. 예를 들어, clk_raw가 1 틱이면 Q는 2 틱이 된다.

cf) JK플리플롭을 한 단계 더 연결하면 주기가 4배가 된다.

 

JK-플리플롭의 구현체는 아래와 같다

JK-플리플롭

 

출력제어 클럭, 입력제어 클럭을 구현해 보자.

타이밍 다이어 그램을 확인해 보자

이론적으로 학습한 내용과 동일하다


마이크로 코드 실행 순서 단계 지시 장치

스테퍼 (Stepper)

  • 제어장치(Control Unit)의 한 부분이다
  • 하나의 명령어는 여러 단계로 구성된다
  • 컴퓨터를 자동화하기 위한 명령어의 작업 단계를 지시하기 위해 꼭 필요하다

스텝 7 단계

1~3 단계는 명령어 가져오기(fetch)이고,

4~6단계는 명령어 실행(execute)이다.

7단계는 아무 기능을 하지 않고, 종료 또는 리셋을 위한 스텝이다.

 

스태퍼는 입력으로 클럭신호(clk)를 받고, 출력으로는 스텝 1~7까지를 한 번에 하나씩 출력한다

또한 입력으로 리셋 신호를 받을 수도 있다.

 

스태퍼는 클럭과 메모리만 있으면 된다.

1주기마다 1 단계를 넘어가게 된다.

특히 이 부분은 짚고 넘어가는 게 좋을 것이다. 

정리하니 장황해서, 설명을 직접 보는 게 나을 듯하다.

스테퍼의 구현체 설명: 12:20~19:20

 

동작을 확인해 보자

 

자동으로 reset 해서 반복하게 할 수는 없을까?

리셋 버튼을 처음 토글한 뒤,

reset 입력을 떼어내고, reset input으로 step 7의 출력을 넣는 것이다.

하지만 이것은 수동이다.

 

실제로는, 프리셋이나 파워온 리셋 기능(전원 들어올 때, 원하는 메모리값으로 채워 넣는 것)이 쓰인다.


CPU 전원 문제 

이전 장에서, 스테퍼에 쓰인 메모리의 초기값을 알 수 없기에 문제가 있었다.

 

D 플리플롭을 이용해서 해결해 보자

D 플리플롭의 초기값이 0으로 세팅되는 걸 볼 수 있다

 

스태퍼의 메모리를 D 플리플롭으로 바꿔보자

또한, D 플리플롭에 리셋 기능을 이용하자


래치와 플리플롭의 차이

SR Latch -> D Latch -> D 플리플롭 순으로 알아보자

 

각 유닛마다 설명이 많다. 경우의 수를 다루기 때문이다. 

영상을 참고하자.

 

SR Latch

SR Latch

 

D Latch

SR Latch를 하나의 input으로 변환해 보자

SR Latch single input

이건 controlled buffer와 다를 바 없다. 메모리의 기능이 없다.

enable 기능을 추가한 SR Latch

 

single input SR Latch와 enable 기능을 추가한 SR Latch를 합한 모습이 D Latch이다

D Latch

 

D 플립플롭

 

플립플롭이 위와 같은 관계의 주기를 만족해야 한다

 

NOT 게이트를 통해 순간의 지연을 구현하여, enable의 순간 피크 주기를 구현할 수 있다.

하지만 Logisim evolution에서는 실시간 전파 지연 기능을 지원하지 않아서 순간 피크 주기가 구현되진 않는다.

따라서 플립플롭은 기본 제공되는 것을 써야 한다.

 

그럼에도 D 플립플롭을 만들어보자면 다음과 같다

하지만, 동작하지 않는다.


덧셈(가장 간단한 제어장치)

단일 명령어 처리가 가능한 프로세서를 구현해 보자.

 

전체적인 설계는 다음과 같다.

A와 B에 값을 넣고, 연산 결과를 R0에 넣는 것이다.

 

덧셈 연산을 가정한 시나리오를 살펴보자

 

 

 

이를 logisim evolution에 구현하자

레지스터를 연결 전

레지스터 연결 전이고, 이를 Control Unit (CU; 제어장치)라 한다.


단일 명령어 CPU

지금까지 구성한 모듈을 이용해 덧셈명령어를 수행하는 회로를 구성했다.

R0, R1에 들어있는 값을 직접 넣어주면 테스트할 수 있다.

ALU와 Control Unit을 배치해 CPU를 만든 것이다.

다만 덧셈만 지원하는(opcode 000 고정 상태) CPU 인 것이다.


명령어 가져오기 (fetch) 단계 추가

덧셈뿐 아닌, 여러 명령어를 다뤄야 한다.

 

명령어 가져오기는 3단계로 구성된다. (스태퍼 1~3단계)

  • 램의 특정한 위치를 가리켜, 데이터나 명령어를 가져올 수 있게 하는 레지스터(명령어 주소 레지스터, IAR)
  • 가져온 데이터나 명령어를 저장(명령어 레지스터, IR)해서 명령어 처리를 해야 한다.
  • 그리고 프로그램의 위치를 1단계 올린다(== 다음 실행될 명령어를 위해 IAR 값을 +1 증가시킨다)

그런 다음 IR 코드를 해독하여 명령어를 실행한다. (스태퍼 4~6단계)

 

전초작업

범용 레지스터 4개를 구성하자

레지스터를 Control Unit에 연결하기 위해, Control Unit을 수정하자

내부 연결은 추후 진행

CPU에 배치한 모습이다

 

cf) 강의에서는 레지스터 자체에 라벨링 및 약간 수정하여 진행한다.

fetch를 위한 control unit 구현

출력 부분

  • RAM 출력
  • IAR 출력
  • BUS 출력 : ALU의 입력 b에 넣어주는 신호, 클럭이 필요 없다

 

입력 부분

  • IR 저장
  • MAR : 램의 특정 위치를 저장하는 부분
  • IAR : 명령어 주소의 값. 즉, 프로그램의 다음줄을 선택하기 위해 업데이트가 필요하다

 

step 마다 실행돼야 할 동작별로 연결한다

step 1 

IAR(다음 실행할 명령어가 들어있는 주소가 담겨있다) 읽어와서, RAM의 MAR에 써준다

한 사이클 후에 다음 실행해야 할 명령어 주소는, IAR의 값 + 1이다

그래서 ALU의 b 입력에 1을 넣어준다

즉, bus1의 값이 켜지면, ALU의 b값이 채워지는 것이다. 만약 켜지지 않는다면, TMP 레지스터의 값을 출력해 버린다. 이때 TMP의 값이 0이라면, 계속 그 주소 그대로 있게 된다.

 

IAR + 1을 하여 ACC(누산기)에 저장해 둔다. 누산기 set 도 연결해 주자.

step2

RAM의 특정위치에 실행해야 할 명령어가 있을 것이다. 그것을 IR(명령어 레지스터)에 전달해 준다

명령어가 들어왔다.

이 명령어로 step 4~6에서 실행하는 것이다.

step3

step3에서는 다음 명령어를 미리 가져올 수 있다.

다음 명령어의 주소는 IAR + 1 이 되어서 ACC에 저장되어 있다

step4~6

현재 가져온 명령어는 IR에 저장되어 있으므로, 가져와서 실행한다.

 

 

추가) RAM_S

RAM_S 추가

 


명령어 주소 레지스터 추가

수정한 Control Unit의 모습이다.

RAM을 추가해야 하는데, 나의 컴퓨터에서는 너무 느려서 나중에 추가하도록 하겠다.

우선 강의자의 화면으로 따라간다.

 

 

 

명령어 주소 레지스터를 추가하자

 

 

TMP의 출력을 그대로 출력할 수 있지만,

명령어 가져오기의 step 1에서, TMP의 값이 0으로 채워져 있을 때가 있는데, 그때는 1로 채워줘야하기에 그떄는 무시해야 한다

 

controlled buffer와 enable을 이용하여 원하는 값을 선택하는 것이다.

 

RAM에서 뽑아낸 명령어 코드를 제어장치에 넣어줘야 한다. 즉, IR 레지스터가 필요하다

해당 레지스터는 Control Unit의 스태퍼에 직접 연결되어야 하므로 레지스터에 수정이 필요하다

IR 레지스터

enabler도 필요가 없으므로 제거했다.

배치하면 다음과 같다

Control Unit에 IR input을 받을 수 있게 수정하자

 

전체적인 모습은 다음과 같다.


ALU 명령어 처리를 위한 스태퍼

 


ALU 레지스터 선택 모듈

 

배치를 완료했다.

복잡해 보인다. 

ACC_E 도 중복되게 있고, 모듈로 분리할만한 것들이 한 곳에 모여있어서 그렇다. 

이는 다음 장에서 수정하도록 하자.

 

또한 다른 문제점을 생각해 볼 수 있다.

다른 명령어의 필요성


제어장치의 배선 신박한 정리

복잡했던 제어장치를 모듈화 해보자.

 

많은 부분을 리팩터링 하는 것이므로, 영상을 참고하자. 많은 설명이 있다.

 

최종적인 결과물은 다음과 같다


LOAD, STORE 명령어 추가하기

영상을 보면서 추가해 보자.

Logisim evolution에 추가하자. 


데이터 명령어 추가

프로그램이 가능하기 위한 마지막 조건인, "데이터 명령어"를 추가하자

 

영상을 보면서 추가해 보자.

 

 

제어 장치에 추가하자

DATA_E 터널 추가

 


레지스터와 램 모듈 수정

초기화 문제가 해결되어야 한다. (1 bit 메모리의 경우 D 플리플롭으로 해결했다.)

특히나 시작 시 IAR의 값이 정해져 있지 않으므로, 올바른 명령어를 갖고 오지 않는다.

 

이제는 8 bit 메모리 상황이다. 기본 제공하는 Register 메모리를 쓰면 되는데, D 플리플롭 8개를 있어둔 것이다.

초기화 기능까지 설정된 레지스터

 

 

다른 레지스터들도 마찬가지이다. 초기화 문제를 해결하기 위해 Register로 대체한다

초기화문제를 해결한 모습

 

 

기본 제공하는 RAM을 쓰도록 하자.

외부에서 식별 가능하도록, 디스플레이 장착


변수를 이용한 뺄셈 코딩

: (콜론)이 붙은 16진수는 주솟값을 의미한다.

[]로 주소값을 감싼 것은 그 내부의 값을 의미한다

 

 

 

모든 과정을 나열하면 다음과 같다

 

Logisim evolution에서 실습해 보자. (RAM을 쓰면 렉이 너무 심해서 영상으로 따라간다. 10:55~)


반복 명령어

분기 명령어가 아닌경우
분기 명령어인 경우

 

두 가지 분기 명령어를 만들어보자

  • 레지스터 분기 명령어
    • RB에 들어있는 주소로 분기한다
  • 직접 분기 명령어
    • 사용자가 적어둔 분기주소로 분기한다

구현해 보자

레지스터 분기 명령어

 

직접 분기 명령어

그리고 외부 출력에 연결해 주자

 

동작을 확인하자. (6:05~)

6:05~

 

근데 종료조건이 없기에, 기존 프로그램에 덧씌워지게 된다. 프로그램이 다른 내용으로 수정된 것이기에, CPU를 다시 동작시켜도 다른 동작을 하게 된다.

 

결괏값을 저장할 e0 ~ ff까지 이후에는 프로그램이 종료될 수 있도록 조건을 달아줘야 한다.


조건 분기 명령어 | 튜링 완전 컴퓨터 완성하기

영상을 참고하면서 따라가자.

 

조건에 따라 분기한다? 이것은 ALU의 연산 결과에 따라 분기하는 것을 의미한다.

ALU의 4가지 output(carry output, a > b, a = b, zero)의 조합으로 15가지 조건을 만들고, RAM의 특정 주소로 분기한다.

15가지 경우

 

또한 자리올림을 추가하는 1 bit 레지스터 (Ctmp)를 달아두었다. 자리올림 출력이 있는 경우 저장하고 있는다.

 

구현해 보자.

 

 

 

opcode 111를 NOP로 두었다. 

따로 모듈을 만드는게 아닌, NOP operation이 들어왔을 경우 안가져오도록 조치한다

 

외부로 연결하자

 

영상 중 9:47~ 부터 예제 프로그램을 실습한다.

9부터 0까지 거꾸로 숫자세는 실습이다

0이 되었을떄, aa번지로 점프뛴다.

그리고 0x70(NOP; 111)을 넣어 프로그램을 종료시킨다.

 

지금까지의 구현으로 튜링완전 컴퓨터를 완성시켰다.


곱셈 프로그램 구현

조건 분기를 이용해 곱셈 프로그램을 구현한다.

 

실제 실습은 동영상을 참고하자

 


후기

 

 


Reference

'컴퓨팅 시스템' 카테고리의 다른 글

OS from scratch  (0) 2024.04.30
How To Make A CPU  (1) 2024.04.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함