

Witam wszystkich. Chciałbym przedstawić na łamach forum mój projekt, który powstaje już od około pół roku. Tematem projektu jest komputer 8-bitowy oparty o procesor Z80. Założeniem jest, aby zbudować funkcjonalny komputer 8-bitowy w stylu lat 70-80 od podstaw, korzystając z możliwie najprostszych podzespołów (jednak bez przesady - nie zamierzałem budować np. własnego CPU...) . Komputer powinien mieć budowę modułową, umożliwiać łatwą i szeroką rozbudowę, powinien współpracować z monitorem VGA i klawiaturą jako podstawowymi urządzeniami wejścia/wyjścia, zawierać system operacyjny (monitor) w pamięci ROM oraz umożliwiać wymianę danych i programów ze światem zewnętrznym (np. ładować oprogramowanie z PC lub nośnika typu karta SD,CF lub inne). Całość chciałem wykonać w miarę możliwości schludnie, na płytkach drukowanych, bez zwisających wszędzie kłębów kabli.
Aktualnie projekt osiągnął etap na którym udało mi się uporać z najważniejszymi problemami sprzętowymi, dzięki czemu sam hardware jest już uruchomiony i przetestowany,co mam nadzieję nadaje się już do prezentacji na forum... Dalsze prace będą obejmowały głównie część programową - monitor/system operacyjny , programy demonstracyjne, gry itp. Planuję również budowę dodatkowych kart rozszerzeń, wzbogacających funkcje komputera.
Podstawowe dane techniczne:
- Procesor Z80 taktowany zegarem 4,096Mhz
- 32 KB ROM (układ FLASH 256KB, możliwość wyboru banku zworkami)
- 32 KB RAM (statyczny)
- interfejs klawiatury matrycowej - użyłem klawiatury z Commodore C64
- 2 równoległe porty IO 8-bit (jeden wejściowy, jeden wyjściowy)
- Karta grafiki: monochromatyczny tryb tekstowy 40x33 znaki , font 8x12. Możliwość przełączenia w tryb graficzny 160x100 pikseli, również mono.
- karta dźwiękowa: oparta na znanym, klasycznym układzie AY-3-8912. karta zawiera wzmacniacz mono na LM386
- 6 gniazd rozszerzeń (2 zajęte przez kartę graficzną i dźwiękową)
Poniżej schematy i projekty płytek w Eagle`u. Kolejno: płyta główna, płyta rozszerzeń, karta graficzna i karta dźwiękowa. Uwaga co do płyty głównej: zaprojektowałem ją w taki sposób, aby mogła pracować samodzielnie - bez dodatkowych kart i płyty rozszerzeń. Na zdjęciu widać podpiętą klawiaturę i wyświetlacz LCD pomocny przy debugowaniu. Program wgrany do pamięci FLASH umożliwia prostą edycję tekstu na LCD za pomocą klawiatury. Na złączu magistrali widać zworę podpinającą sygnały /BUSREQ, /WAIT, /INT oraz /NMI do plusa zasilania (po dołożeniu płyty rozszerzeń te sygnały można terminować zworkami lub użyć ich w układach peryferyjnych). Taka konfiguracja daje już przyzwoity i całkowicie funkcjonalny komputer jednopłytkowy (ang. SBC - single board computer).








Poniżej więcej zdjęć wykonanego sprzętu: płyta główna w czasie testów, karta graficzna i dźwiękowa:





Zdecydowanie największym wyzwaniem była karta graficzna. Do tematu generowania sygnału VGA przymierzałem się już od bardzo długiego czasu. Były próby lepsze i gorsze, nieudane prototypy, poznawanie nowych technik sprzętowych i programowych, ciągłe zgłębianie tematu i rozkładania na czynniki pierwsze. Ostatecznie pozostałem przy następującym rozwiązaniu: układ CPLD (XC9536XL firmy XILINX) "zasilany" generatorem kwarcowym generuje sygnały synchronizacji poziomej i pionowej VGA oraz sygnały taktujące i ładujące rejestr przesuwny 74LS165. Dane dla tego rejestru przygotowuje Atmega328. Mikrokontroler zajmuje się również odbiorem danych z Z80 zapewniając synchronizację odczytu danych z wyświetlaniem obrazu (brak migotania / śnieżenia obrazu przy zapisie danych). Dane z magistrali adresowej (współrzędne ekranowe X i Y) oraz magistrali danych (kod ASCII znaku do wyświetlenia) są pobierane szeregowo w trakcie wygaszania poziomego. Przerzutnik (1/2 74HCT74) pomaga synchronizować pobieranie danych z CPU. Na wyjściu rejestru przesuwnego karta generuje obraz monochromatyczny (wybrałem kolor zielony - wiadomo, najbardziej "klimatyczny"

Aktualnie komputer ma wgrany w ROM prosty program bootloadera, który odbiera z 8-bitowego portu wejściwego kod programu i po jego zapisaniu w pamięci RAM wykonuje skok do początku kodu. Programy piszę korzystając z asemblera TASM firmy Squak Valley Software i edytora Programmer`s notepad. Zasemblowany program przesyłam przez RS232 do małej przystawki wykonanej na bazie Atmega8. Układ ten odbiera transmisję z UART (po drodze jest jeszcze konwerter MAX232) i podaje ją wraz z sygnałami synchronizującymi do portu wejściowego komputera. Poniżej zdjęcie przystawki podczas pracy:

