Un circuito sequenziale accetta i dati in ingresso quando il segnale di clock è alto e li trasferisce all'uscita quando il segnale di clock scende. In altre parole, il flip-flop Master-Slave JK è un dispositivo "sincrono", poiché i dati vengono passati solo in base al tempismo del segnale di clock. I flip-flop Master-Slave devono normalmente essere configurati utilizzando due flip-flop SR separati, come nel caso del 7473. Fortunatamente, esistono diversi chip con due flip-flop, come il 7467, il 7473, il 74-107, il 74-110, il 74-111, e il CMOS 4027.
Contatori digitali
I contatori digitali e i registri di scorrimento possono essere progettati concatenando flip-flop. Questi possono funzionare in modo asincrono o sincrono.
Contatori asincroni
I contatori asincroni sono semplici concatenazioni di flip-flop in modalità toggle, che vengono attivati uno dopo l'altro. In altre parole, l'uscita Q (o Q) di uno stadio produce il segnale di clock per il successivo stadio e così via. Sebbene i segnali del contatore generato siano simmetrici, il primo impulso di clock mostrato nella Figura 3.15 non lo è. Tuttavia, questo non rappresenta un problema, poiché solo i bordi del segnale (salita o discesa) sono importanti. Nel caso mostrato, il bordo di salita del clock commuta il primo flip-flop. Da quel momento in poi, grazie agli ingressi di clock invertiti, i successivi flip-flop vengono attivati dal bordo di discesa. Gli output sono sotto forma di numeri binari (nel caso illustrato, 4 bit). Invece di utilizzare flip-flop attivati dal bordo di discesa, si potrebbero utilizzare flip-flop attivati dal bordo di salita, alimentati dagli output Q. La differenza tra un contatore "up" e un contatore "down" dipende dagli output scelti. Gli output Q forniscono un conteggio in aumento, mentre il conteggio in diminuzione è fornito dagli output Q (Figura 3.16).
In un contatore asincrono, nulla cambia da uno stato all’altro in tempo nullo. È evidente che il ritardo di propagazione di ogni stadio si accumulerà man mano che il contatore progredisce (Figura 3.17). Per questo motivo, è preferibile un design sincrono.
Contatori sincroni
Come indicato, il principale problema dei contatori asincroni è il ritardo di propagazione. Questo problema viene superato sincronizzando i flip-flop in modo che tutti i cambiamenti avvengano simultaneamente, e non uno dopo l’altro. Tuttavia, non è così semplice come potrebbe sembrare. Si potrebbe pensare che basta aggiungere flip-flop insieme e alimentarli tutti con lo stesso segnale di clock simultaneamente per ottenere un contatore sincrono. Purtroppo, questa è una concezione errata, come viene dimostrato con un semplice esempio di contatore a 3 bit nella Figura 3.18.
Nell'esempio si può notare che, sebbene i primi due treni di bit siano corretti, il terzo è errato. Ciò è dovuto al fatto che Qc cambia troppo presto, poiché a quel punto JKc = 1 (Tabella 3.2). È chiaro che è necessaria un'ulteriore logica. Assicurandosi che sia Qa = 1 che Qb = 1 prima che Qc possa essere commutato, viene generata la sequenza corretta, come mostrato nella Figura 3.19. Ovviamente, questa tecnica può essere estesa a contatori più grandi, come nel caso del contatore a 4 bit della Figura 3.20. Come i contatori asincroni, anche quelli sincroni possono contare in aumento o in diminuzione. Si tratta solo di scegliere gli output appropriati. Nel design mostrato di seguito, viene utilizzata una logica aggiuntiva e un ingresso Up/Down può essere usato per selezionare la modalità desiderata (Figura 3.21). Tali contatori possono essere estesi a un numero praticamente illimitato di bit. Un esempio di contatore sincrono a 4 bit è il 74F161A.
Contatori a anello
Oltre ai contatori in aumento e in diminuzione, esistono anche i contatori a "anello", che producono una sequenza ripetitiva di impulsi semisimetrici. Collegando una serie di flip-flop D insieme e restituendo l'output finale Q all’ingresso iniziale D, verranno generati una serie di impulsi singoli. L'ingresso Set sul primo flip-flop e gli ingressi Reset sui flip-flop successivi devono essere connessi per fornire un valore iniziale di 1, che successivamente "scorrerà" in un ciclo (Figura 3.22).
Un altro tipo comune di contatore è il contatore Johnson (detto anche contatore con codice termometro). In questo caso non è necessario impostare una condizione iniziale, poiché gli output Q e Q dell'ultimo flip-flop sono incrociati agli ingressi J e K del primo flip-flop (Figura 3.23). Questi contatori possono essere estesi a qualsiasi numero di bit richiesto.
Registri di scorrimento
I registri di scorrimento, come suggerisce il nome, sono insiemi di registri (flip-flop) che permettono a uno stato binario predeterminato di essere spostato in una direzione o nell'altra. Ci sono vari modi per configurare i registri di scorrimento: Serial In—Serial Out (SISO), Serial In—Parallel Out (SIPO), Parallel In—Serial Out (PISO) e Parallel In—Parallel Out (PIPO). Questi sono molto utili per spostare valori binari a sinistra (per la moltiplicazione) e a destra (per la divisione). Tipicamente, ogni stadio contiene un flip-flop D. I registri di scorrimento SIPO a 8 bit più comuni sono il 74LS395 e il 74LS164.
Ci sono due funzioni principali nei registri di scorrimento: SHIFT e ROLL. I bit possono essere spostati a sinistra o a destra e quelli che vengono spostati oltre l'ultimo stadio vengono persi. D'altra parte, i bit che vengono "rotolati" vengono reinseriti nell'ingresso del registro di scorrimento e continuano il ciclo. Questo costituisce una forma di memoria seriale. La capacità di eseguire il rollo porta al concetto di contatore a anello.
Generazione di impulsi di clock
Che si tratti di logica combinatoria o sequenziale, i ritardi temporali svolgono un ruolo fondamentale. Spesso indicato come ritardo di propagazione, ogni dispositivo ha un certo tempo necessario per cambiare stato. Questo problema può essere utilizzato anche con vantaggio. Un oscillatore non è altro che un amplificatore con retroazione che presenta una differenza di fase (ritardo temporale) tra i segnali di ingresso e uscita. Poiché i flip-flop e i latch più complessi sono attivati da impulsi di clock, è necessario un mezzo per generarli. Gli orologi possono essere facilmente costruiti utilizzando una serie di inverter (porte NOT). I cristalli di quarzo sono spesso utilizzati come circuiti risonanti, poiché sono molto stabili. Un semplice circuito RC potrebbe essere utilizzato, ma la frequenza di risonanza di questi circuiti tende a variare, soprattutto con i cambiamenti di temperatura.
La storia delle macchine da calcolo: dalle origini agli sviluppi fondamentali
Le prime macchine da calcolo meccaniche rappresentano uno dei capitoli più affascinanti nella storia della tecnologia, segnando il passaggio da semplici strumenti aritmetici a dispositivi in grado di eseguire operazioni complesse. La creazione di queste macchine è stata il frutto di intuizioni geniali di matematici e ingegneri che, a partire dai secoli XVII e XVIII, hanno posto le basi per lo sviluppo di calcolatori più evoluti.
Una delle prime macchine di calcolo note è quella ideata da Wilhelm Schickard nel 1623, una calcolatrice meccanica composta da ruote dentate numerate da 0 a 9, collegate tramite ingranaggi e cricchetti ponderati. Questa macchina era in grado di eseguire addizione e sottrazione e, sebbene non fosse perfetta, rappresentò un significativo passo avanti rispetto agli strumenti manuali utilizzati fino ad allora. Successivamente, la macchina venne affiancata da dispositivi simili, come quella proposta da Blaise Pascal, la famosa Pascalina, che utilizzava un sistema a ingranaggi per eseguire addizioni e sottrazioni.
Un altro grande nome nella storia delle macchine da calcolo è quello di Gottfried Wilhelm Leibniz. Nel 1673, Leibniz concepì una macchina capace di eseguire non solo addizione e sottrazione, ma anche moltiplicazione e divisione. La sua macchina aritmetica, purtroppo, venne realizzata solo nel 1694, e sebbene non fosse a conoscenza dei lavori di Schickard, il suo approccio rimase fondamentale per i successivi sviluppi. Leibniz concepì un meccanismo in grado di realizzare moltiplicazioni e divisioni tramite addizioni e sottrazioni successive, un concetto che avrebbe ispirato generazioni di inventori.
Con il passare dei decenni, i concetti sviluppati da Schickard, Pascal e Leibniz vennero ripresi e perfezionati da altri ingegneri e matematici. Tra i più importanti innovatori si annoverano Giovanni Poleni (1709), che utilizzò ingranaggi a denti variabili, Antonius Braun (1727) e Jacob Leupold (1727), che migliorarono e costruirono nuovi modelli. Nel 1770, Philipp Matthaus Hahn progettò una serie di macchine da calcolo che vennero ulteriormente sviluppate tra il 1774 e il 1820. In Inghilterra, Lord Stanhope costruì due calcolatori meccanici intorno al 1775, che rappresentarono un’importante innovazione per l'epoca.
Il passo successivo significativo venne compiuto nel 1820 dal francese Charles-Xavier Thomas de Colmar, che ideò l'Arithmometer, un calcolatore che combinava concetti simili a quelli di Leibniz ma con meccanismi migliorati. La macchina fu costantemente perfezionata negli anni successivi e rappresentò un punto di riferimento per l'industria del calcolo fino al secolo successivo. La sua macchina, infatti, divenne il primo esempio pratico di calcolatore che trovò una vasta applicazione commerciale, grazie anche alla sua affidabilità e robustezza.
A partire dal 1882, il russo Pafnuty Chebyshev propose un altro passo avanti significativo con la sua macchina da calcolo, che si distingueva per l’uso di un meccanismo epicycloide per il trasporto dei numeri. Questo sistema innovativo permetteva di rendere automatico il processo di moltiplicazione, migliorando notevolmente l’efficienza rispetto ai precedenti modelli. Con il miglioramento dei metodi di input, che divennero sempre più precisi e veloci, il calcolo meccanico divenne sempre più efficiente e meno dipendente dalla manualità dell'operatore.
L'introduzione della tastiera numerica, a metà del XIX secolo, rappresentò un’altra innovazione cruciale per la velocità e l’efficienza delle macchine da calcolo. Questa tastiera, simile a quella delle moderne macchine da scrivere, consentiva di inserire rapidamente i numeri, rendendo l’intero processo di calcolo più semplice e preciso. Questo sviluppo portò alla creazione di macchine come la "Adding and Listing Machine" di William S. Burroughs, nel 1885, che era anche dotata di un sistema di stampa. Nel contempo, il “Comptometer” di Dorr E. Felt (1893) rappresentò una svolta nella risoluzione del problema della stampa nelle macchine da calcolo.
Tuttavia, queste prime macchine, sebbene avanzate per l'epoca, non erano ancora programmabili. La vera e propria concezione di una macchina programmabile risale al lavoro di Charles Babbage. Il suo progetto del "Difference Engine", concepito nel 1822, rappresentò il primo passo verso la creazione di calcolatori automatici, ma purtroppo la macchina non venne mai completata durante la sua vita. La realizzazione della sua macchina, secondo i disegni originali, avvenne solo nel 2002, ben 153 anni dopo la sua ideazione. Il contributo fondamentale di Babbage fu il concetto di "programmazione", formalizzato dall'amica e collaboratrice Ada Lovelace, che scrisse il primo algoritmo destinato a essere eseguito da una macchina, anche se quest’ultima non esisteva ancora.
La memorizzazione dei dati, un elemento fondamentale in tutte le moderne macchine da calcolo, iniziò a svilupparsi con l’introduzione delle schede perforate, inizialmente utilizzate per programmare i telai automatici nel 1801 da Joseph-Marie Jacquard. Successivamente, nel 1890, Herman Hollerith portò le schede perforate nel mondo dei calcolatori, utilizzandole per elaborare i dati sensibili durante il censimento degli Stati Uniti. La carta perforata e il nastro perforato permisero una memorizzazione dei dati più efficiente rispetto ai metodi precedenti, ma avevano il limite di richiedere un accesso sequenziale ai dati. La vera e propria memoria a accesso casuale divenne possibile solo con lo sviluppo di dispositivi elettronici, come i relais elettromagnetici e i tubi a vuoto, che permisero la realizzazione di celle di memoria statiche e dinamiche.
La storia delle macchine da calcolo è strettamente legata all'evoluzione della tecnologia e al progresso dei metodi di input, immagazzinamento e processamento dei dati. Ogni passo avanti, che potrebbe sembrare un dettaglio, ha avuto un impatto profondo sulla possibilità di realizzare dispositivi più rapidi, versatili e, infine, programmabili. La progressiva automazione del calcolo ha aperto la strada a quella che oggi consideriamo la moderna informatica, culminando nell’era dei computer programmabili e delle macchine capaci di compiere operazioni sempre più complesse.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский