Ben eater 트러블슈팅
기존의 포스팅까지는 Ben eater 유튜브를 보며 어떻게 흐름이 진행되는지를 파악해왔다. 그러한 방식을 토대로 Ben eater에서 판매하는 키트를 구매해서 직접 만들어봤다.
각 부품을 만드는 과정에서는 보지 못했던 오류들이 다 만들고 최종 테스트에서 여럿 발생하니, 날잡고 트러블슈팅을 제대로 해본다.
그냥 전선 잘못만 있을 줄 알았는데, 의외로 얻어가고 고민해야 했던 내용들이 많아서 저장한다.
+ 부품들을 합치는 과정에서 실수로 +랑 -가 연결된 적이 있다. 쇼트가 한번 일어나서,, chip들의 상태도 정상적이라고 단언하지 못했기에 더 무섭고 떨리는 트러블슈팅이었다.
1. Clock이 켜질 때 뿐만 아니라, 꺼질 때도 1 tick이 지남
Clock의 문제는 가장 근본적은 문제로 이어지고, 이 문제를 계기로 Ben eater의 설계에 대한 불신이 생긴 중요한 문제였으므로 첫 단계에 넣었다. 문제는 clock이랑 연결된 전구가 켜질 때에만 1 tick 흘러야 하는데, 꺼질 때에도 가끔 1 tick이 흐른다는 문제였다. 분명 rising 시에만 1 tick이 흐를텐데, 그러면 전구가 꺼질 때도 rising 한다는 의미인가??
Ben eater의 설계를 따라오면 무조건 발생하는 문제이고, reddit의 tip 모음에도 나와있는 사항이다.
문제는 RAM 모듈에서 기인한다. 저 당시, clock이 rising 할 때만 RAM에 값을 입력하고 싶다며 캐패시터와 저항을 clock에 직접적으로 연결했다. 하지만 캐패시터가 ram 모듈에만 영향을 끼친게 아니라 clock 신호에도 같이 영향을 끼친 것.
캐패시터의 영향으로 clock은 우측의 양상을 보이게 되었다. 전구가 켜짐과 동시에 잠깐 rising 되고 엄청 아래로 떨어진다. 전구가 꺼질 때 0인 상태로 돌아오며 한 번 더 rising 되는 모습을 보여준다.
즉, clock이랑 캐퍼스터랑 연결된 상태에서 clock은 한 번 깜빡일 때, 두 번의 rising을 보여주게 된다.
이 현상을 해결하기 위해서는 clock 신호와 캐패시터를 분리해야 한다. 정확하게는 clock의 신호가 캐패시터로 가야하지만, 그 역으로는 영향을 끼쳐서는 안된다.
이는 근처 다른 모듈에 사용하고 남은 NOT 게이트를 두 번 지남으로써 해결했다.
https://www.reddit.com/r/beneater/comments/curlvs/edge_detection_rccircuit_for_ram_interfering_with/
From the beneater community on Reddit: Edge detection RC-circuit for RAM interfering with Clock Signal for other parts of the co
Explore this post and more from the beneater community
www.reddit.com
2. RAM의 모드 변경 시 RAM 값이 사라짐 (노이즈)
RAM 모듈에는 두 가지 모드가 있다. 프로그래밍 모드랑, 작동 모드. 프로그래밍 모드에서는 사용자 임의로 버튼을 이용해 값을 지정할 수 있는데, 값 지정 후 작동 모드로 변경하면 값이 초기화가 되었다.
다른 주소는 괜찮았는데, 작동 모드를 시작할 때 주소는 0이 되었다.
이 문제를 해결하고자 2가지 가설을 세웠다.
- 실제 작동 모드에서 항상 writeable 한 것이 아닐까?
- 노이즈 때문인가?
하나씩 살펴보자.
1. 실제 작동 모드에서 항상 writeable 한 것이 아닐까?
실제 작동 모드에서 writeable 한 지에 대한 검사는 아주 쉽다. ram chip의 writeable 한 핀에 전압이 걸려있는지 확인해보면 된다. 프로그래밍 모드와 작동 모드에 대해 write flag의 전압을 확인했고, flag 문제는 아니라는 사실을 알았다.
나는 이 가설이 맞다고 확신했었기에, 멘붕이 왔었다. 결국에 내 실수가 아니라 설계상 문제란 말이거든.
이 정도면 ben eater가 나의 실력을 위해 준비해둔 선물인가 싶을 정도이다.
2. 노이즈 때문인가?
1번 가설이 틀렸기에, 2번 가설이 유력해졌다. 다만, 나에겐 노이즈를 확인할 수 있는 오실로스코프가 없어서 정말 난해했다.
다행히도 관련 내용으로 redit에 검색해보니 관련 결과가 나왔다.
모드를 바꾸는 스위치에서 스위칭 노이즈가 발생하고 ram의 write 핀에 자그마한 rising이 발생한다는 것. 그 자그마한 rising을 chip이 인식해서 순간적 write가 일어난다고 한다.
그런 노이즈를 해결하는 방법으로 캐퍼시터를 달면, rising이 일어나더라도 천천히 일어나게 되고 문제 없이 정상적으로 자동되게 된다.
3. 전력 분배
완성했을 때, 가장 걱정한 문제이자 어떻게 해결할지 가장 난감한 문제였다.
사실상 전선이 많은 이번 프로젝트에서 한 번은 마주쳐야만 하는 문제였다.
이렇게 큰 문제일 줄 몰랐는데, 의외로 크더라..
전력 문제의 심각성을 확인하게 된 건 위의 사진의 공이 크다.
cpu flag 핀 중 CO, MI 두 핀이 켜져 있어야 하는데, CO 핀만 켜져있다. EEPROM 문제인가???
하지만 전압기로 살펴보니 MI핀에 전압이 걸려있다!!! 2.1 V정도??
아주 놀랍게도, 파란 led로 두면 안 켜지던 led가 노란색 교체하니 켜졌다. led의 색마다 최저로 요구하는 볼트가 정해져있나 보다.
참 아니러니한 현상으로 계속 힘들어 했는데, 5V 전원을 아래쪽에 꽂으니 MI 핀이 켜졌다.
전력문제가 이렇게나 크다.
위 사진이 전원을 아래에 꽂은 모습인데, 위로 갈 수록 전원이 약해지는게 눈에 띄게 느껴진다.
그래서 해결책으로 위와 아래의 5V, Ground를 직접적으로 연결하자는 생각을 했고, 실천했더니 해결되었다.
+ 전력분배에서 노이즈를 해결하는 방식으로 설계상 들어있던 내용도 있어서 추가한다.
각 브레드보드의 5V, Ground마다 캐퍼시터가 달려있다. 5V, Ground의 전력에서 노이즈가 생길 때, 그 노이즈를 완화해주어 전력문제를 줄이는 역할을 한다.
4. 버스
기존에는 버스의 led를 저항 220 하나로 연결했다.
어차피 led 각각에 저항을 연결하나 한 번에 연결하나 똑같은거 아닌가하는 생각이었다.
그런데 어떨 때는 버스의 led가 잘 켜지는가 하면, 또 어떨 때는 버스에는 전류가 있지만 led가 켜지지 않는 경우도 있었다.
혹시 몰라서, 각각의 led에 저항 220으로 달아주니 이제는 led가 잘 켜지는게 아닌가!!
아직까지도 무슨 이유인지는 모르겠다. 나중에 각 잡고 제대로 고민해봐야겠다.
하여튼, 버스 led가 잘 안 켜진다는 이유로 집에 안 쓰는 브레드보드 하나를 가져와 활용해주었다.
5. 회로 문제
ben eater 내용을 따라하는 과정에서 나의 실수로 생긴 회로 문제!
당연히 있을거라고 각오했던만큼, 다른 오류들보다는 비교적 쉽게 해결할 수 있었다.
1. RAM의 OUT flag가 켜졌을 떄 출력문제.
RAM에서 2,3,4번 핀이 꺼져 있는 켜져있든 버스에 2,3,4핀이 HIGH로 전달된다.
RAM에서 bus로 나가는 부분을 담당하는 74LS245가 (tri-state chip 이 친구는 너무 많이 써서 외워버렸다 ㅋㅋㅋㅋ) 풀업 저항이라는 특성상 선이 누락될 경우 HIGH로 전달된다. 그러니 2,3,4번 내용의 선의 누락을 의심할 수 있었고 덕분에 쉽게 해결했다.
2. A 레지스터 7번째 bit가 불이 안 들어옴
왼쪽의 빨간 8개 led가 RAM이고, 오른쪽 위의 8개의 led가 A Register이다. RAM에서 A Register로 데이터를 옮겼는데 7번째 bit가 여전히 LOW인 것을 확인할 수 있다. 회로를 보기가 참 힘들어서 처음에는 Register의 Chip 상태에 문제가 생겼다고 생각하고 식겁했다. 다행히도 앞 4bit와 뒷 4bit 레지스터를 교환했음에도 7번째 bit가 문제라 Chip 문제는 아님이 확인되었다.
이건 신기하게도, 고치는 과정에서 실수로 툭 쳤는데 해결되었다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
컴퓨터 툭 치면 해결되는 원리를 간접적으로 알아차린 것이지!! 그냥 전선이 이상했던거야!!!
3. Program Register 출력 문제
Program Register는 첫 4비트에 명령어를 뒤의 4비트에 값을 저장해서, 뒤의 4비트만 bus로 옮긴다. 하지만 위에서도 언급했듯이 버스로 옮기는 74LS245는 풀업저항이다. 버스로 옮기면 아무 값도 옮기지 않았기에 1로 고정된다.
74LS245에 값을 넣지 않을거면 Ground에 연결해주자.
마무리
와 이 카타르시스!!!
다 만들고 나서 트러블슈팅까지 끝내고 마지막 테스트를 진행했다.
와... 내가 원하는 대로 실행될 때 이 행복감!!!
후회없는 경험이었다.
이 하드웨어 경험을 이어서, 해킹 도구라던지 하드웨어 장비 해킹 등의 공부로 이어질 수 있었으면 좋겠다.
현실에 나와있는 사물이 잘 동작하니 너무 신기하고 행복하다.
뿌듯 ㅎㅎ
'하드웨어 > Ben eater' 카테고리의 다른 글
8비트 컴퓨터 만들기 Ben Eater Part.8(CPU control logic) (3) | 2024.03.07 |
---|---|
8비트 컴퓨터 만들기 Ben Eater Part.7(bus) (0) | 2024.03.05 |
8비트 컴퓨터 만들기 Ben Eater Part.6(output) [2] (0) | 2024.02.03 |
8비트 컴퓨터 만들기 Ben Eater Part.6(output) [1.5] - Arduino programmer (0) | 2024.02.03 |
8비트 컴퓨터 만들기 Ben Eater Part.6(output) [1] (0) | 2024.01.30 |