Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Nibbler - 4-bitowy komputer domowej roboty

Kubald 09 Sep 2013 21:37 10614 0
Nazwa.pl
  • Nibbler - 4-bitowy komputer domowej roboty

    Poznajmy Nibblera - 4-bitowy procesor, zbudowany w domu. Od czasu, kiedy autor stworzył komputer BMOW1, otrzymywał wiele zapytań, jak zabrać się do skonstruowania w domu własnego komputera. I jako że BMOW to skomplikowana maszyna, autor postanowił opracować urządzenie, którego działanie będzie łatwe do zrozumienia, budowa nie nastręczy trudności – a ciągle będzie można przy jego pomocy uruchamiać ciekawe programy.

    Niektórzy mogą pomyśleć: „4-bitowy procesor? NUDA!”. Autor zgadza się z tym, że wiele krążących w sieci konstrukcji procesorów 4-bitowych nie jest zbytnio ekscytująca, ale raczej nie wynika to z faktu ich 4-bitowości, ale niedociągnięć w konstrukcji całego komputera. Wiele konstrukcji wykorzystuje też pamięć o wielkości 256 półbajtów – jest to za mało, aby zapisać w niej jakikolwiek ciekawy program. Także stosowanie jedynie diod i wyłączników jako wejść/wyjść mocno zawęża obszar zastosowań takiej konstrukcji.

    Tymczasem, podczas projektowania procesora Nibbler autor postawił sobie następujące cele:
    - Wykorzystanie jedynie układów serii 7400 i pamięci RAM/ROM; brak programowalnych układów logicznych.
    - Łączna liczba układów możliwie jak najniższa.
    - Całość nieskomplikowana i prosta do zrozumienia.
    - Jasny rozdział pomiędzy CPU a peryferiami komputera.
    - Możliwość uruchamiania interesujących programów wykorzystujących urządzenia We/Wy.

    Architekturę całości pokazano na tytułowym obrazku. Rdzeń CPU to 11 układów z serii 7400 oraz rezonator zegarowy. Pamięć RAM i ROM to dwa dodatkowe układy plus kilka układów peryferyjnych We/Wy daje razem 16 układów.

    Instrukcje są 4-bitowe, co razem daje 16 możliwych instrukcji. Wykonanie którejkolwiek z nich zajmuje dokładnie 2 cykle zegara. Podczas pierwszego cyklu, nazwanego fazą 0, kod operacyjny i argument odczytywane są z pamięci i zapisywane w rejestrze nazywanym Fetch. W czasie drugiego cyklu, nazywanego fazą 1, przeprowadzane są operacje niezbędne do wykonania instrukcji.

    Para pamięci ROM dla mikrorozkazów używana jest do generowania 16 wewnętrznych sygnałów sterujących. Adresowanie pamięci opiera się o kod instrukcji, fazę cyklu i flagi equal oraz carry procesora. Każda z dwu pamięci odpowiada za generowanie 8 z 16 sygnałów.

    Wszystkie wyniki operacji arytmetycznych i logicznych przechowywane są w pojedynczym, 4-bitowym rejestrze akumulacyjnym „A”. Dane mogą być przenoszone pomiędzy pamięcią RAM a rejestrem, ale procesor korzysta jedynie z rejestru, co uproszcza konstrukcję sprzętową.

    W przeciwieństwie do współczesnych procesorów, Nibbler oparto o architekturę Harwardzką. Oznacza to, że programy i dane przechowywane są w innych przestrzeniach adresowych i przekazywane za pomocą osobnych szyn danych o szerokości 4 bit. Szyna programowa ma szerokość 8 bitów: 4 bity kodu i 4 bity operatora.

    Adresy programów i danych mają 12 bitów, co razem daje 4096 bajtów pamięci do przechowywania programów i 4096 półbajtów dla danych.

    Komputer jednak nie wspiera mapowania w pamięci wejść i wyjść, nie ma rejestrów adresowych i nie umożliwia adresowania pośredniego. Nie wspierany jest także stos sprzętowy.

    Procesor może obsługiwać do 16 wejść/wyjść, ale zaplanowano korzystanie z jednego portu We i dwóch portów Wy. Jako wejście zastosowano mikroswitche: lewo/prawo/wybór/wstecz. Jako wyjście wykorzystano diody LED, buzzer i dwuliniowy wyświetlacz LCD.

    Na poniższym rysunku można zobaczyć schemat urządzenia. Poza pamięciami RAM i ROM, wszystkie układy – jak już wspomniano – należą do rodziny 7400.

    Nibbler - 4-bitowy komputer domowej roboty

    Po prawej stronie, w środku schematu, znajduje się pamięć programu ROM. Wykorzystano układy EEPROM o łącznej pojemności 8x8K, ale ze względu na rozmiar szyny adresowej programy mogą mieć maksymalnie 4K, więc jedno z wejść adresowych jest stale połączone z 0. W momencie rozpoczęcia wykonywania programu wpisywany on jest do rejestru Fetch.

    Licznik programu, w którym przechowywany jest adres wykonywanej instrukcji, składa się z trzech 4-bitowych liczników ‘163. W przypadku instrukcji skoku do licznika programu może być także zapisany nowy adres.

    W lewym, górnym rogu umieszczono trzy układy zajmujące się wykonywaniem bieżących instrukcji. Rejestr Fetch oparto na układzie ‘377 – 8-bitowym rejestrze, który przetrzymuje kod operacji w 4 starszych bitach i instrukcję lub adres w 4 młodszych bitach. Flagi ALU zapisywane są w 4-bitowym rejestrze flag na układzie ‘173 – jako że komputer korzysta z dwu flag, dwa z czterech bitów są nieużywane. Ostatnim układem jest ‘175 – poczwórny przerzutnik flip-flop. Jeden z przerzutników służy do synchronizacji sygnału reset, drugi generuje wskaźnik aktualnie wykonywanej Fazy. Pozostałe dwa przerzutniki nie są używane.

    W dolnej, lewej części znajduje się układ ‘181 – pełniący funkcję ALU oraz kość ‘173 pracująca jako rejestr akumulacyjny. Jednostka arytmetyczno-logiczna dokonuje działań arytmetycznych lub logicznych na danych podawanych na dwa jej wejścia – w tym wypadku na jedno podawane są dane z akumulatora, a na drugie – z szyny danych. Wyniki operacji arytmetyczno-logicznych składowane są z powrotem w akumulatorze.

    Po uważnej analizie można zauważyć, że bit Carry-in ALU jest sygnałem generowanym przez kod, a nie pochodzi z rejestru Flag – dzięki temu flaga carry stanowi wynik operacji arytmetycznej i może być wykorzystana do tworzenia skoków warunkowych. To rozwiązanie zastosowano celowo.

    Pamięć RAM umieszczona jest na dole, w środku. Jej wejścia/wyjścia przyłączono do szyny danych, a adresowana jest 4 starszymi bitami z rejestru Fetch i 8 młodszymi bitami z pamięci programu ROM. Idealnym rozwiązaniem, ze względu na 4-bitową architekturę, byłoby zastosowanie pamięci SRAM o organizacji 4Kx4 – najbliższym realnym rozwiązaniem jest zastosowanie pamięci 2Kx8, co oznacza że istnieć będzie jedynie 2048 adresowalnych półbitów, a połowa linii We/Wy będzie niewykorzystana.

    Sygnał zegarowy CLK połączony jest z wejściem /CE pamięci RAM. Oznacza to, że pamięć będzie aktywna jedynie w drugiej połowie każdego cyklu zegara.

    Wejścia i wyjścia są także połączone z szyną danych, na schemacie pokazano je w dolnym, prawym roku. IN0 to układ ‘125, do którego przyłączono, za pomocą rezystorów podciągających, mikrowyłączniki. Ponieważ port wejścia jest tylko jeden, nie jest konieczne dekodowanie jego numeru.

    Porty wyjściowe zrealizowano na 4-bitowych rejestrach ‘173. Port OUT1 połączony do szyny danych [4…7] służy do sterowania wyświetlacza LCD 16x2 ze sterownikiem HD44780. Wyświetlacz może pracować z powodzeniem w trybie 4-bitowym. Sygnały RS i E wyświetlacza pochodzą z portu OUT0. Pozostałe dwie linie połączono do diod LED i buzzera, który będąc sterowanym przebiegiem prostokątnym, dzięki bit-bangingowi, może generować dźwięki o różnej częstotoliwości.

    Ostatnimi elementem jest układ ‘244, bufor przyłączony do szyny danych.

    Mogą być stosowane dwa rodzaje instrukcji: wykonywana natychmiastowo i adresowana. Kodowanie instrukcji jest bardzo proste:

    Nibbler - 4-bitowy komputer domowej roboty

    Cztery bity kodu instrukcji i[0…3] łączone są z flagami C oraz E oraz bitem Fazy, dając razem 7-bitowt adres dla dwu pamięci ROM, które – jak wspomniano – generują 16 sygnałów kontrolnych. Zostało to dokładnie przedstawione w poniższej tabeli.

    Nibbler - 4-bitowy komputer domowej roboty

    W pierwszej linijce tabeli widać, że dla wszystkich instrukcji faza 0 jest taka sama. W Fazie 1 odbywają się wszystkie operacje. ADDI stanowi dobry przykład typowej instrukcji o kodzie binarnym 1010 lub heksadecymalnym $A. /oeOprnd wynosi 0, aby umożliwić układowi ‘244 wprowadzenie wartości argumentu na szynę danych. Sygnały /carryIn, M oraz S[0…3] służą do ustawienia ALU do operacji dodawania, bez przenoszenia. Niska wartość /loadA powoduje zapis wyniku operacji do akumulatora. /loadFlags w stanie niskim gwarantuje, że flagi zostaną uaktualnione wynikiem operacji arytmetycznej.

    Instrukcja JE (skocz, jeśli równe) jest kolejnym dobrym przykładem. Instrukcja binarnie może być zapisana jako 1000 lub $8 w systemie HEX. Jeśli flaga E wynosi 1, to sygnał incPC będzie niski (rejestr PC nie będzie zwiększany), jak i sygnał /loadPC (nowy adres będzie wpisany do rejestru). Innymi słowy, jeśli E jest równe 1, skok zostanie wykonany.

    Ze względu na 4-bitową architekturę, istnieje maksymalnie 16 różnych instrukcji, w tym 5 instrukcji skoków. Instrukcje LD i ST ładują do akumulatora półbajt z pamięci RAM, lub powodują jego zapisanie w przestrzeni danych. Instrukcja OUT przepisuje półbajt z akumulatora do jednego z ośmiu portów wyjściowych – funkcja IN ma działanie odwrotne; obydwie używane są do obsługi We/Wy. Inne instrukcje to m. in. ADDI, ADDM, CMPI czy NOR.

    Nibbler - 4-bitowy komputer domowej roboty

    Autor, na stronie projektu, udostępnia także symulator komputera i szerzej opisuje jego działanie oraz sposób programowania.

    Cool? Ranking DIY
    About Author
    Kubald
    Level 15  
    Offline 
    Has specialization in: spektroskopia exafs/xanes, uc, it
    Kubald wrote 188 posts with rating 102. Live in city Kraków. Been with us since 2004 year.
  • Nazwa.pl