Inizierò dal livello più basso che potrebbe essere rilevante (posso partire da un livello anche più basso, ma probabilmente sono troppo irrilevanti), a partire da Atom, per elettricità, per transistor, per porte logiche, per circuiti integrati (chip / CPU ) e termina in Assemblea (suppongo che tu abbia familiarità con i livelli più alti).
All'inizio
Atomo
L'atomo è una struttura composta da elettroni, protoni e neutroni (che a loro volta sono composti da particelle elementari ). La parte più interessante dell'atomo per computer ed elettronica sono gli elettroni perché gli elettroni sono mobili (cioè possono muoversi relativamente facilmente, a differenza dei protoni e dei neutroni che sono più difficili da spostare) e possono fluttuare da soli senza essere tenuti all'interno un atomo.
Di solito, ogni atomo ha lo stesso numero di protoni ed elettroni, chiamiamo questo stato "neutro". Come accade, è possibile che un atomo perda o guadagni elettroni extra. Si dice che gli atomi in questo stato sbilanciato siano rispettivamente atomi "caricati positivamente" (più protoni degli elettroni) e atomi "caricati negativamente" (più elettroni che protoni).
Gli elettroni sono indistruttibili e indistruttibili (non così nella meccanica quantistica, ma questo è irrilevante per il nostro scopo); quindi se un atomo perde un elettrone, alcuni altri atomi nelle vicinanze dovevano ricevere gli elettroni extra o l'elettrone doveva liberarsi in un elettrone fluttuante libero, al contrario, poiché l'elettrone non è ricostruibile, per ottenere un elettrone in più, un atomo doveva eliminarlo dagli atomi vicini o da un elettrone fluttuante libero. La meccanica degli elettroni è tale che se c'è un atomo con carica negativa vicino a un atomo con carica positiva, alcuni elettroni migreranno fino a quando entrambi gli atomi avranno la stessa carica.
elettricità
L'elettricità è solo un flusso di elettroni da un'area con un numero molto alto di atomi con carica negativa verso un'area con un numero molto alto di atomi con carica positiva. Alcune reazioni chimiche possono creare una situazione in cui abbiamo un nodo con molti atomi con carica negativa (chiamato "anodo") e un altro nodo con molti atomi con carica positiva (chiamato "catodo"). Se colleghiamo due nodi caricati in modo opposto con un filo, le masse di elettroni fluiranno dall'anodo al catodo e questo flusso è ciò che chiamiamo "corrente elettrica".
Non tutti i fili possono trasmettere elettroni allo stesso modo facilmente, gli elettroni fluiscono molto facilmente nei materiali "conduttori" che nei materiali "resistenti". Un materiale "conduttore" ha una bassa resistenza elettrica (ad es. Fili di rame nei cavi) e un materiale "resistente" ha un'alta resistenza elettrica (ad es. Isolamento di cavi in gomma). Alcuni materiali interessanti sono chiamati semiconduttori (ad esempio siliconi), perché possono alterare facilmente la loro resistenza, in determinate condizioni un semiconduttore potrebbe agire da conduttore e in altre condizioni potrebbe trasformarsi in un resistore.
L'elettricità preferisce sempre fluire attraverso il materiale con meno resistenza, quindi se un catodo e un anodo sono collegati con due fili, uno con resistenza molto alta e l'altro con resistenza molto bassa, la maggior parte degli elettroni scorrerà attraverso il cavo a bassa resistenza e quasi nessuno scorre attraverso il materiale ad alta resistenza.
Il Medioevo
Interruttori e transistor
Interruttori / Flip-Flop sono come i tuoi normali interruttori della luce, un interruttore può essere posizionato tra due pezzi di filo per interrompere e / o ripristinare il flusso di elettricità. I transistor funzionano esattamente come un interruttore della luce, tranne per il fatto che invece di collegare e scollegare fisicamente i fili, un transistor collega / disconnette il flusso di elettricità alterando la sua resistenza a seconda che ci sia elettricità nel nodo di base e, come avresti potuto immaginare / so, i transistor sono realizzati da semiconduttori perché possiamo alterare i semiconduttori per diventare un resistore o un conduttore per collegare o scollegare le correnti elettriche.
Un tipo comune di transistor, il transistor di giunzione bipolare NPN (BJT), ha tre nodi: "base", "collettore" ed "emettitore". In un BJT NPN, l'elettricità può fluire dal nodo "emettitore" al nodo "collettore" solo quando è caricato il nodo "base". Quando il nodo base non è carico, praticamente nessun elettrone può fluire attraverso e quando il nodo base è carico, allora gli elettroni possono fluire tra l'emettitore e il collettore.
Il comportamento di un transistor
(Consiglio vivamente di leggere tutto questo prima di continuare, poiché può spiegare meglio di me con la grafica interattiva)
Supponiamo di avere un transistor collegato a una fonte elettrica alla base e al collettore, quindi colleghiamo un cavo di uscita vicino al collettore (vedere la Figura 3 in http://www.spsu.edu/cs/faculty/bbrown/web_lectures / transistor / ).
Quando applichiamo l'elettricità né alla base né al collettore, allora l'elettricità non può fluire affatto poiché non c'è elettricità di cui parlare:
B C | E O
0 0 | 0 0
Quando applichiamo elettricità al collettore ma non alla base, l'elettricità non può fluire verso l'emettitore poiché la base diventa un materiale ad alta resistenza, quindi l'elettricità sfugge al filo di uscita:
B C | E O
0 1 | 0 1
Quando applichiamo elettricità alla base ma non al collettore, anche l'elettricità non può fluire poiché non vi è alcuna differenza di carica tra il collettore e l'emettitore:
B C | E O
1 0 | 0 0
Quando applichiamo elettricità sia alla base che al collettore, otteniamo elettricità che fluisce attraverso il transistor, ma poiché il transistor ha ora una resistenza inferiore rispetto al filo di uscita, quasi nessun flusso di elettricità passa attraverso il filo di uscita:
B C | E O
1 1 | 1 O
Porte logiche
Quando colleghiamo l'emettitore di un transistor (E1) al collettore di un altro transistor (C2) e quindi colleghiamo un'uscita vicino alla base del primo transistor (O) (vedere la Figura 4 in http://www.spsu.edu / cs / faculty / bbrown / web_lectures / transistors / ), quindi succede qualcosa di interessante. Diciamo anche che applichiamo sempre elettricità al collettore del primo transistor (C1) e quindi giochiamo solo con i nodi di base dei transistor (B1, B2):
B1 B2 C1 E1/C2 | E2 O
----------------------+----------
0 0 1 0 | 0 1
0 1 1 0 | 0 1
1 0 1 0 | 0 1
1 1 1 1 | 1 0
Riassumiamo la tabella in modo da vedere solo B1, B2 e O:
B1 B2 | O
---------+-----
0 0 | 1
0 1 | 1
1 0 | 1
1 1 | 0
Ecco , se hai familiarità con Boolean Logic e / o Logic Gates, dovresti notare che questa è esattamente la porta NAND. E se hai familiarità con Boolean Logic e / o Logic Gates potresti anche sapere che una NAND (così come NOR) è funzionalmente completa , cioè usando solo NAND, puoi costruire tutte le altre porte logiche e il resto della verità tabelle. In altre parole, è possibile progettare un intero chip di computer utilizzando solo porte NAND.
In effetti, la maggior parte delle CPU sono (o è usata per essere?) Progettate utilizzando NAND solo poiché è più economica da produrre rispetto all'utilizzo di una combinazione di NAND, NOR, AND, OR, ecc.
Derivare gli altri operatori booleani dalla NAND
Non descriverei come rendere tutti gli operatori booleani, solo il NOT e il AND gate, puoi trovare il resto da qualche altra parte.
Dato un operatore NAND, allora possiamo costruire un gate NOT:
Given one input B
O = NAND(B, B)
Output O
Dato un operatore NAND e NOT, allora possiamo costruire un gate AND:
Given two inputs B1, B2
C = NAND(B1, B2)
O = NOT(C) // or NAND(C,C)
Output O
Possiamo costruire altre porte logiche in modo simile. Poiché la porta NAND è funzionalmente completa , è anche possibile costruire porte logiche con più di 2 ingressi e più di 1 uscita, non ho intenzione di discutere qui come costruire tali porte logiche.
Età dell'Illuminismo
Costruire una macchina di Turing da Boolean Gates
Una CPU è solo una versione più complicata di una Turing Machine. I registri della CPU sono lo stato interno della Turing Machine e la RAM è un nastro della Turing Machine.
Una macchina di Turing (CPU) può fare tre cose:
- leggere uno 0 o 1 dal nastro (leggere una cella di memoria dalla RAM)
- cambia il suo stato interno (cambia i suoi registri)
- sposta a sinistra o a destra (leggi più posizioni dalla RAM)
- scrivere uno 0 o 1 sul nastro (scrivere su una cella di memoria nella RAM)
Per il nostro scopo, stiamo costruendo la Turing Machine a 2 simboli a 3 stati di Wolfram usando la logica combinatoria (le CPU moderne utilizzerebbero il microcodice, ma sono più complesse di quanto sia necessario per il nostro scopo).
La tabella di stato della macchina di Turing Wolfram (2,3) è la seguente:
A B
0 P1,R,B P2,L,A
1 P2,L,A P2,R,B
2 P1,L,A P0,R,A
Vogliamo ricodificare la tabella di stato sopra come tabella di verità:
Let I1,I2 be the input from the tape reader (0 = (0,0), 1 = (0,1), 2 = (1,0))
Let O1,O2 be the tape writer (symbol encoding same as I1,I2)
Let M be connected to the machine's motor (0 = move left, 1 = move right)
Let R be the machine's internal state (A = 0, B = 1)
(R(t) is the machine's internal state at timestep t, R(t+1) at timestep t+1)
(Note that we used two input and two outputs since this is a 3-symbol Turing machine.)
R 0 1
I1,I2
(0,0) (0,1),1,1 (1,0),0,0
(0,1) (1,0),0,0 (1,0),1,1
(1,0) (0,1),0,0 (0,0),1,0
The truth table for the state table above:
I1 I2 R(t) | O1 O2 M R(t+1)
-------------+--------------------
0 0 0 | 0 1 1 1
0 0 1 | 1 0 0 0
0 1 0 | 1 0 0 0
0 1 1 | 1 0 1 1
1 0 0 | 0 1 0 0
1 0 1 | 0 0 1 0
Non costruirò davvero un tale gate logico (non sono sicuro di come disegnarlo in SE e probabilmente sarà abbastanza enorme), ma poiché sappiamo che il gate NAND è funzionalmente completo , allora abbiamo un modo per trovare una serie di porte NAND che implementeranno questa tabella di verità.
Una proprietà importante di Turing Machine è che è possibile emulare un computer con programma memorizzato utilizzando una macchina Turing che ha solo una tabella di stati fissa. Pertanto, qualsiasi Universal Turing Machine può leggere il suo programma dal nastro (RAM) invece di dover codificare le istruzioni nella tabella di stato interna. In altre parole, la nostra (2,3) Turing Machine può leggere le sue istruzioni dai pin I1, I2 (come software) invece di essere hardcoded nell'implementazione della porta logica (come hardware).
microcodici
A causa della crescente complessità delle moderne CPU, diventa proibitivamente difficile utilizzare la sola logica combinatoria per progettare un'intera CPU. La CPU moderna è di solito progettata come interprete di istruzioni di microcodici; un microcodice è un piccolo programma incorporato nella CPU che viene utilizzato dalla CPU per interpretare il codice macchina effettivo. Questo stesso interprete di microcodici è generalmente progettato usando la logica combinatoria.
Register, Cache e RAM
Abbiamo dimenticato qualcosa sopra. Come ricordiamo qualcosa? Come implementiamo il nastro e la RAM? La risposta è in un componente elettronico chiamato condensatore. Un condensatore è come una batteria ricaricabile, se viene caricato un condensatore manterrà elettroni extra e può anche restituire elettroni ai circuiti.
Per scrivere su un condensatore, riempiamo il condensatore di elettrone (scrivi 1) o dreniamo tutti gli elettroni nel condensatore fino a quando non è vuoto (scrivi 0). Per leggere il valore di un condensatore, proviamo a scaricarlo. Se, quando proviamo a scaricare, non c'è elettricità che scorre, allora il condensatore è vuoto (leggi 0), ma se rileviamo elettricità, allora il condensatore deve essere caricato (leggi 1). Potresti notare che la lettura di un condensatore esaurisce il suo deposito di elettroni, le moderne RAM hanno i circuiti per ricaricare periodicamente il condensatore in modo che possano conservare la loro memoria finché c'è elettricità.
Esistono diversi tipi di condensatori utilizzati in una CPU, i registri della CPU e le cache CPU di livello superiore sono realizzate utilizzando "condensatori" ad altissima velocità che sono effettivamente costruiti da transistor (quindi non c'è quasi nessun "ritardo" da cui leggere / scrivere) loro), questi sono chiamati RAM statica (SRAM); mentre la RAM della memoria principale viene prodotta utilizzando una potenza inferiore, ma condensatori più lenti e molto più economici, questi vengono chiamati RAM dinamica (DRAM).
Orologio
Un componente molto importante di una CPU è l'orologio. Un orologio è un componente che "spunta" regolarmente per sincronizzare l'elaborazione. Un orologio in genere contiene un quarzo o altri materiali con periodo di oscillazione noto e relativamente costante, e i circuiti di clock mantengono e misurano questa oscillazione per mantenere il suo senso del tempo.
Le operazioni della CPU vengono eseguite tra i tick di clock e read / write vengono eseguiti nei tick per garantire che tutti i componenti si muovano in modo sincrono e non si calpestino l'uno con l'altro mentre si trovano in stati intermedi. Nella nostra (2,3) Turing Machine, tra le ticchettature dell'orologio l'elettricità passa attraverso le porte logiche per calcolare l'uscita dall'ingresso (I1, I2, R (t)); e nei segni di spunta dell'orologio, il masterizzatore scriverà O1, O2 sul nastro, il motore si sposterà in base al valore di M e il registro interno viene scritto dal valore di R (t + 1), quindi il lettore di nastri leggerà il nastro corrente e caricherà I1, I2 e il registro interno verrà riletto su R (t).
Parlare con le periferiche
Notare come la (2,3) Turing Machine si interfaccia con il suo motore. Questa è una visione molto semplificata di come una CPU può interfacciarsi con un hardware arbitrario. L'hardware arbitrario può ascoltare o scrivere su un filo specifico per ingressi / uscite. Nel caso della (2,3) Turing Machine, la sua interfaccia con il motore è solo un singolo filo che indica al motore di girare in senso orario o antiorario.
Ciò che non viene detto in questa macchina è che il motore doveva avere un altro "orologio" che funziona in sincronia con l '"orologio" interno della Macchina per sapere quando avviare e interrompere il funzionamento, quindi questo è un esempio di una trasmissione di dati sincrona . L'altra alternativa comunemente usata, la trasmissione asincrona utilizza un altro filo, chiamato linea di interruzione, per comunicare i punti di sincronizzazione tra la CPU e il dispositivo asincrono.
Era digitale
Codice macchina e assemblaggio
Il linguaggio assembly è un mnemonico leggibile dall'uomo per i codici macchina. Nel caso più semplice, esiste un mapping uno a uno tra assembly e codice macchina; sebbene nei moderni linguaggi di assemblaggio alcune istruzioni possano essere associate a più codici operativi.
Linguaggio di programmazione
Conosciamo tutti questo no?
Uff, finalmente finito, ho digitato tutto questo in sole 4 ore, quindi sono sicuro che c'è un errore da qualche parte (sono principalmente un programmatore, non un ingegnere elettrico né fisici, quindi potrebbero esserci diverse cose che sono palesemente sbagliate). Per favore, se hai trovato un errore, non esitare a dare un @yell o risolverlo tu stesso se hai il rappresentante o crei una risposta complementare.