EDVAC (ang. Electronic Discrete Variable Automatic Computer) – maszyna zbudowana według projektu J. Prespera Eckerta, J.W. Mauchly'ego i Johna von Neumanna, oddana w kwietniu 1949, działająca od stycznia 1952 do końca 1962[1]. Projekt komputera zaczął powstawać w roku 1944, w trakcie prac nad jego poprzednikiem, ENIAC-iem. Do usprawnień należy zaliczyć: przechowywanie programu w pamięci, binarne kodowanie liczb, rtęciową pamięć operacyjną.

EDVAC został zbudowany dla Army Ordnance Department przez Moore School of Electrical Engineering przy Uniwersytecie Pensylwanii i zainstalowany w Ballistic Research Laboratory, Aberdeen Proving Ground kosztem $467,000. Komputer był taktowany zegarem 1MHz i zużywał 56 kilowatów mocy. W roku 1949 składał się z 3000 lamp elektronowych i 8000 diod, do roku 1961 liczby te wzrosły do 5937 i 12000[2].

Architektura edytuj

EDVAC był binarnym komputerem szeregowym o 44-bitowym słowie wyrównanym do 48 cykli. Pamięć operacyjna miała rozmiar 1024 słów. Bity były kodowane jako puls, oznaczający jedynkę, oraz brak pulsu, czyli zero. Pulsy następowały co 1 mikrosekundę i trwały około 0.3μs. Wykrycie braku pulsu było możliwe dzięki sygnałowi zegarowemu[3].

Transmisja jednego słowa trwała 48 μs, okres nazywany małym cyklem (minor cycle). Pamięć operacyjna składała się z rtęciowych linii opóźniających ze wzmacniaczami regenerującymi pulsy. Linie, określane jako długie zbiorniki (long tank), mieściły po 8 słów. Długi zbiornik miał więc długość 384 μs, tzw. duży cykl (major cycle). Wykonanie dużego cyklu trwało 8 małych cykli.

Słowa kodujące liczby zaczynały się od znaku (puls oznaczał minus), po którym następował najmniej znaczący bit, następnie kolejne bity, aż do najstarszego, a na końcu 4 zera dopełniające do 48. Wystąpienie na ostatnich czterech pozycjach pulsu było traktowane jako błąd i powodowało zatrzymanie maszyny. Kodowanie liczb przypomina znak-moduł, z dokładnością do pozycji bitu znaku. Tak zapisana liczba była interpretowana jako ułamek z przedziału (-1, 1) zapisany stałopozycyjnie. Mnożenie i dzielenie były zaprojektowane tak, aby wspierać tę interpretację[4].

Rozkazy również zajmowały jedno słowo. Pierwsze 4 bity kodowały rozkaz, a pozostałe 40 – cztery adresy w pamięci operacyjnej. 10 bitów wystarczało do zaadresowania wszystkich 1024 komórek pamięci. W przypadku operacji arytmetycznych dwa adresy wskazywały operandy, trzeci miejsce zapisania wyniku, a czwarty następną instrukcję. Trzymanie adresu następnej instrukcji miało pozwalać na optymalizację dostępów do pamięci; opóźnienie odczytu z długich zbiorników można było przewidzieć i tak rozmieścić dane i kod w pamięci, aby zminimalizować opóźnienie[5].

Główne komponenty edytuj

Zegar edytuj

Ta jednostka zawierała generator głównego pulsu zegarowego. Poza nim wyprowadzone było również 48 sygnałów zapalających się jeden po drugim w kolejnych taktach małego cyklu[6].

Dyspozytor edytuj

Dyspozytor (dispatcher) dekodował instrukcje i generował sygnały sterujące pracą pozostałych jednostek. Zawierał cykliczny rejestr o pojemności jednego małego cyklu, w którym trzymał aktualnie wykonywany rozkaz. Posiadał również układ realizujący przesunięcia i konwertujący sygnały asynchroniczne na synchroniczne, co było konieczne przy wczytywaniu danych z zewnątrz[6].

Rachmistrz edytuj

Odpowiednik dzisiejszej jednostki arytmetyczno-logicznej. Wykonywał operacje dodawania, odejmowania, mnożenia i dzielenia. Miał dwie kopie obwodów liczących; rozbieżność wyników między nimi powodowała zatrzymanie maszyny[6].

Pamięć edytuj

Pamięć operacyjna była zorganizowana w dwa identyczne banki, lewy i prawy, zbudowane z 64 linii opóźniających każdy, umieszczonych w obudowach utrzymujących temperaturę 50 °C. Pojedynczy bank mieścił 512 słów i umożliwiał pracę komputera nawet w przypadku awarii drugiego banku. Poza długimi zbiornikami, każdy bank zawierał też trzy krótkie zbiorniki wykorzystywane przez Rachmistrza, oraz część obwodów Dyspozytora odpowiedzialną za wybór wskazanej pozycji w pamięci. Fizycznie banki znajdowały się na przeciwległych krańcach maszyny[7].

Czytnik i Rekorder edytuj

Układ do odbierania i wysyłania danych na urządzenia zewnętrzne. Początkowo nośnikiem miał być przewód magnetyczny(inne języki), ale ta technologia okazała się zawodna i została do roku 1952 zastąpiona przez taśmę dziurkowaną od IBM. W 1954 została jeszcze dodana pamięć bębnowa. Obie zmiany nastąpiły długo po zbudowaniu komputera, kiedy zmiany były trudne do wprowadzenia, co uczyniło rozwiązania do obsługi taśm i bębna ułomnymi i mało wydajnymi[8].

Panel Kontrolny edytuj

Służył do obsługi komputera przez człowieka. Znajdowały się na nim przyciski do włączania zasilania, uruchamiania, przerywania i wznawiania obliczeń, jak również przełączniki do ręcznego wprowadzania danych, ustawiania adresu pierwszej instrukcji i trybu pracy. Panel pozwalał na podgląd i zmianę zawartości dowolnej komórki pamięci, a także na zaglądanie do rejestrów Dyspozytora i Rachmistrza. Do wyświetlania danych służył oscyloskop oraz lampy neonowe[7].

Zestaw instrukcji edytuj

Schemat kodowania instrukcji przedstawiony jest w tabeli. Bity są numerowane w kolejności pojawiania się na kablu, czas płynie w lewo.

44 ... 35 34 ... 25 24 ... 15 14 ... 5 4 ... 1
A1 A2 A3 A4 typ operacji

Spośród 16 numerów operacji możliwych do zapisania na 4 bitach wykorzystywane było 11, pozostałe były równoważne z instrukcją stopu. Wykonanie odbywało się w czterech etapach, z których każdy mógł trwać wiele małych cykli. W większości instrukcji A4 stanowił adres następnej instrukcji, automatycznie ładowanej do Dyspozytora w ostatnim etapie wykonania rozkazu[9].

Poniższy opis jest oparty na raporcie z roku 1949 i nie zawiera późniejszych zmian, które m.in. zastąpiły instrukcję obsługującą przewód magnetyczny trzema rozkazami do czytania i pisania z taśmy dziurkowanej oraz Panelu Kontrolnego[10].

Przerwij edytuj

Zatrzymuje obliczenia i sygnalizuje to na Panelu Kontrolnym. Zasilanie pozostaje włączone, a maszyna jest gotowa do wznowienia działania. Naciśnięcie przycisku rozpoczęcia obliczeń powoduje załadowanie rozkazu spod A4 i kontynuację działania. Adresy A1, A2 i A3 są ignorowane[11].

Dodaj edytuj

Składniki pod adresami A1 i A2, suma zapisywana pod A3. Przekroczenie zakresu może zostać zignorowane albo spowodować zatrzymanie programu, w zależności od stanu przełączników na Panelu Kontrolnym[11].

Odejmij edytuj

Odjemna pod adresem A1, odjemnik pod A2, różnica zapisywana pod A3. Obsługa przekroczenia zakresu jak w dodawaniu[11].

Porównaj edytuj

Jeśli liczba zapisana pod adresem A1 jest mniejsza od liczby spod A2, to następna instrukcja jest ładowana z adresu A3, w przeciwnym wypadku z A4[12].

Pomnóż z zaokrągleniem edytuj

Czynniki pod A1 i A2, znak i najwyższe 43 z 86 bitów iloczynu zapisywane pod A3. Ta operacja nigdy nie przekracza zakresu. Jeśli zinterpretujemy czynniki jako ułamki z zakresu (-1, 1), to wynik będzie ich iloczynem (zaokrąglonym), również z zakresu (-1, 1)[12].

Pomnóż dokładnie edytuj

Czynniki pod A1 i A2. Starsze 43 z 86 bitów wyniku zapisywane pod A3, bez zaokrąglania, a młodsze 43 pod (A3 + 1) mod 1024. Znak wyniku jest zapisywany w obu komórkach pamięci[13].

Podziel z zaokrągleniem edytuj

Dzielna pod A1, dzielnik pod A2, znak i pierwsze 43 bity ilorazu (ostatni zaokrąglony) zapisywane pod A3. Jeśli wartość bezwzględna ilorazu jest większa lub równa 1, wynikiem jest ciąg jedynek z poprawnym znakiem. W takim wypadku program może być zatrzymany, chyba że w Panelu Kontrolnym jest ustawiony przełącznik ignorowania błędów przepełnienia[14].

Podziel dokładnie edytuj

