Staram się zbudować komputer domowy Z80 do zabawy w retrocomputing i nauczyć się podstaw projektowania elektronicznego. W celu potwierdzenia koncepcji już w poprzednich tygodniach z powodzeniem montowałem podstawowy system na płytkach chlebowych.
Obecny prototyp jest niezwykle prosty. Jako zegara systemowego użyłem kryształu 4 MHz napędzanego przez oscylator przebijający 74HCT04, dwa zatrzaski 74HCT573 w trybie przezroczystym ( LE
wysokim) jako bufor dla 16-bitowej magistrali adresowej, kolejne dwa 74HCT573 w przeciwnych kierunkach kontrolowane przez RD
i NOT RD
jako dane dwukierunkowe bufor magistrali. I załączeniu 100 ns AT28C256 EEPROM (tylko 16 KiB zdekodowaniu) i dwa 150 ns 8-KiB CHiPs SRAM do magistrali systemowej. Użyłem 74HCT42 do wygenerowania CS
sygnału i podłączyłemOE
niskiego, WE
do wysokiego, pozostawiając tylko jeden sygnał CS do sterowania EEPROM.
Wszystko na płytkach chlebowych jest głośne, ale system wydawał się być w pełni operacyjny po ukończeniu każdego etapu. Teraz może pobierać instrukcje z EEPROM, odczytywać i zapisywać dane z / do SRAM i ma port szeregowy wykonany z innej zatrzasku 74HCT573, D0
jest podłączony do D0
, LE
to znaczy (NOT (IOREQ NAND WR))
, wyjście wychodzi z Q1
, innymi słowy, tylko z jednego portu wyjściowego bez logiki dekodowania adresu. Napisałem program testujący intensywnie wykorzystujący procesor / pamięć RAM, a mój komputer może wygenerować oczekiwany wynik. Memdumps pokazał również, że Z80 może poprawnie odczytać wszystkie bajty z EEPROM, więc wszystko działa.
Ale kiedy próbowałem sondować D0
pin szyny danych, widziałem dziwne „wycięcia” dla niektórych pozornie logicznych wyjść 1.
i wydaje się, że zawsze pojawiają się dla niektórych logicznych 1s krótko po uruchomieniu CS
sygnału EEPROM, na przykład, oto przechwytywanie dziwnego wycięcia nałożonego na niebieski sygnał EEPROM CS.
Próbowałem odizolować problem, więc podłączyłem wszystkie styki CS SRAM do HIGH, skutecznie usuwając je z systemu, i napisałem prosty program testowy, który nie ma dostępu do pamięci.
.org 0x00
di
xor a
loop:
out (0x00), a
inc a
jp loop
Ale problem pozostaje niezmieniony, dziwne „wycięcia” nadal pojawiają się zawsze dla niektórych logicznych 1, tuż po MEMRQ
i / lub (ponieważ w zasadzie jest to teraz jeden układ) CS
(niebieski) spada.
Wszystkie styki CS SRAM są WYSOKIE, więc system ma prawie tylko układ EEPROM AT28C256 jako pamięć i zatrzask jako port wyjściowy. System ma również wbudowany programator wykonany z Atmega328p do przeprogramowywania EEPROM w locie podczas żądania DMA, ale nie sądzę, że to winowajca, ponieważ skrystalizowałem wszystkie dane i dane wyjściowe programatora, oraz Widziałem wycięcia jeszcze przed dodaniem programatora.
Zatem „wycięcia” muszą zostać utworzone podczas cyklu pobierania kodu operacji. Czym oni są?
Mam kilka hipotez:
Nie ma w tym nic złego, jest to po prostu spowodowane złą integralnością sygnału płyt chlebowych i zniknie automatycznie w dobrze zaprojektowanej i dobrze oddzielonej płytce drukowanej . Płyta kontrolna ma wiele problemów z integralnością sygnału: niedopasowania impedancji, odbicia, pojemność pasożytnicza, przesłuch, EMI / RFI. Długie przewody magistrali przebiegające przez płytki prawdopodobnie pogorszą ten problem o stopień wielkości.
Jeśli to prawda, czy możesz wyjaśnić naturę „wycięć”? Czy to zjawisko ma nazwę w EE? Wcześniej widziałem wiele przekroczeń i dzwonków, ale nigdy nie widziałem „wycięć”. I dlaczego widzę to tylko dla niektórych poziomów logicznych?
Wyczucie czasu. Czy to możliwe, że krótki „czas ustalania” wyjścia EEPROM lub innych obwodów logicznych powoduje ten dziwny wpływ na magistralę?
Fan-out. Być może długa magistrala pobiera dużo prądu i ma wysoką pojemność, więc wyjście EEPROM miało trudności z doprowadzeniem magistrali do wysokiego poziomu? I prawdopodobnie sonda oscyloskopowa również ładuje autobus?
Spór o magistralę lub inne błędy logiczne, które spowodowały, że coś pociągnęło magistralę danych. Myślę, że mało prawdopodobne? Inne komponenty magistrali są izolowane, a ja nie widziałem, jak może to zrobić pojedynczy EEPROM AT28C256 lub zatrzask. Ale wydaje mi się, że nadal jest to możliwe z powodu błędu okablowania lub ukrytego wewnętrznego zwarcia w płytkach ściennych.
Aktualizacja: od samego początku stosowałem kondensatory odsprzęgające i filtrujące na płycie. Użyłem sporo kondensatorów odsprzęgających 0,1 uF na płytkach, a procesor ma nawet kondensatory 0,1 uF i 0,01 uF do odsprzęgania. Obecny system ma 8 płyt, każda płyta ma dwa aluminiowe kondensatory 4,7 uF na obu szynach do lokalnego filtrowania. Ponadto moc uzyskana z tablicy rozdzielczej ma kondensator tantalu 200 uF. Ale jak powiedziałem, problem jest tutaj.
Nie jestem jednak pewien, czy jest odpowiedni, szczególnie biorąc pod uwagę trudność umieszczenia 104 kondensatorów w pobliżu układów na płycie chlebowej. Być może dodanie więcej może to naprawić?
To, co mnie interesuje, to podstawowa przyczyna problemu. Jeśli można potwierdzić, że są to po prostu nieodłączne problemy związane z nieodpowiednim oddzielaniem lub słabą integralnością sygnału na płycie pilśniowej, mogę przestać marnować czas na rozwiązywanie problemów lub martwienie się o to, ponieważ ostatecznym projektem byłaby płytka drukowana. Ale nie jestem pewien.
Dzięki.
Aktualizacja 2: Uważam, że komentarz Bruce'a Abbotta dał prawidłową odpowiedź i problem został rozwiązany! Chociaż nie mogę tego przetestować do jutra. Winowajcą jest odświeżanie pamięci DRAM w Z80, więcej szczegółów znajdziesz w mojej odpowiedzi. Obecnie żadna nowa odpowiedź nie jest potrzebna i zaakceptuję własną odpowiedź po potwierdzeniu rozwiązania. Jeśli to nie zadziała, zaktualizuję pytanie. Dzięki za pomoc wszystkich.