# Registri hardware

In elettronica digitale, e specialmente nell'elaborazione digitale, un registro hardware memorizza dei bit di informazione, in modo tale che tutti i bit vengono scritti, o letti, simultaneamente. I registri hardware che risiedono all'interno di una CPU (Central Processing Unit) sono denominati registri di processore. A corredo, sono presenti dei segnali provenienti da una macchina a stati e diretti al registro, che controllano quando quest'ultimo può trasmettere informazioni verso altri registri, o accettare informazioni da essi. A volte queste macchine a stato dirigono le informazioni provenienti da un registro attraverso una trasformazione funzionale, come ad esempio una unità di somma, o Adder (elettronica), e poi verso un altro registro che memorizza il risultato.
Gli utilizzi tipici di un registro hardware comprendono la configurazione e l'inizializzazione di determinate funzionalità, memorie di buffer, ad esempio quelle della memoria video delle schede grafiche, dispositivi di ingresso/uscita (I/O) di vario tipo, e registrazione dello stato della macchina, come quando si verifica uno specifico evento nell'hardware.
La lettura di registri hardware residenti nelle unità periferiche, in generale tutti i componenti hardware esterni alla CPU, comportano che l'accesso viene eseguito attraverso una tecnica di indirizzamento memory-mapped I/O - I/O mappato su indirizzi di memoria - oppure Port-mapped I/O - I/O mappato su indirizzi riservati a porte I/O; l'accesso avviene con istruzioni di caricamento - load - oppure di memorizzazione - store - attivate dal processore.
I registri hardware sono indirizzati sfruttando i segnali generati dal processore, ma può accadere che non tutti i segnali vengono effettivamente usati. Inoltre l'accesso avviene secondo la dimensione in bit della word con cui lavora il processore, ma è possibile che solo una parte di questi bit abbia un effettivo significato.
I registri di segnalazione hanno la stessa interfaccia dei normali registri hardware, ma invece che memorizzare dati, essi fanno scattare un'azione ogni volta che essi vengono scritti (o, più raramente, letti).
I registri sono misurati di solito con il numero di bit che essi possono contenere, ad esempio "registri a 8 bit" oppure "registri a 16 bit". Questi registri possono essere implementati in una grande varietà di modi, tra cui banchi di registri, SRAM standard, singoli flip-flop, o infine memoria ad alta velocità residente nel core del processore.
Oltre ai registri che sono direttamente accessibili ai programmatori e che possono essere letti e scritti da software, molti chip hanno dei registri interni che sono usati per macchine a stato e pipeline interni.
Esistono software commerciali di progettazione, come ad esempio il Socrates Bitwise della Duolog Technologies, che semplificano e automatizzano la fase di specificazione dei registri memory-mapped e la generazione di codice per la produzione in silicio dell'hardware, del firmware, della verifica hardware, delle procedure di test e la documentazione., ,
SPIRIT IP-XACT e DITA SIDSC XML definiscono formati standard XML per registri memory-mapped. , ,
A causa del fatto che i registri a sola lettura o a sola scrittura rendono il debug quasi impossibile, molti programmatori richiedono ai progettisti di hardware di assicurarsi che tutti i registri che sono scrivibili, siano anche leggibili. Comunque, ci sono casi in cui leggere certi tipi di registro è inutile. Per esempio un bit, contenuto in un registro di segnalazione, che attiva un impulso verso un hardware specializzato, verrà poi letto sempre con valore nullo.

## Registri hardware nei Microcontrollori

Un microcontrollore è un chip che ingloba una CPU e un insieme di periferiche, ad esempio porte seriali, sincrone e asincrone, porte digitali di I/O e convertitori analogico-digitali (ADC). Il metodo principale con cui la CPU gestisce le periferiche consiste nell'operare sui registri hardware che esse le mettono a disposizione.
I registri hardware si distinguono in 3 categorie principali:
* registri di controllo
* registri di stato
* registri di dati
I registri di controllo hanno la funzione di impostare il funzionamento di una certa periferica prima che essa venga attivata per eseguire il suo compito. Ad esempio, i registri di controllo di una porta seriale permettono di impostare il baud-rate (ad es. 38400), il numero di bit (7 o 8), la presenza del bit di parità e il suo calcolo (pari, dispari, sempre 1 o sempre 0), il funzionamento dei segnali esterni aggiuntivi (RTS, CTS, DSR, DTR) ecc.
I registri di controllo infine consentono di attivare la periferica, o una sua sottosezione: ad esempio per una porta seriale si potrebbero avere delle abilitazioni separate per la sezione ricevitore e la sezione trasmettitore. Un singolo registro di controllo espleta tipicamente più funzioni, in quanto esso viene suddiviso in singoli bit oppure gruppi di più bit che, impostati in maniera opportuna, selezionano un particolare funzionamento, o attivano una particolare sezione, della periferica. Questo tipo di registri possono essere sia scritti, come già descritto, che letti, al fine di verificare le effettive impostazioni in momenti successivi.
I registri di stato servono invece alla periferica, durante il suo funzionamento attivo, per far conoscere alla CPU quale è il suo stato attuale, cioè quali operazioni ha terminato di compiere, o sono in corso, o che è in attesa di comandi da parte della CPU, oppure infine che è in attesa di dati dal mondo esterno. Ad esempio, una porta seriale utilizza i registri di stato per riportare il fatto che essa ha completato la ricezione di un dato, oppure che ne ha completato la trasmissione, oppure che le operazioni hanno comportato un errore (errore di parità in ricezione, errore per linea occupata in trasmissione, ecc.). Anche qui, un singolo registro tipicamente viene scomposto in più bit, o gruppi di bit, che riportano più informazioni da decodificare da parte della CPU per decidere la prosecuzione delle azioni. Normalmente questo tipo di registri sono solamente di lettura (da parte della CPU); inoltre l'atto della lettura può comportare anche effetti aggiuntivi, quali l'azzeramento di una parte delle segnalazioni fornite dalla periferica. Ad esempio, la lettura di un registro di stato di una porta seriale può azzerare le segnalazioni di errore che fossero presenti in questo registro: questo per far ripartire la periferica da una corretta situazione iniziale. La scrittura su questi registri, invece, non ha effetti specifici sulla periferica, salvo che a volte l'atto della scrittura ha l'effetto di azzerare segnalazioni, come già visto.
I registri dati, infine, hanno la funzione di fornire alla periferica i dati da elaborare (operazione di scrittura da parte della CPU sul registro di dati della periferica), oppure di prelevare i dati messi a disposizione dalla periferica (operazione di lettura). Posto che questi registri possono o solo essere scritti, o solo essere letti, si verifica in molti casi che lo stesso registro viene usato per le due funzioni. Ad esempio una porta seriale usa lo stesso registro sia per l'invio di dati che per la ricezione.