Dzielna pod A1, dzielnik pod A2, znak i pierwszej 43 bity ilorazu (bez zaokrąglenia) zapisywane w A3, reszta z dzielenia (ze znakiem dzielnej) zapisywana w (A3 + 1) mod 1024[14].

Przenieś edytuj

Pozwala przesunąć bity słowa zapisanego pod A1 i nadpisać nimi część słowa spod A3. A2 nie jest w tym rozkazie adresem w pamięci, lecz koduje przesunięcie i nadpisywany region słowa A3[15]. Trzy najmłodsze bity A2 wybierają jeden z 8 opisanych niżej wariantów instrukcji, kolejne 6 wartość przesunięcia (zapisanego w bazie 16 16 8 4 2 1), a najstarszy bit ustala kierunek przesunięcia[16]. Przesunięcie w lewo odpowiada opóźnieniu bitów słowa w czasie (i pomnożeniu liczby przez naturalną potęgę dwójki), a przesunięcie w prawo - przyspieszeniu. Wystąpienie pulsu na ostatniej pozycji A2 sygnalizuje przesunięcie w prawo. Znak słowa zapisanego pod adresem A1 nie podlega przesunięciu w 7 z 8 wariantów, zamiast niego przesuwane jest 0. Bity przesunięte poza zakres [1, 44] są gubione[17].

Warianty 1-4 edytuj

Nadpisują region A1, A2, A3 lub A4 w obrębie słowa pod adresem A3 bitami z odpowiadających pozycji w przesuniętym słowie spod A1. Programista musi zadbać, żeby dane do zapisu były na wysokości docelowego regionu[18].

Wariant 5 edytuj

Zastępuje bit znaku słowa A3 najmłodszym bitem przesuniętego słowa A1. Nie jest to bit znaku słowa A1, w szczególności przesunięcie o zero powoduje wyzerowaniu bitu znaku A3[19].

Wariant 6 edytuj

Kopiuje wszystkie przesunięte bity słowa A1 poza znakiem; słowo A3 zachowuje swój oryginalny znak[20].

Wariant 7 edytuj

Kopiuje wszystkie przesunięte bity słowa A1 oraz znak. Znak nie ulega przesunięciu, jest tylko przepisywany. Całe słowo A3 zostaje utracone; ten wariant realizuje klasyczne przesunięcie arytmetyczne[19].

Wariant 0 edytuj

Przesuwa tylko bit znaku słowa A1, ignorując jego resztę, i nadpisuje nim bit słowa A3 na pozycji, do której nastąpiło przesunięcie. To pozwala ustawić bądź wyzerować dowolny bit słowa A3, nie zmieniając pozostałych[21].

Załaduj edytuj

Ten rozkaz miał służyć do kopiowania danych między pamięcią operacyjną a zewnętrznym nośnikiem, a także do czytania z przełączników Panelu Kontrolnego i pisania na jego lampy neonowe. A2 koduje jedną z 23 operacji wejścia-wyjścia, natomiast A1 i A3 oznaczają początek i koniec obustronnie domkniętego zakresu adresów w pamięci, na których operuje instrukcja. A2 koduje następujące opcje:[22]

  • wybór urządzenia od 0 do 3, gdzie 0 to Panel Kontrolny, a pozostałe to taśmy
  • kierunek przewijania taśmy
  • zapis, odczyt lub przewijanie
  • specjalny tryb czytania adresów z taśmy

Ostatnia opcja pozwalała wczytywać dane do dowolnych adresów pamięci. Na taśmie musiały być na przemian 10-bitowe adresy i 44-bitowe dane. Operację kończyło napotkanie na taśmie adresu równego A3.

Wyświetl edytuj

Projekt przewidywał instrukcję sterującą w czasie rzeczywistym kropką oscyloskopu. Słowa pod adresami A1 i A2 miały zawierać współrzędne X i Y, a dwa najmłodsze bity A3 numer wyświetlacza (1, 2 lub 3). Docelowo zrezygnowano jednak z tego rozkazu[10].

Tryby pracy edytuj

Panel Kontrolny pozwalał na pracę w trybie normalnym lub specjalnym. Tryb specjalny pobierał rozkazy z Przełączników Rozkazu Specjalnego i służył do ręcznego uruchomienia programu. Tryb normalny pobierał rozkazy z pamięci i mógł działać na różne sposoby:[23]

  • automatycznie, aż adres pobranej instrukcji będzie równy adresowi końcowemu ustawionemu na przełącznikach
  • krokowo, wykonując jedną instrukcję po każdym wciśnięciu przycisku rozpoczęcia obliczeń
  • krokowo, wykonując jeden etap instrukcji (każda instrukcja miała 4 etapy)
  • krokowo, przez jeden mały cykl

Przypisy edytuj

Bibliografia edytuj

Linki zewnętrzne edytuj