Taki bootloader jest oczywiście rozwiązaniem przejściowym, bardzo pomocnym przy rozwijaniu projektu (za jego pomocą wgrałem widoczny na pierwszym zdjęciu program demo - wyświetlający wszystkie znaki ASCII). W docelowym komputerze chciałbym wykorzystać jakiś prosty i łatwo dostępny nośnik danych jak karta SD/CF oraz ew. dodatkowo zrobić kartę rozszerzeń z układem UART np. 16450 i "prawdziwy" port RS232 do komunikacji i ładowania oprogramowania.
Ponieważ jest to mój pierwszy post na Elektrodzie, bardzo jestem ciekaw waszych opinii co do takiego projektu. Szczególnie ciekawi mnie, czy ktoś inny zrobił / planuje zrobić coś podobnego ? Czy macie w tym temacie jakieś doświadczenia ? Chętnie przyjmę każdą uwagę i wysłucham pomysłów co do ewentualnego dalszego rozwoju projektu!
W sprawie kosztów projektu: Najdroższe okazały się laminaty, których kilka również w trakcie prac zepsułem... każdy spory laminat to pewnie jakieś ~10PLN. Na wszystkie wykonane do tej pory płytki poszło , jak widać na zdjęciach - sporo srebrzanki, za łącznie jakieś 15PLN. Część układów scalonych pochodzi z rozbiórki starego sprzętu, reszta, jakieś ~15-20 sztuk to nowe elementy po standardowych cenach 1-2 PLN. Pamięć Flash nabyłem za 4PLN. Klawiatura pozyskana z zakupionego martwego Commodore (~30PLN). Wyświetlacz LCD 4x16 ładny , z podświetleniem to około 30PLN. Reszta, np. goldpiny (dużo...) to koszt jakieś 15PLN. Drobne części elektroniczne z własnych zapasów.
Dodatkowo postanowiłem oprócz własnych notatek i materiałów gromadzonych na swoim Google Drive prowadzić również dziennik prac w postaci bloga.
Update 20.08.2014:
Udało się uruchomić pierwszą wersję prostego monitora i wgrać ją do pamięci ROM. Aktualnie dostępne są następujące komendy:
dump: zrzut pamięci
edit: edytor pamięci
fill: wypełnianie pamięci zadaną wartością
copy: kopiowanie danych w pamięci
cls: czyszczenie ekranu
input: odczyt bajtu z portu I/O
output: wysłanie bajtu do portu I/O
jump: skok pod zadany adres
load: załadowanie danych/programu do RAM poprzez kabel szeregowy.
Prezentacja aktualnej wersji całego projektu dostępna jest na Youtube (poprawiłem czytelność opisów w stosunku do poprzedniego filmu):
http://youtu.be/Cr7MO-5dX40
Jeżeli ktoś chciałby zerknąć na kody źródłowe , to chętnie podeślę.
Update 19.05.2016
Minęło już prawie dwa lata od ostatniej publikacji w temacie mojego komputera. Ponieważ od tego czasu projekt bardzo się rozrósł i praktycznie jest już kompletny, postanowiłem podzielić się efektami prac, jakie prowadziłem przez ten czas:
Komputer otrzymał 4 nowe karty:
- Karta UART z układem 16450
- Karta układu czasowo-licznikowego Z80 CTC (może służyć jako kontroler przerwań)
- 8-bitowy interfejs IDE dla Compact Flash + układ we/wy 8255 na jednej karcie.
- Karta-adapter dla 8-bitowych kart ISA z PC (dla karty grafiki Hercules/MDA). Karta ta zawiera dodatkowo układ zimnego/gorącego RESETu oraz mechanizm przełączania banków pamięci - obsługa max 64KB RAM.
Zdjęcia i schematy kart:








Do programu monitora dopisałem funkcje obsługi systemu plików FAT16 (odczyt/zapis)
Całość została umieszczona w obudowie ze sklejki:

Na koniec na komputerze został zainstalowany system operacyjny CP/M w wersji 2.2. Uruchomienie systemu na komputerze było możliwe dzięki napisaniu procedur obsługi dysku , klawiatury i karty graficznej MDA w wydzielonym obszarze systemu CP/M - BIOSie.
Załączam link do kodu źródłowego BIOSu.
Wygląd komputera, oraz kilka zdjęć aplikacji pracujących pod kontrolą systemu CP/M:




Jeżeli chodzi o plany na przyszłość:
Chciałbym zastąpić kartę MDA przynajmniej kartą CGA, tak aby uzyskać możliwość podłączenia komputera do łatwiej dostępnych monitorów / telewizorów ze SCART. Idealnie byłoby wykorzystać 8-bitową kartę VGA - posiadam takową i pracuję nad jej obsługą z mojego komputera.
Muszę opracował prosty sposób przesyłania plików pomiędzy PC a systemem CP/M. Aktualnie przesłanie czegokolwiek z PC to dość kłopotliwy i złożony proces.
Cool? Ranking DIY