Jak to robi kalkulator - dodawanie ?

0

Ostatnio zaczolem sie zastanawiac, jak dziala kalkulator...
Nie chodzi mi tu o wyswietlacz, baterie itd, ale o to jak kalkulator liczy.
Np. jak napisali byscie program typu "kalkulator", gdyby komputer nie potrafil liczyc?
No bo:
if licba1=2 and liczba2=3 then wynik:=5;
chyba odpada, no nie?

Wie ktos?
[cya]

0

Kalkulator liczy oczywiście binarnie. Jak sam doskonale wiesz, układ zerojedynkowy bardzo łatwo przedstawić za pomocą sygnałów elektrycznych 0 - brak prądu, 1 - jest prąd.

W układach cyfrowych stosuje się tak zwane bramki które pozwalają na wykonywanie podstawowych operacji logicznych (and, or, not).

user image

np.
1 or 0 = 1
1 and 1 = 1
not 1 = 0

Sama bramka w środku to nic innego jak, w zależności od rodzaju - kilka diód, tranzystory, rezystory (ale niewiele tego)
Z bramek można tworzyć m. in. tzw. sumatory. Są to proste układy dodające binarnie.

Zapis binarny mam nadzieję znasz.. Sumowanie binarne odbywa się tak (zakładając, że mamy 3 linie sygnałowe - czyli 8 stanów, bo 2^3 = 8):

Dodajemy do siebie np 2 i 3. czyli :

010 + 011 = ?
(licząc od tyłu - czyli od najmniej znaczącego bitu) :
0 + 1 = 1 - nie ma przepełnienia
1 + 1 = 0 - jest przepełnienie (bo 1+1 = 2, a takiej cyferki nie mamy)
przepełnienie z poprzedniego - 1 + 0 + 0 = 1 - bez przepełnienia..

czyli wynik jest taki : 101, więc tak jakbyć powinno.

Następnie wynik taki jest podawany na inne bramki które z kolei sterują np wyświetlaczem. W Twoim procesorze jest kilkaset milionów bramek :)

0

010 + 011 = ?
(licząc od tyłu - czyli od najmniej znaczącego bitu) :
0 + 1 = 1 - nie ma przepełnienia
1 + 1 = 0 - jest przepełnienie (bo 1+1 = 2, a takiej cyferki nie mamy)
przepełnienie z poprzedniego - 1 + 0 + 0 = 1 - bez przepełnienia..

czyli wynik jest taki : 101, więc tak jakbyć powinno.

AndRew - po takim opisie, to ja zwątpiłem :)
działania na liczbach binarnych wykonuje się tak samo jak na liczbach dziesiętnych. Dodawane liczby zapisuje się nad sobą i zaczynając od prawej strony dodaje do siebie. Jedyna różnica polega na tym, że 1+1 = 10 (jak w systemie dziesiętnym 5+5=10)zapisujemy 0, a 1 przesuwamy o jeden rząd w lewo. Oto przykład:
[code]
101
+101

1010
[/code]
Od prawej 1+1=0 i 1 dalej

Mój opis, chociaż o wiele mniej profesjonalny od AndRew`owego, to jednak odrobinę bardziej przejrzysty:)

0

Krecik: Problem w tym, że kalkulator nie zapisuje jednej liczby nad drugą tylko przetwarza przez bramki logiczne, tak jak to AndRew opisał, a w temacie chodzi konkretnie o działanie kalkulatora, nie systemu binarnego... :P

0

Sumator to nic tudnego. Naważniejsze jest to, że dostęp do komórki/rejestru jest równoległy. Odpowiednio 4/8/16/... bitowy, w zależności od tego jak sobie projektant wymyśli. A komórka/rejestr w przyblizeniu odpowiada przrzutnikowi s/r (set/reset) - podstawowemu typowi pamięci, czyli dwóm zmutowanym bramkom nor (not(a or b)), które działają na sprzeżeniu zwrotnym. Ewentualnie innym (np. mieszaninie bramek nand i not). Dla bitu zerowego przyjmuje się przeniesienie równe zero (flaga carry z procka - to właśnie to).

Przyjmę taki zapis:
Ax - dana wejściowa - bit x. - dopuszczalne stany oczywiście: 0/1
Bx - dana wejściowa - bit x.
Wx - dana wyjsciowa - bit x.
Cx-1 - przeniesieie z dodawania poprzednich dwoch komórek.
gdzie x ma wartosc np. 0...3, 0..7, czy dowolną inną górną granicę, w zależności od przyjętej ilości bitów dla komórki/rejestru.

W komórce/rejestrze wynikowej x-ty bit to wynik
(bez () bo kolejnośc przecież bez znaczenia):
Wx=Ax xor Bx xor Cx-1 - bramka EOR/XOR - the same

A flaga przeniesienia (przynajmniej 2 z 3 bitów zapalone):
Cx=(Ax and Bx)or(Ax and Cx-1)or(Bx and Cx-1)

I tak równolegle n (4/8/fefnaście/praktycznie_ile_kto_chce) układów.

Wzorki pisze z pamięci, więc są bez optymalizacji...

Właściwie dla bitu 0 flaga przeniesienia Cx-1 nie istnieje/nie jest brana pod uwagę/nie jest uwzględniona w układzie elektrycznym, bo też i nie ma takiej potrzeby i koszty wykonania i dalszej obsługi są troszkę mniejsze...

W0=A0 xor B0;
C0=A0 and B0.

PS. dlatego flagi w procku to rejestr szeregowy, w przeciwieństwie do całej reszty rejestrów i pamięci... N bitów to n 'drutów/linii', flagi też tak mają, ale każdy jeden bit jest podłączony do innego układu, natomiast w pamięciach/rejestrach równoległych wszystkie bity połączone są równolegle do jednego wspólnego n bitowego. Układ ten sam z siebie może mieć kilka (m) wejśc n bitowych, zaś na zewnętrz może mieć jedno wyjście m*n bitowe. Jak w starszych pentiumach 2 pamięci 32 bitowe, a kontroler na wyjściu do szyny procka 64 bitowy (nie chcę przekłamać, ale chyba właśnie tak było)

1 użytkowników online, w tym zalogowanych: 0, gości: 1