EDVAC

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj
Edvac.jpg

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ć już w roku 1944, w trakcie prac nad jego poprzednikiem, ENIAC-iem. Do usprawnień należy zaliczyć przechowywanie programu w pamięci, binarne kodowanie liczb oraz 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.[1]:30


Architektura[edytuj | edytuj kod]

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[2]:1.1.

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ę.[2]:1.2

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.[1]:27

Główne komponenty[edytuj | edytuj kod]

Zegar[edytuj | edytuj kod]

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.[2]:1.3

Dyspozytor[edytuj | edytuj kod]

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.[2]:1.3

Rachmistrz[edytuj | edytuj kod]

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.[2]:1.3

Pamięć[edytuj | edytuj kod]

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.[2]:1.4

Czytnik i Rekorder[edytuj | edytuj kod]

Układ do odbierania i wysyłania danych na urządzenia zewnętrzne. Początkowo nośnikiem miał być przewód magnetyczny [1], 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.[1]:31-32

Panel Kontrolny[edytuj | edytuj kod]

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.[2]:1.4

Zestaw instrukcji[edytuj | edytuj kod]

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.[2]:1.5-1.6

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.[1]:28

Przerwij[edytuj | edytuj kod]

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.[2]:1.7

Dodaj[edytuj | edytuj kod]

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.[2]:1.7

Odejmij[edytuj | edytuj kod]

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

Porównaj[edytuj | edytuj kod]

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.[2]:1.8

Pomnóż z zaokrągleniem[edytuj | edytuj kod]

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).[2]:1.8

Pomnóż dokładnie[edytuj | edytuj kod]

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.[2]:1.8-1.9

Podziel z zaokrągleniem[edytuj | edytuj kod]

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.[2]:1.9

Podziel dokładnie[edytuj | edytuj kod]

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.[2]:1.9

Przenieś[edytuj | edytuj kod]

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.[2]:1.10 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.[2]:2.47 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.[2]:2.41-2.42

Warianty 1-4[edytuj | edytuj kod]

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.[2]:2.43

Wariant 5[edytuj | edytuj kod]

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.[2]:2.44

Wariant 6[edytuj | edytuj kod]

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

Wariant 7[edytuj | edytuj kod]

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.[2]:2.44

Wariant 0[edytuj | edytuj kod]

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.[2]:2.44-2.45

Załaduj[edytuj | edytuj kod]

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:[2]:1.10-1.14

  • 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 | edytuj kod]

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.[1]:28


Tryby pracy[edytuj | edytuj kod]

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:[2]:1.15

  • 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

  1. 1,0 1,1 1,2 1,3 1,4 1,5 Michael Williams. The origins, uses, and fate of the EDVAC. „Annals of the History of Computing”. 15 (1), 1993. IEEE. 
  2. 2,00 2,01 2,02 2,03 2,04 2,05 2,06 2,07 2,08 2,09 2,10 2,11 2,12 2,13 2,14 2,15 2,16 2,17 2,18 2,19 2,20 2,21 2,22 2,23 2,24 2,25 S.E. Gluck, W.H. Boghosian: A functional description of the Edvac. Philadelphia: Moore School of Electrical Engineering. [dostęp 10.02.2015].

Linki zewnętrzne[edytuj | edytuj kod]