본문 바로가기

하드웨어/Ben eater

8비트 컴퓨터 만들기 Ben Eater Part.8(CPU control logic)

이제 거의 마지막 단계다.

지금까지 만든 모든 회로를 종합하는 일.

 

https://www.youtube.com/watch?v=AwUirxi9eBg&list=PLowKtXNTBypGqImE405J2565dvjafglHU&index=35


    CPU control logic

    이전 단계에서 만든 걸로, 손을 이용한다면 튜링 가능한 머신이 탄생한다.

    하지만 우리가 원하는 것은 손을 이용하지 않고 자동으로 흘러가는 기계!

    각 회로의 control flag들을 기계가 자동으로 조절할 수 있도록 하자.


    1. 각 회로의 flag 모으기

    회로의 flag들을 한 곳으로 모았다

     

    기존에는 각각의 flag를 그 위치에서 손으로 조작하도록 했다.

    아래로 신호를 모두 이어서, 한 눈에 보기 편하게 하자.

    왼쪽부터 HLT(clock 멈춤), MI(RAM Memory Address Register In), RI(RAM In), RO(RAM Out), IO(Instruction Register Out), II(Instruction Register In), AI(A Register In), AO(A Register Out), Sigma Out(ALU Out), SU(subtract), BI(B Register In), OI(Output Register In), CE(Counter Enable), CO(Counter Out), J(Jump)이다.

    B Register Out은 일단은 쓸 필요가 없어 따로 빼두지 않았다.

     


     

    2. 명령어 정의하기

     

    다음 차례는 명령어 정의하기이다.

    LDA, ADD, OUT 등 머신을 조작하기 위한 명령어들을 정의한다.

     

    LDA는 A 레지스터에 특정 주소의 RAM 값을 load하는 명령이다.

    예를 들어 LDA 14라는 의미는 RAM의 14번째 주소의 값을 A Register로 옮기는 것.

    LDA는 0000으로 표시, 이후 14는 1110으로 표시한다. 

     

    ADD는 A 레지스터에 특정 주소의 RAM 값을 더하는 명령이다.

    OUT은 A 레지스터의 값을 출력하는 명령이다.

     

    이런 명령어는 RAM의 주소 0부터 차례대로 들어간다.

     

     

    LDA, ADD, OUT은 다음의 flag 구성으로 구현될 수 있다.

    세 번째까지의 줄이 일정한데, 이는 명령어를 로딩하는 부분이다.

    CO, MI => PC의 값을 RAM 주소로 설정

    RO, II => RAM의 내용을 명령어 레지스터로 이동

    CE => PC++

    RO,II 부분과 CE 부분은 서로 간섭하지 않기 때문에 한 번에 실행되어도 무방하다.


     

    3. 명령어 실행 회로 만들기

     

    그러면 이제 문제는 어떻게 명령어의 step을 실행할 것인가이다.

    지금이 몇 step인지 알려줄 방법이 필요하다.

    이 문제는 Binary Counter로 해결할 수 있다.

    특정 범위를 계속 반복해가며, step을 설정할 수 있다.

    그렇게 한다면 각 명령어의 step이 최대값으로 동일하게 설정이 되서 시간 손실이 발생할 수 있지만, 그렇게 큰 차이는 없으니 넘어가기로 하자. 

     

    명령어 실행 회로

     

    그리하여 이 회로는 Binary Counter와 EEPROM 2개, 3-8 Decoder로 만들 수 있다.

    3-8 Decoder는 단순히 Binary한 내용을 길게 풀어내 LED로 보기 편하게 만들기 위한 것이므로, 사실상 EEPROM 2개와 Counter가 전부다.

     

    EEPROM 안의 내용

     

    EEPROM의 사용은 OUTPUT 때와 유사하다. Instruction과 Step을 주소로 하는 EEPROM의 값을 flag on/off 값으로 둔다.

    OUTPUT과는 달리 15개나 되는 flag가 있으니, EEPROM이 두개 필요하다. 이 두 개의 EEPROM의 값을 각각 다르게 두어도 되지만, 편의상 동일하게 둔 후, 가장 앞 주소를 바꿔서 첫 번째 EEPROM인지 두 번째 EEPROM인지 차별을 둘 수 있다.

     

    EEPROM 프로그래밍 git code는 다음과 같다.

    http://bit.ly/2sK7Qlb

     

     


     

    ETC. reset flag 하나로 합치기

    아직 합치지 않은 flag가 있다 reset flag이다. 

    사실 이건 아날로그로 해도 되는 작업이지만, 그래도 편의상 버튼 한 번에 reset이 되면 좋으니 회로를 추가한다.

     

    reset 회로

     

    풀다운 저항으로 모든 부분의 reset을 하는 회로이다. 다양한 게이트를 사용하는 것이 싫어서 게이트 하나로 줄인 것이 아래 회로다.

     

    STEP RESET의 경우 버튼이 눌려졌을 때 뿐만 아니라, 최종 Step까지 갔을 때도 초기화 되어야 하므로, AND 게이트를 이용했다. (Binary Counter의 경우 총 8까지의 Step이 있다. 하지만, 8은 너무 길기 때문에 5~6 정도 step에서 STEP RESET을 한다)

     


     

    마무리

    reset 회로와 CPU logic 회로를 추가한 최종 모습이다.

    이제 조건문을 해결할 수 있는 요소만 추가하면 완성이다.