De meeste dingen in een computer zijn relatief eenvoudig te begrijpen: het RAM, de opslag, de randapparatuur en de software werken allemaal samen om een computer te laten functioneren. Maar het hart van je systeem, de CPU, lijkt zelfs voor veel techneuten magisch. Hier zullen we ons best doen om het op te splitsen.
Het meeste onderzoek voor dit artikel komt uit "Maar hoe weet het dat?" door J. Clark Scott. Het is fantastisch om te lezen, gaat veel dieper dan dit artikel, en is het paar dollar op Amazon zeker waard.
Een opmerking voordat we beginnen: moderne CPU's zijn ordes van grootte complexer dan wat we hier uiteenzetten. Het is bijna onmogelijk voor één persoon om elke nuance van een chip met meer dan een miljard transistors te begrijpen. De basisprincipes van hoe alles in elkaar past, blijven echter hetzelfde, en als u de basisprincipes begrijpt, krijgt u een beter begrip van moderne systemen.
Klein beginnen
Computers werken in binair . Ze begrijpen slechts twee toestanden: aan en uit. Om berekeningen in binair formaat uit te voeren, gebruiken ze een zogenaamde transistor. De transistor laat alleen de bronstroom erdoorheen naar de afvoer stromen als er stroom over de poort is. In wezen vormt dit een binaire schakelaar, die de draad afsnijdt afhankelijk van een tweede ingangssignaal.
VERWANT: Wat is binair en waarom gebruiken computers het?
Moderne computers gebruiken miljarden transistors om berekeningen uit te voeren, maar op de laagste niveaus heb je maar een handvol nodig om de meest elementaire componenten te vormen, ook wel poorten genoemd.
Logische poorten
Stapel een paar transistors op de juiste manier en je hebt een zogenaamde logische poort. Logische poorten nemen twee binaire ingangen, voeren er een bewerking op uit en retourneren een uitgang. De OF-poort geeft bijvoorbeeld true terug als een van de ingangen waar is. De EN-poort controleert of beide ingangen waar zijn, XOR controleert of slechts één van de ingangen waar is, en de N-varianten (NOR, NAND en XNOR) zijn geïnverteerde versies van hun basispoorten.
Rekenen met poorten
Met slechts twee poorten kunt u een eenvoudige binaire optelling uitvoeren. Dit diagram hierboven toont een halve opteller, gemaakt met Logisch , een gratis online speeltuin voor logische poorten. De XOR-poort wordt hier ingeschakeld als slechts een van de ingangen is ingeschakeld, maar niet beide. De EN-poort wordt ingeschakeld als beide ingangen zijn ingeschakeld, maar blijft uit als er geen invoer is. Dus als beide zijn ingeschakeld, blijft de XOR uit en wordt de EN-poort ingeschakeld, waardoor het juiste antwoord van twee is:
Dit geeft ons een eenvoudige installatie met drie verschillende uitgangen: nul, een en twee. Maar een bit kan niets hoger dan 1 opslaan, en deze machine is niet zo handig omdat het slechts een van de eenvoudigste wiskundige problemen oplost. Maar dit is maar een halve opteller, en als je er twee met een andere ingang verbindt, krijg je een volledige opteller:
De volledige opteller heeft drie ingangen: de twee getallen die moeten worden opgeteld en een 'carry'. De carry wordt gebruikt wanneer het laatste aantal groter is dan wat in een enkele bit kan worden opgeslagen. Volledige adders worden in een ketting gekoppeld en de carry wordt van de ene opteller naar de volgende doorgegeven. De carry wordt toegevoegd aan het resultaat van de XOR-poort in de eerste helft-opteller, en er is een extra OF-poort om beide gevallen af te handelen wanneer dat zou moeten zijn.
Als beide ingangen zijn ingeschakeld, wordt de carry ingeschakeld en wordt deze naar de volgende volledige opteller in de keten gestuurd:
En dit is ongeveer net zo complex als optellen wordt. Door naar meer bits te gaan, betekent dit in wezen gewoon meer volledige adders in een langere keten.
De meeste andere wiskundige bewerkingen kunnen worden uitgevoerd met optellen; vermenigvuldigen is gewoon herhaald optellen, aftrekken kan worden gedaan met een of andere fraaie bitinversie, en delen is gewoon herhaald aftrekken. En hoewel alle moderne computers hardwarematige oplossingen hebben om meer gecompliceerde bewerkingen te versnellen, kunt u dit technisch allemaal met de volledige opteller doen.
De bus en het geheugen
Op dit moment is onze computer niets meer dan een slechte rekenmachine. Dit komt doordat het zich niets kan herinneren en niets doet met zijn outputs. Hierboven is een geheugencel weergegeven, die dat allemaal kan. Onder de motorkap gebruikt het veel NAND-poorten, en in het echte leven kan het behoorlijk verschillen, afhankelijk van de opslagtechniek, maar de functie is hetzelfde. Je geeft het wat input, zet de ‘write’ bit aan en het slaat de inputs op in de cel. Dit is niet alleen een geheugencel, we hebben ook een manier nodig om er informatie uit te lezen. Dit wordt gedaan met een enabler, wat een verzameling EN-poorten is voor elk bit in het geheugen, allemaal gekoppeld aan een andere ingang, de "lees" -bit. De schrijf- en leesbits worden ook vaak "set" en "enable" genoemd.
Dit hele pakket is verpakt in wat bekend staat als een register. Deze registers zijn verbonden met de bus, een bundel draden die door het hele systeem loopt en met elk onderdeel is verbonden. Zelfs moderne computers hebben een bus, hoewel ze mogelijk meerdere bussen hebben om de multitaskingprestaties te verbeteren.
Elk register heeft nog steeds een schrijf- en leesbit, maar in deze opstelling zijn de invoer en uitvoer hetzelfde. Dit is eigenlijk goed. Bijvoorbeeld. Als je de inhoud van R1 naar R2 zou willen kopiëren, zou je de leesbit voor R1 aanzetten, die de inhoud van R1 op de bus zou duwen. Terwijl de leesbit is ingeschakeld, moet u de schrijfbit voor R2 inschakelen, waardoor de inhoud van de bus naar R2 wordt gekopieerd.
Registers worden ook gebruikt om RAM te maken. RAM is vaak ingedeeld in een raster, met draden die in twee richtingen gaan:
De decoders nemen een binaire ingang en schakelen de corresponderende genummerde draad in. "11" is bijvoorbeeld 3 in binair, het hoogste 2-bits getal, dus de decoder schakelt de hoogste draad in. Bij elk kruispunt is er een register. Deze zijn allemaal verbonden met de centrale bus en met een centrale schrijf- en leesingang. Zowel de lees- als de schrijfinvoer worden alleen ingeschakeld als de twee draden die het register kruisen ook zijn ingeschakeld, waardoor u effectief het register kunt selecteren waaruit u wilt schrijven en lezen. Nogmaals, moderne RAM is veel gecompliceerder, maar deze opstelling werkt nog steeds.
De klok, de stepper en de decoder
Registers worden overal gebruikt en zijn het basistool voor het verplaatsen van gegevens en het opslaan van informatie in de CPU. Dus wat zegt hen om dingen te verplaatsen?
De klok is het eerste onderdeel in de kern van de CPU en wordt in- en uitgeschakeld met een ingesteld interval, gemeten in hertz, of cycli per seconde. Dit is de snelheid die u naast CPU's ziet staan; een 5 GHz-chip kan 5 miljard cycli per seconde uitvoeren. Kloksnelheid is vaak een zeer goede maatstaf voor hoe snel een CPU is.
De klok heeft drie verschillende statussen: de basisklok, de activeringsklok en de ingestelde klok. De basisklok staat een halve cyclus aan en de andere helft uit. De activeringsklok wordt gebruikt om registers in te schakelen en moet langer aanstaan om ervoor te zorgen dat de gegevens zijn ingeschakeld. De ingestelde klok moet altijd op hetzelfde moment zijn ingeschakeld als de activeringsklok, anders kunnen er onjuiste gegevens worden geschreven.
De klok is verbonden met de stepper, die telt van één tot de maximale stap, en zichzelf terugzet naar één als het klaar is. De klok is ook verbonden met EN-poorten voor elk register waarnaar de CPU kan schrijven:
Deze EN-poorten zijn ook verbonden met de uitgang van een andere component, de instructiedecoder. De instructiedecoder neemt een instructie zoals "SET R2 TO R1" en decodeert deze in iets dat de CPU kan begrijpen. Het heeft zijn eigen interne register, het "Instructieregister" genaamd, waarin de huidige bewerking wordt opgeslagen. Hoe dit precies gebeurt, hangt af van het systeem waarop u werkt, maar als het eenmaal is gedecodeerd, wordt de juiste set ingeschakeld en worden bits voor de juiste registers ingeschakeld, die worden geactiveerd in overeenstemming met de klok.
Programma-instructies worden opgeslagen in RAM (of L1-cache op moderne systemen, dichter bij de CPU). Omdat programmagegevens in registers worden opgeslagen, net als elke andere variabele, kunnen ze direct worden gemanipuleerd om door het programma te springen. Dit is hoe programma's hun structuur krijgen, met loops en if-statements. Een spronginstructie stelt de huidige locatie in het geheugen in waarvan de instructiedecoder aan het lezen is naar een andere locatie.
Hoe het allemaal samenkomt
Nu is onze grove oversimplificatie van hoe een CPU werkt, voltooid. De hoofdbus omvat het hele systeem en is verbonden met alle registers. De volledige optellers, samen met een heleboel andere bewerkingen, worden verpakt in de rekenkundige logische eenheid of de ALU. Deze ALU heeft verbindingen met de bus en heeft ook zijn eigen registers voor het opslaan van het tweede nummer waarop het werkt.
Om een berekening uit te voeren, worden programmagegevens vanuit het systeem-RAM in de besturingssectie geladen. De besturingssectie leest twee nummers uit de RAM, laadt de eerste in het instructieregister van de ALU en laadt vervolgens de tweede op de bus. Ondertussen stuurt het de ALU een instructiecode die hem vertelt wat hij moet doen. De ALU voert vervolgens alle berekeningen uit en slaat het resultaat op in een ander register, waaruit de CPU kan lezen en vervolgens het proces kan voortzetten.
Afbeelding tegoed: Rost9 / Shutterstock