APO Flashcards
von Neumannova architektura pocitace
Zakladni deleni pocitace na 3 casti:
- Procesor - vykonava instrukce:
- control unit - ma registry a ridici hradla ktera dekoduji a provadi operace,
- ALU - aritmeticko-logicka jednotka
- Pamet - slozena z bunek - bajtu, stejna pro program i data
- I/O - klavesnice, mys, monitory, sluchatka….
Ma instrukce a data zapsane do stejne pameti dohromady (oproti Harvardske architekture, ktera ma dve ruzne pameti)
Program predepisuje instrukce, ktere ma pocitac vykonat. Program je nahran do pameti, tedy instrukce jsou sekvencne za sebou a postupne je procesor cte, instrukce jsou aritmeticke a logicke operace, presuny dat, skoky a vetveni…
CPU, co to je a co obsahuje v sobe
Central Processing Unit - vykonava instrukce.
- Uzivatelske registry - nekolik standardnich “ulozist” pro promenne, tedy do registru (ktery je pevne zadan pro konkretni ucel) zadam hodnotu a tim komunikuju s CPU (treba do registru zadam 2 cisla abych je secetl), je to pamet primo na CPU, tedy extremne rychla
- ALU - arithemtic logical unit - umi provadet aritmeticke operace na datech.
CPU nacita z pameti instrukce sekvencen a kazdou z nich vykona. Adresa aktualni instrucke je v registru PC nebo IP
Pocitacova pamet, zakladni definice
Uchovava data - bajty, slova
Je to ocislovany seznam bajtu
Je to jako pole, do ktereho mohu zapisovat a cist
Velikost adresy urcuje i velikost pameti - tedy pokud mam 32-bitovou adresu, tak mohu zakodovat 2^32 adresnich bunek
Instrukce procesoru, zakladni prehled
Instrukce jsou jedine cinnosti, ktere CPU umi vykonavat - nacte instrkci - vykona - cte dalsi…
Pracuje s daty, ktere umi skladat do registru (jako do promennych) a posilat je dal do ALU:
- Ulozit konstantu do registru
- Nacist data z pameti do registru
- Ulozit data z registru do pameti
- Provest mat. operaci s registry a vysledek ulozit do registru
- Porovnat dve cisla
- Podle vysledku porovnani provest jinou instrucki - skok v programu
VSECHNY PROGRAMY, ktere provadeji i slozite vypocty se stejne kompilatorem prelozi na tyto zakladni typy
Instruction Set Architecture (ISA), definice
Je to Architektura souboru instrukci.
Tedy kompletni instrukcni sada vcetne adresnich modu a specifikaci
// mam nekolik druhu, jak mohou vypadat instrukce (neco jako programovaci jazyky maji svuj syntax, tak i instrukce mohou byt ruzne a pracovat s ruznymi adresami)
Priklady ISA a co musi obsahovat
ISA obsahuje:
1. Samotne instrukce
2. Podporovane datovy typy (cela cisla, cela cisla se znamenkem, realna)
3. Registry
4. Adresni mody
5. Organizace pameti,
Toto charakterizuje instrukcni sadu.
Prikaldy: x86, ARM, MIPS, RISC-V
Rozdil mezi RISC a CISC
Reduce/Complex Instruction Set Computer
Tedy pocitac muze byt postave na zaklade RISC nebo CISC sady instrukci, tj jeho procesor “rozumi” RISC nebo CISC instrukcim
RISC je mensi, odlehceni a jednodussi model
CISC - ruzne dlouhe instrukce, nejcastejsi jsou nejkratsi
RISC - stejne dlouhe 32 bitove instrukce, jednoduchy inkrement PC+4, skoky na nasobky 4 ALE
do instrukce se nevejde cele 32-bitove cislo (je potreba 2 operace nacteni po 16 bitech), ma obecne delsi program nez CISC
Booleovska algebra, operace and, or, not a komplexnejsi
Booleovska algebra je matematicka struktura, ktery ma pouze dve hodnoty, popisujici ano/ne
- Or: operace + (nebo)
0+0 = 1, 1+0=1, 0+1=1, 1+1=1 - And: operace * (zaroven)
00 = 0, 10 = 0, 01 = 0, 11 = 1 - Not: negace
not 0 = 1, not 1 = 0
Vsechny komplexnejsi oprace jako (nand, nor, xor…) jsou pouze kombinaci techto zakladnich
XOR, NAND
XOR - vraci true pokud jsou vstupni hodnoty ruzne (nebo v pripade trojice je pocet jednicek lichy) - tedy pro stejne vstupy - falce, pro ruzne vstupy true, pro tri promenne udelam posutpne asociativne nejdriv dve apak snima udelam xor se treti
NAND - negace and, tedy je to false pouze por oba vstupy = 1
Logicky obvod, definice
Je to zapojeni vodicu tak, ze podle napeti na vstupu splnuji booleovske operace. Jejich kombinaci muzeme ziskavat komplexnejsi vysledky
Jak scitat binarni cisla v ALU?
Pomoci binarni scitacky:
Operace shift
Je posun doleva/doprava o 1 bit.
treba
001 -> 000 posun doleva, pokud mam jen 3 mista
010 -> 001 posun doprava, pokud mam jen 3 mista
Tedy rotuju a pridavam nuly zleva a ubiram prvky vpravco
Binarni cislo
Je to takove cislo, ktere je reprezentovano ve dvojkove soustave a jeho zapis se do desitkove soustavy prepise jako:
101001011 znamena:
1(2^8) + 0(2^7) + 1(2^6) + 0(2^5) + 0(2^4) + 1(2^3) + 0(2^2) + 1(2^1) + 1*(2^0), tedy
Posloupnost mocnic 2^0 - 2^12
1, 2, 4, 8, 16, 32, 64, 128, 256, 518, 1024, 2048, 4096
Tedy priklad:
1024 + 256 + 8 + 2 + 1 = 1291
dek_cislo = Suma ai*(2^0)
Zakladni velikosti ukladanych cisel v pocitaci
Bit - nejmensi velikost 1, je to jen jedno policku s hodnotou 1/0, tedy dvojkovy bit reprezentuje cislo pouze 0-1
Nible: 4 bity, reprezentuje cisla 0-15, tedy je to:
_ _ _ _, kam mohu dosadit 0000=0, 1111=15 (hexadecimalni cislo)
Bajt: 8 bitu, _ _ _ _ _ _ _ _, tedy 0-255, zakladni jednotka pameti - slovo
Unsigned char - 1 bajt, cisla 0-255
Unsigned short int - 2 bajty, cisla 0-65535
Unsigned int - 4 bajty, cisla 0-4,3 miliardy
Ulozeni cisel v pameti - Big/Little endien
Bit Endien - ulozeni nejvyssho bajtu jako prvni v pameti, nizsi bajty jdou dal, Motorola
Little Endiend - nejmene vyznamny bajt (posledni z cisla) je ulozen jako prvni v pameti, Intel
Sestnactkova soustava
Cislo je zapsano pomoci mocnin 16.
ma cislice: 0-9
ma pismenka: A-F, kde
A = 10,
B = 11,
…,
F = 15
Slovo/cislo:
0A0B0C0D v pocitace znamena zapis:
0000A0000B0000C0000D, ale zkracuje se zapis
Kazde pismenko sestnackve soustavy je samo o sobe binarni cislo o 4 bitech:
A = 1010.
Takze celkovy zapis je:
(0000)(1010)(0000)(1011)(0000)(1100)(0000)(1101)
Tedy 32 bitu - 4 bajty, ktere treba delim 0A, 0B, 0C, 0D
Jak slovo 0A0B0C0D zapise v pameti Big/Little/Midle endien?
Big - stejne, nejvyssi bajt jako prvni:
0A, pak 0B… => 0A0B0C0D
Little - obracene, posledni bajt jako prvni:
0D, 0C,… => 0D0C0B0A
Midle - kombinace od poloviny slova
0B0A0D0C
Prevod desitkoveho cisla do binarniho
Dva kroky:
- Cislo % 2 = nove_cislo + zbytek (0|1)
- nove_cislo % 2 = nove_nove_cislo + zbytek (0|1)…
Tedy poradim delam modulo 2 a zapisuju si zbytky v obracenem poradi
Na konci prepisu 0|1 z 1. kroku v OBRACENEM poradi:
2437 do bin. soustavy:
1. 2437 % 2 = 1, delim 2
2. 1218 % 2 = 0, delim 2…
3. 609 % 2 = 1
4. 304 % 2 = 0
5. 152 % 2 = 0
6. 76 % 2 = 0
7. 38 % 2 = 0
8. 19 % 2 = 1
9. 9 % 2 = 1
10. 4 % 2 = 0
11. 2 % 2 = 0
12. 1 % 2 = 1
13… vzdy 0
- pozice je moje prvni, 1. pozice je posledni, tedy zleva dorpava pisu jako zespoda nahoru:
100110000101
Dvojkovy doplnek pri pocitani s cisly se znamenky
Prvni bit cisla reprezentuje znamenko (ale take se podili na hodnote)
0 -> +
1 -> -,
Nech mam zadane cislo M, pak od 0 do M/2 - kladna cast - ma standardni reprezentaci v bin. soustave.
ALE
-M/2 do 0 - zaporna cast - ma DOPLNKOVY tvar, tedy
1. zapisu jakoby jeji kladnou hodnotu (z -12 udelam 12 a zapisu v bin. podobe)
2. INVERTUJU VSECHNA ZNAMENKA (0->1, 1->0),
3. Prictu 1 => doplnkovy tvar, ukazuje zaporna cisla
- bit mi urci znamenko hned od pohledu:
01111111 -> + 127
kdyz k tomu prictu 1:
10000000 -> - 128
Tedy pokud od 0:
00000000 odectu 1:
00000001
__________ dostanu:
11111111 -> coz je -1
PULI MI TO CELKOVY ROZSAH NA DVE POLOVINY PRO ZNAMENKOVA CISLA, KDE ZAPORNYCH JE O 1 VIC, PROTOZE 0 PATRI DO KLADNYCH:
signed char = -128 az 127…
Dvojkovy doplnek cisla 98:
1. Do bin. soustavy: 1100010
2. Doplnit na 8 bitu, nebo 16, atd…: 01100010
3. Inverze: 10011101
3. Prictu 1: 10011110
Binarni scitacka, definice
Je zarizeni, ktere je schopno secist dve binarni cisla. Dela to normalne jako pod sebou a vypocita pro kazdou pozici zvlast jak vysledek pozice, tak i carry dal.
Treba scitam cisla:
A4A3A2A1A0
+ B4B3B2B1B0
———————
C4S4S3S2S1S0
Tedy po slozkach sestu sumu jako Si, a vysledek muze mit cary Ci.
Kazdy castecny soucet Ai+Bi muze byt ovlivnen C(i-1) z predchoziho souctu, tedy:
Ai + Bi + C(i-1) = SiCi
1-Bitova scitacka dela presne toto:
je to takovy V, kde nahore bere Ai a Bi, dole vyprodukuje Si, zleva vyprodukuje Ci, a zprava bere C(i-1) pripadne.
Takove scitacky muzeme retezit za sebou - tim dostnanu N-bitovou scitacku (KTERA MI SECTE DVE N-BITOVA CISLA HNED JAKO POD SEBOU), ale je to pomaly, protoze kazda dalsi scitacka musi cekat na Ci vsech scitacek pred sebou, tedy je to operace slozitosti N.
Ripple Carry Adder VS Carry Look Ahead Adder
Ripple Carry Adder je obycejne retezeni 1-Btovych scitacek za sebou, kdy mam vyslednou N-Bitovou scitacku (secte dve N-bitova cisla) ale je to pomaly, protoze vzdy musim cekat na Carry z predchozi scitacky.
Carry Look Ahead Adder predikuju mozny predchozi Carry uz z cisel, ktera vstupuji do predchozi scitacky. Tedy C(i-1) predikuje podle A(i-1) a B(i-1). Dve varianty, kdy vznikne prenos:
- Generovani carry: A=1, B=1 => nutne pri A+B vznikne carry=1
- Propagace: A=1, B=0, C=1 => preposlu carry, pokud alespon jeden z A,B neni 0
Tedy rekurentni vztah pro odhad pripadneho carry je:
C1 = G0 + P0*C0 // carry z 1. souctu je bud vygenerovan v aktualnim souctu NEBO je propagovan z predchoziho souctu
C2 = G1 + P1C1
C3 = G2 + P2C2
G4 = G3 + P3C3…
Tento pristup je rychlejsi, protoze nemusi cekat na carry predchozi, ale spocita ho hned ze zadanych cisel, tedy rychlost je konstantni
Jeste rychlejsi algortimus je pomoci stromove struktury, kde je slozitost log(n)
Binarni nasobicka
Bud normalne pod sebou to vynasobim jako kdbycyh to delal v dekadicky soustave.
Nebo soucin A*B je jenom B-krat soucet A samo se sebou pomoci B scitacek kde vstup je A+A.
Nebo pomoci nasobicky ktera se sklada z pasky, kam zapisuju mezi vysledek a ze ktere vyctu vysledek, jedne scitacky a operace & (and).
- Necht A=4 bity, B=4 bity, AB=C, kde C=4+4=8 bitu
- Vytvorim tedy pasku delky 8 bitu.
- Rozdelim pasku na [0…0 | B], tedy pulka jsou nuly, na druhou pulku dam B a vzdy si ohranicim POSLEDNI bit pasky - kteremu budu rikat b (a bude se menit furt)
- Postavim bin. scitacku, ktera jako LEVY vstup bere LEBOU cast pasky a jako PRAVY vstup bere A&b, tedy bitovy AND A s b (to znamena, ze mi bud zustane samotne A, nebo samotne nuly).
- Vysledek scitacky se PRICTE K LEVE strane pasky.
- Cela paska se shiftuje doprava o 1 bit.
- Novy posledni bit b znovu poslu do (A&b) -> sectu s levou casti pasky -> prictu mezivysledek k leve casti pasky -> shift doprava -> …
Tento proces delam tolikrat, jak je dlouhe cislo B (neboli kratsi z nich).
Po tom, co jsem provedl posledni krok (dostal jsem i carry???) -> udelam posledni rotaci doprava (aby se mi carry veslo na pasku) a je to hotovy vysledek.
Jak fyzicky reprezentovat bit/bajt?
Jako vodic napetim, tj bajt je 8 ruznych vodicu se svymi hodnotami
Co znamena operace shift vzhledem k binarnimu cislu
nasobeni/deleni mocninou 2