Koyote ha scritto:
+m2+ ha scritto:
Per inciso: non serve una quantità enorme, gigantesca, di transistor (diciamo "mattoncini") per "costruire" una CPU.
Per avere un'idea il mitico 6502 http://www.visual6502.org/docs/6502_in_action_14_web.pdf ne ha circa 3.500, e con questo ci puoi fare un Commodore 64, che essenzialmente esegue qualsiasi cosa faccia un PC moderno.
Conoscevo l'esistenza del not, or ecc... però cosa determina dove far passare la corrente?
Le connessioni, diciamo i "filini" che connettono i vari componenti elementari.
Se immagini di avere dei componenti grandi come un mattoncino lego, dovrai collegare ingressi ed uscite mediante veri e propri "filini" (... praticamente una basetta millefori concettuale...)
Quindi avrai tanti (decine-migliaia-milioni-miliardi) "mattoncini" connessi tra di loro mediante decine-migliaia-milioni-miliardi di "filini" (... oddio... mi viene in mente il Rag. Filini...).
Se osservi le fotografie della CPU che ti ho messo vedrai proprio questi "filini" che connettono i vari componenti, e ne vedrai a migliaia e migliaia (miliardi nelle CPU moderne).
Il "cablaggio", cioè la disposizione dei "filini" è parte integrante del progetto: tanti "mattoncini" collegati tra di loro in un modo specifico.
La "chiave" per l'ulteriore passo, nella costruzione logica di una CPU, sono i "cicli", cioè mettere un "filino" di OUTPUT di un componente in INPUT a un altro, creando in sostanza uno (o più) cicli.
Chiaramente non è affatto detto che una rete del genere converga a un valore stabile, anzi potrebbe switchare tra stati diversi, comunque non complichiamo il problema.
---
Una volta che hai i due mattoncini NOT e AND (oppure NOT e OR, oppure NAND o NOR...) inizi a collegarli tra di loro in modo "furbo" per ottenere "mattoncini" più utili, quali ad esempio un flip flop.
Diciamo "una cella di memoria" per banalizzare.
Si ottiene cablando "furbamente" i componenti elementari per creare una mini-rete sequenziale (SEQUENZIALE ti ricordo significa alla grossa "il cui stato dipende dal tempo").
Ancor più "furbescamente" si usano normalmente flip flop sincronizzati, cioè con un segnale di clock.
-----------
Minidigressione elementare sulle reti sequenziali.
Una rete combinatoria, cioè alla grossa priva di cicli nei "cablaggi", elabora un certo numero di segnali in ingresso e ne fornisce un certo numero in uscita in modo "immediato".
O meglio secondo il ritardo di propagazione ed elaborazione dei mattoncini stessi.
Una rete sequenziale (sempre alla grossa con "cicli nei cablaggi", cioè dove l'OUTPUT dei mattoncini viene cablato nell'INPUT) invece è una sorta di vero e proprio "computerino".
Metti i dati in input, poi la rete "elabora" i dati (facendo una sorta di cicli WHILE, almeno concettuali) e poi dopo un po', se hai fortuna, dà il risultato in output.
Avendo dei cicli (sempre concettualmente dei WHILE) potrebbe anche non fermarsi mai, oppure avere tempi di elaborazione diversi per diversi input (perchè in un caso magari esegue un WHILE 3 volte, mentre in un altro per 7 volte eccetera).
Per evitare questa "anarchia", cioè ogni rete impiega un tempo non noto a priori (o meglio difficilmente predicibile, e dipendente dall'input) si introduce il mitico segnale di CLOCK (ne avrai sicuramente sentito parlare, tipo i7 a 4GHZ significa "con clock a 4GHZ" ---- cuttone su cosa significhi davvero sennò facciamo notte ----)
Ebbene in sostanza i mattoncini, oltre ad avere i loro input e output, hanno un ulteriore input, il CLOCK (CK), il quale funge come una sorta di metronomo: l'elaborazione avviene sincronizzata ad esso, per un numero intero di cicli (in realtà in elettronica ciò è impossibile si usano || e vabbè).
Più semplicemente: un tuo "mattoncino" può elaborare "qualcosa" per 1 ciclo di clock, 2 cicli, 1.000 cicli.
Non può farlo per 1,5 cicli.
Nel caso dei flip flop, cioè del "mattoncino elementare di memoria", insomma un BIT, adottando un CLOCK sarai sicuro che il relativo circuitino si stabilizzerà, al cambiamento del dato in ingresso, in un tempo di K cicli di CLOCK.
Se per caratteristiche costruttive il tuo BIT impiega (poniamo) al massimo 3 cicli di CLOCK per stabilizzarsi, nel tuo progetto della CPU farai in modo che quando "cambi" il contenuto del BIT aspetterai esattamente 3 cicli per essere sicuro che il dato sia stato memorizzato effettivamente.
Se aspettassi 2 cicli potresti avere (in questo banale esempio) una memoria corrotta
--------
L'elemento di importanza superbasilare è che la creazione di celle di memoria, attraverso tipicamente mattoncini NAND, NOR (o quello che vuoi) consente di fare il "passo finale", cioè di memorizzare il PROGRAMMA da eseguire all'interno della macchina stessa.
Una rete combinatoria o sequenziale è CABLATA, cioè i "filini" hanno una posizione ben definita, non li puoi spostare (nei vecchissimi film in bianco e nero si vedono invece i primissimi computer dove i "filini" erano veri, e si spostavano fisicamente per programmare!).
Non puoi cambiare il funzionamento di una CPU.
MA se hai a disposizione una zona di RAM, puoi memorizzare il programma lì dentro, e farlo eseguire.
Hai fatto una macchina di turing a nastro limitato, o se preferisci un computer digitale "moderno".
-----
Altro superincisone: hai mai considerato che esiste un numero finito, cioè proprio un insieme non solo ricorsivamente enumerabile, ma proprio finito, di programmi che puoi eseguire su un computer moderno?
Fine superincisone.
-----
--------
Metti insieme migliaia di "flip flop" e hai fatto un KB di RAM (sempre in versione supersemplificata!)
Ne metti miliardi e fai un banco DIMM
Sempre in linea teorica ci sono degli elementi ricorrenti che sono "ben" conosciuti.
Le celle di memoria (flip flop), i registri della CPU ad esempio, sono composti da tanti "sottoreti" identiche.
Poi ci sono gli addizionatori, cioè le retine logiche utilizzate per SOMMARE i numeri binari