HTG förklarar hur fungerar en CPU faktiskt?
De flesta saker i en dator är relativt enkla att förstå: RAM, lagring, kringutrustning och mjukvaran arbetar tillsammans för att göra en datorfunktion. Men hjärtat av ditt system, CPU, verkar som magi även för många tekniker. Här gör vi vårt bästa för att bryta ner det.
Merparten av forskningen för den här artikeln kommer från "But How Does It Know?" Av J. Clark Scott. Det är en fantastisk läsning, går till mycket djupare än den här artikeln kommer, och är väl värt parpengarna på Amazon.
En anteckning innan vi börjar: Moderna CPU: er är storleksordningar mer komplexa än vad vi beskriver här. Det är nästan omöjligt för en person att förstå alla nyanser av ett chip med över en miljard transistorer. De grundläggande principerna för hur allt passar samman är emellertid desamma, och förståelse av grunderna ger dig en bättre förståelse för moderna system.
Börjar små
Datorer fungerar i binär. De förstår bara två stater: på och av. För att utföra beräkningar i binär använder de det som kallas en transistor. Transistorn tillåter endast källströmmen att strömma genom den till avloppet om det finns ström över porten. I huvudsak bildar detta en binär strömbrytare, vilken skär kabeln av beroende på en andra ingångssignal.
Moderna datorer använder miljontals transistorer för att utföra beräkningar, men på lägsta nivå behöver du bara en handfull för att bilda de mest grundläggande komponenterna, kända som grindar.
Logiska grindar
Stack några transistorer ordentligt, och du har vad som är känt som en logisk grind. Logiska grindar tar två binära ingångar, utför en operation på dem och returnerar en utgång. ELLER-grinden returnerar till exempel sant om någon av ingångarna är sant. OCH-grinden kontrollerar om båda ingångarna är sanna, XOR kontrollerar om endast en av ingångarna är sant och N-varianterna (NOR, NAND och XNOR) är inverterade versioner av deras basportar.
Gör mat med portar
Med bara två grindar kan du göra grundläggande binär tillsats. Detta diagram ovan visar en halv adder, skapad med hjälp av Logicly, en gratis online lekplats för logiska grindar. XOR-porten här aktiveras om bara en av ingångarna är på, men inte båda. OCH-porten slås på om båda ingångarna är på, men håller av om det inte finns någon ingång. Så om båda är på, håller XOR bort och AND-porten slås på, kommer till rätt svar på två:
Detta ger oss en enkel inställning med tre separata utgångar: noll, en och två. Men en bit kan inte lagra någonting högre än 1, och den här maskinen är inte så användbar eftersom den bara löser ett av de enklaste matteproblemen. Men det här är bara en halv adder, och om du ansluter två av dem med en annan ingång får du en full adder:
Den fullständiga adderaren har tre ingångar - de två siffrorna som ska läggas till och en "bär". Bären används när det slutliga talet överstiger det som kan lagras i en enda bit. Fulla adders kommer att kopplas i en kedja, och bären överförs från en adder till nästa. Bären läggs till i resultatet av XOR-porten i den första hälften, och det finns en extra EL-grind för att hantera båda fallen när det som skulle behöva vara på.
När båda ingångarna är på, sätts bäraren på och skickar den till nästa fullständiga adder i kedjan:
Och det handlar om så komplicerat som tillägget får. Att flytta upp till fler bitar betyder i huvudsak bara mer fulladdare i en längre kedja.
De flesta andra matematiska operationer kan göras med tillägg; multiplikation är bara upprepad addition, subtraktion kan göras med lite fina bit inversion, och division är bara upprepad subtraktion. Och även om alla moderna datorer har hårdvarubaserade lösningar för att påskynda mer komplicerade operationer, kan du tekniskt göra allt med full adder.
Bussen och minnet
Just nu är vår dator inget annat än en dålig räknare. Detta beror på att det inte kommer ihåg någonting, och gör ingenting med sina utgångar. Ovanstående är en minnescell, som kan göra allt detta. Under huven använder den många NAND-portar, och i verkligheten kan det vara helt annorlunda beroende på lagringstekniken, men dess funktion är densamma. Du ger det några ingångar, aktivera "skriv" -biten och det lagrar inmatningarna inuti cellen. Det här är inte bara en minnescell, eftersom vi också behöver ett sätt att läsa information från den. Detta görs med en enabler, som är en samling av OCH-grindar för varje bit i minnet, som alla är bundna till en annan ingång, "läs" -biten. Skriv och läs bitarna kallas ofta också "set" och "enable".
Hela paketet är invecklat i vad som är känt som ett register. Dessa register är anslutna till bussen, som är ett bunt av ledningar som löper runt hela systemet, anslutna till varje komponent. Även moderna datorer har en buss, men de kan ha flera bussar för att förbättra multitasking prestanda.
Varje register har fortfarande en skriv- och läsbit, men i denna inställning är ingången och utgången samma sak. Detta är faktiskt bra. Till exempel. Om du ville kopiera innehållet i R1 till R2 skulle du slå på läsbiten för R1, vilket skulle trycka in innehållet på R1 på bussen. Medan läsbiten är på, skulle du aktivera skrivbiten för R2, som skulle kopiera bussen innehållet till R2.
Register används för att göra RAM också. RAM läggs ofta ut i ett nät, med trådar som går i två riktningar:
Dekodrarna tar en binär ingång och sätter på motsvarande numrerad tråd. Till exempel är "11" 3 i binärt, det högsta 2-bitarsnumret, så avkodaren skulle slå på den högsta ledningen. Vid varje korsning finns ett register. Alla dessa är kopplade till centralbussen och till en central skriv- och läsinmatning. Både läs- och skrivinmatningen slås bara på om de två ledningarna korsar över registret är på, vilket gör att du kan välja det register som du vill skriva och läsa från. Återigen är modernt RAM mycket mer komplicerat, men den här inställningen fungerar fortfarande.
Klockan, Stepper och dekodern
Register används överallt och är det grundläggande verktyget för att flytta data runt och lagra information i CPU. Så vad säger dem att flytta saker runt?
Klockan är den första komponenten i kärnan i CPU: n och kommer att stängas av och på vid ett bestämt intervall, mätt i hertz eller cykler per sekund. Detta är den hastighet du ser annonseras tillsammans med CPU: er; ett 5 GHz-chip kan utföra 5 miljarder cykler per sekund. Klockhastighet är ofta en mycket bra mätning för hur snabbt en CPU är.
Klockan har tre olika tillstånd: basklockan, aktivera klockan och den inställda klockan. Basklockan kommer att vara på för en halv cykel och av för den andra halvan. Aktivera klockan används för att aktivera register och måste vara på längre tid för att säkerställa att data är aktiverad. Den inställda klockan måste alltid vara på samtidigt som aktiveringsklockan, annars kan felaktiga data skrivas.
Klockan är ansluten till steget, som räknas från ett till det maximala steget och återställs till en när det är klart. Klockan är också ansluten till OCH-grindar för varje register som CPU kan skriva till:
Dessa OCH-grindar är också anslutna till utgången från en annan komponent, instruktionsavkodaren. Instruktionsavkodaren tar en instruktion som "SET R2 TO R1" och avkodar den till något som CPU kan förstå. Den har sitt eget interna register, kallat "Instruktionsregister", vilket är var den aktuella operationen lagras. Hur exakt det här kommer ner till det system du kör på, men när det avkodas kommer det att aktivera rätt set och aktivera bitar för de korrekta registren, vilket kommer att avfyra i enlighet med klockan.
Programinstruktioner lagras i RAM (eller L1-cache på moderna system, närmare CPU). Eftersom programdata lagras i register, precis som alla andra variabler, kan den manipuleras på flugan för att hoppa runt programmet. Så här får programmen sin struktur, med loopar och om uttalanden. En hoppinstruktion anger den aktuella platsen i minnet som instruktionsavkodaren läser från till en annan plats.
Hur allting kommer ihop
Nu är vår övergripande förenkling av hur en CPU fungerar komplett. Huvudbussen spänner över hela systemet och ansluts till alla registren. De kompletta tillsatserna, tillsammans med en massa andra operationer, packas in i den aritmetiska logikenheten eller ALU. Denna ALU kommer att ha anslutningar till bussen, och kommer även att ha egna register för att lagra det andra numret som det är på.
För att utföra en beräkning laddas programdata från systemminne till kontrollsektionen. Kontrolldelen läser två nummer från RAM, laddar den första i ALU: s instruktionsregister, och laddar sedan den andra på bussen. Under tiden skickar den ALU en instruktionskod som berättar vad som ska göras. ALU utför sedan alla beräkningar och lagrar resultatet i ett annat register, som CPU kan läsa från och fortsätter sedan processen.
Bildkredit: Rost9 / Shutterstock