Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
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 10401 0
IGE-XAO
  • 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
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    Kubald
    Level 15  
    Offline 
    Has specialization in: spektroskopia exafs/xanes, uc, it
    Kubald wrote 188 posts with rating 95, helped 0 times. Live in city Kraków. Been with us since 2004 year.
  • IGE-XAO