30 / 01 / 2025
Oggi vi spiego con che progetto mi sono diplomato un anno fa’ e di come fosse un disastro perfetto.
Dagli articoli presenti sul sito si deduce cosa e’ che mi piace e queste passioni le ho sempre continuate ad espandere con l’obiettivo di continuare sempre ad imparare cose nuove, di migliorare la mia comprensione in un determinato ambito che mi interessa. Ecco da studente prima e da persona libera adesso questa cosa non e’ mai sparita, anzi e’ stata amplificata da continui progetti di elettronica ed informatica che volutamente erano delle sfide non alla mia pari, perche’ forzatamente io volevo imparare anche se questo avrebbe richiesto uno sforzo molto piu’ elevato. Sono del parere che l’unico modo per imparare qualcosa e’ soltanto quello di mettersi in gioco per provarla, ovvero applicare quello che si legge in giro per testi o ricerche per arrivare ad un livello di comprensione piu’ elevato.
Partendo da questo presupposto vi introduco uno dei progetti piu’ grandi e meglio riusciti in cui mi sono cimentato e che ho usato come presentazione di me stesso durante l’esame per il diploma: una cpu completa e funzionante.
Per ovvie ragioni dovute a costi e possibili fallimenti io questo circuito non l’ho mai potuto adattare e ricreare nella realta’, anche perche’ da simulazione a circuito c’e’ una bella differenza. L’ho sviluppato completamente su un software adatto a simulare circuiti logici di qualsiasi tipo, sequenziali e combinatori, che mi permetteva di avere una simulazione in tempo reale di qualsiasi cosa avessi mai voluto costruire, anche cose molto complesse.
Non e’ un qualcosa che dall’oggi al domani mi sono messo a fare. Quello che vedrete nello showcase e’ frutto di circa 2 anni e mezzo di ricerca da quando avevo 16 anni per comprendere fino al midollo il funzionamento di una cpu, e spesso quel processo di studio che ho seguito e che mi sono costruito e’ andato piu’ in profondita’ rispetto a quello che in questo momento sto’ studiando all’universita’ come materia dedicata, e assieme a quello ho alternato lo studio dell’elettronica portato avanti anche dalla scuola per poter comprendere al meglio i processi fisici che costituiscono i circuiti logici e analogici.
Tutto questo tempo pero’ sia chiaro non l’ho speso con l’obiettivo di realizzare un progetto o di fare il brillante durante una commissione d’esame, io questo l’ho fatto per la mia sola e unica curiosita’, semplicemente la conoscenza che avevo acquisito mi e’ tornata utile nel momento e luogo adatto. Questa e’ sempre stata la mia visione dello studio che mi e’ stata trasmessa dalla mia famiglia e che io continuero’ sempre a portare avanti, perche’ studiare non vuol dire dipendere dallo studio, averlo come priorita’ o averlo come ragione di vita, quello che io penso dello studio in generale in qualsiasi circostanza e’ sempre quello di accontentare la propria fame di conoscenza e curiosita’, in sostanza non studiare perche’ ti serve per campare un domani ma bensi’ perche’ ti interessa qualcosa e vuoi imparare a comprenderla meglio.
Messa sotto questo punto di vista possono sembrare due facce della stessa medaglia, ma sono profondamente diversi come sostanza perche’ la differenza sta’ nel come si vivra’ la propria vita e il proprio rapporto con il lavoro e hobby alternativi, che possono essere tranquillamente derivati da cosa si e’ appassionati a studiare. Mi rendo conto che come concetto e’ banale se uno ci pensa un attimo e si stacca dalla vita frenetica di oggi, ma vedo che spesso in molti dimenticano principi semplici e a mio avviso scontati come questo, e le istituzioni scolastiche in genere non aiutano ed anzi ammazzano questo modo di pensare.
Chiusa questa parentesi lunga che comunque avevo intenzione di esternare un giorno, vi spiego perche’ quello che ho creato si puo’ definire un disastro perfetto. Avevo intenzione di realizzare una cpu che potesse supportare programmi e software gia’ presenti sul mercato, quindi con un set di istruzioni gia’ conosciuto di cui esistono diversi Assembler e compilatori. Quindi con questo obiettivo in merito inizio verso la fine della quarta superiore ad interessarmi piu’ di quanto avessi mai fatto a Commodore e nello specifico alle cpu sulle quali venivano basati i loro sistemi integrati. E’ stata ampliamente usata la famiglia di cpu MOS 6502 ed ha avuto un impatto storico incredibile sul mondo dei personal computer a basso costo con comunque prestazioni decenti.
Il 6502 e versioni successive come il 6510 sono basate su un set di istruzioni RISC a differenza dei principali competitor dell’epoca come Intel che basava i propri prodotti su set di istruzioni CISC, ed il vantaggio di avere un set ridotto per una cpu casalinga stava nel fatto di poter essere piu’ semplice a livello di circuito, con consumi piu’ bassi e frequenze alle volte piu’ alte, ma soprattutto con l’incredibile vantaggio di poter eseguire le stesse funzioni di un set CISC combinando istruzioni piu’ semplici di un set RISC, quindi arrivando a essere completamente alla pari avendo pero’ il vantaggio della velocita’ maggiore e della semplicita’.
Basare una cpu fatta in casa su un set semplice da integrare e da programmare, gia’ presente sul mercato e soprattutto conosciuto da anni era l’idea perfetta.
Sono partito come prima cosa con il definire il circuito per l’unita’ di controllo. Iniziare a definire la struttura che controllera’ tutti i componenti della cpu e’ importante perche’ mi fornisce gia’ un layer di astrazione tra la componentistica e il programmatore ( ovvero me ). La funzione di una C.U. semplice come quella che ho realizzato consisteva dato un input equivalente all’istruzione, allo step di quella istruzione e ai flag di stato mi restituiva un output che abilitava o disabilitava funzioni specifiche di tutti i componenti della cpu, come aprire un buffer o scrivere un registro. Avere questo tipo di astrazione mi ha permesso di sviluppare un software che mi avrebbe aiutato a programmare la C.U. e a debuggarla facilmente. Grazie a questo “compilatore” ( che alla fine e’ piu’ un parser ) sono riuscito a classificare le 4 sezioni principali di controllo per ogni step di istruzione. E queste 4 sezioni non erano solo una separazione software che mi tornava comodo dalla parte della programmazione, era anche il design fisico della C.U. che avevo realizzato che era formata appunto da 4 ROM e 4 decoder per controllare pe 4 sezioni della CPU ovvero registri, alu, program counter e stack pointer ed infine i buffer principali ed il fetch delle nuove istruzioni.
L’usare un design semplice come questo ha reso il debug di tutta l’unita’ di controllo una roba incredibilmente semplice perche’, in caso di problemi di esecuzione perche’ avevo programmato male un’istruzione, io sapevo sempre dove andare a controllare per verificare se era un problema hardware o software ed intervenire in tempi brevissimi. Questa scorciatoia mi ha permesso di programmare tutta la CPU con il set di istruzioni completo, i salti condizionali basati sul registro di stato, gli interrupt e i salti a funzione con puntatore di ritorno in meno di 3 mesi e con tutto il circuito ci sono voluti 4 mesi effettivi di lavoro a tempo pieno, in primis perche’ avevo anche la scuola a cui badare ed anche perche’ era la prima volta che realizzavo un circuito tanto complesso.
Ma perche’ sarebbe un disastro perfetto?
La risposta e’ semplice: perche’ il circuito e’ pieno di toppe da ogni parte.
Ovviamente non e’ andato tutto bene senza errori, spesso per problemi relativi alla sincronizzazione con il ciclo di clock alcuni dati o il program counter con venivano aggiornati come dovevano, avvolte i salti soprattutto quelli condizionali non saltavano sempre alla location desiderata, avvolte la gestione del puntatore di ritorno del salto ad una funzione veniva sovrascritto dentro lo stack, avvolte lo stack proprio non funzionava, il fetch avveniva con un ciclo di ritardo oppure avveniva ma veniva saltato lo step di inizializzazione dell’istruzione sempre per problemi relativi al ritardo … e molti molti altri problemi, ed ancora non ho parlato del casino per far funzionare bene la logica di interrupt che mi ha fatto dannare da quanto male funzionava, per non parlare del fatto che ho continuato man mano che aggiungevo istruzioni con indirizzamenti diversi ad aumentare i segnali di controllo perche’ non erano mai abbastanza.
Totale nulla era andato bene da subito ma questo e’ normale quando si tratta di ingegnerizzare qualcosa, e l’accumularsi di problemi mi ha sempre spinto a proseguire risolvendo e migliorando il circuito, e grazie a dio che avevo il parser per programmare la C.U. altrimenti stavo ancora qui a programmare da quanto buggata era la prima versione della CPU. Ma alla fine e’ andato tutto per il meglio.
La CPU e’ sincronizzata solo sul fronte di salita del clock, il che la rende piu’ lenta rispetto al 6502 originare richiedendo quasi il doppio dei cicli di clock a parita’ di istruzione, e a livello di prestazioni crude si avvicina di piu’ ad uno Z80 che pero’ ha un set di istruzione CISC, ma le prestazioni non erano la mia priorita’, anche se piu’ lenta questa CPU custom funzionava alla perfezione ed ho speso circa un altro mese dopo averla finita a scrivere dei programmi nell’Assembly di MOS Tech per vedere cosa si poteva fare, e ragazzi vedere una propria creazione che semplicemente funziona come volevi tu ti da’ una sensazione inimmaginabile. Per questo ho realizzato dei video che dimostrano come funziona questa CPU eseguendo programmini per testare la maggior parte delle istruzioni simultaneamente, anche quelle di salto a subroutine con indirizzo di ritorno.
Quindi vi lascio dopo questo wall-of-text con lo showcase mentre noi ci sentiamo con il prossimo articolo: