Dopo diversi episodi dedicati alla progettazione e alla sperimentazione, è arrivato il momento di vedere il controller VGA di ALEX80 in funzione.
L’obiettivo di questo progetto non è mai stato quello di realizzare una scheda video utilizzando esclusivamente FPGA o dispositivi particolarmente sofisticati. Le FPGA sono state uno strumento utile per verificare le idee e ridurre i rischi durante lo sviluppo, ma il traguardo finale è sempre stato quello di arrivare a una soluzione costruita principalmente con logica discreta e semplici dispositivi programmabili, in linea con lo spirito didattico dell’intero progetto ALEX80.
Nel corso delle prove abbiamo utilizzato prima CPLD Altera e successivamente una FPGA Spartan-6 per validare la generazione del segnale video, il funzionamento della memoria video e tutta la logica necessaria alla scansione dello schermo.
Una volta verificato che l’approccio fosse corretto, è stato possibile tradurre il progetto in una soluzione più vicina a quella che verrà realizzata sul PCB definitivo.
La pipeline video
Alla base del controller c’è una pipeline molto semplice.
Ad ogni fronte di salita del clock vengono aggiornati i contatori che gestiscono la scansione orizzontale e verticale dello schermo. Questi contatori non servono soltanto a generare i segnali di sincronismo VGA, ma anche a costruire gli indirizzi della memoria video.
La memoria viene letta continuamente durante la scansione dell’immagine. Poiché il tempo di accesso della RAM non è nullo, il dato richiesto in un ciclo di clock diventa disponibile nel ciclo successivo. Questo introduce uno sfasamento di un periodo di clock che deve essere considerato in tutta la catena di elaborazione.
Per questo motivo anche segnali come:
- sincronismo orizzontale
- sincronismo verticale
- blanking video
- selezione del nibble alto o basso
vengono opportunamente ritardati tramite flip-flop in modo da restare allineati con i dati provenienti dalla memoria.
Due pixel per ogni byte
La memoria video è organizzata in modo da memorizzare due pixel all’interno di ogni byte.
Questo significa che durante la scansione dello schermo è necessario selezionare alternativamente il nibble alto o il nibble basso del dato letto dalla RAM. Per effettuare questa selezione viene utilizzato il bit meno significativo del contatore orizzontale, anch’esso correttamente sincronizzato con il resto della pipeline.
Si tratta di una scelta che consente di ridurre l’occupazione della memoria mantenendo comunque una risoluzione adeguata agli obiettivi del progetto.
La generazione degli indirizzi video
Una parte importante del lavoro riguarda la costruzione degli indirizzi della VRAM.
L’indirizzo non viene ottenuto con un semplice contatore lineare ma attraverso una combinazione dei contatori orizzontali e verticali. Per farlo vengono utilizzati sommatori che permettono di ricostruire l’indirizzo del frame buffer in modo analogo a quanto era stato realizzato nelle precedenti versioni in VHDL.
Lo schema a blocchi permette di comprendere molto meglio il funzionamento rispetto allo schema elettrico completo, perché evidenzia chiaramente il flusso delle informazioni e il ruolo di ogni sottosistema.
Condividere la RAM tra video e Z80
Uno degli aspetti più interessanti del progetto riguarda la gestione della memoria video.
La VRAM deve essere letta continuamente dal controller VGA per generare l’immagine sul monitor, ma allo stesso tempo deve poter essere scritta dallo Z80.
Non si tratta di una memoria dual-port. La condivisione viene ottenuta attraverso buffer e logiche di abilitazione che permettono di evitare collisioni sul bus degli indirizzi e sul bus dati.
Quando il controller video sta effettuando la scansione dello schermo, l’accesso da parte dello Z80 viene temporaneamente escluso. Quando invece le condizioni lo consentono, il processore può aggiornare il contenuto della memoria video.
L’importanza del VBlank
Per evitare artefatti visibili sullo schermo, il processore deve sapere quando è possibile modificare la VRAM.
Per questo motivo il controller rende disponibile allo Z80 l’informazione relativa al VBlank, cioè il periodo in cui il monitor non sta visualizzando dati utili.
Durante questa finestra temporale il processore può aggiornare la memoria video senza rischiare effetti indesiderati sull’immagine mostrata.
La soluzione adottata prevede una semplice lettura di una porta di I/O che permette al software di verificare lo stato del VBlank tramite polling.
La gestione dei due banchi video
La memoria video occupa 32 KB, mentre lo spazio disponibile all’interno della mappa di memoria del sistema richiede una gestione a finestre.
Per questo motivo il controller utilizza due banchi da 16 KB selezionabili tramite una porta di I/O dedicata. Un flip-flop mantiene memorizzato il bit di selezione e permette di scegliere quale metà della memoria video rendere visibile al processore.
La stessa porta viene utilizzata anche per fornire l’informazione relativa al VBlank.
Questa soluzione mantiene semplice l’hardware e si integra bene con l’architettura generale di ALEX80.
Verso il PCB definitivo
La fase di sperimentazione può considerarsi conclusa. Tutto il lavoro svolto con CPLD, FPGA, breadboard e prototipi ha permesso di validare l’architettura del controller VGA e di verificare che l’approccio scelto sia realmente praticabile.
Nel video viene mostrato il risultato di questo percorso e il funzionamento dell’intero sistema, che rappresenta un passaggio importante nell’evoluzione di ALEX80.
Se vuoi vedere il controller VGA all’opera e seguire tutti i dettagli della realizzazione, ti consiglio di guardare il video completo.
Slide usate nel video
Questo contenuto è riservato agli abbonati premium di Alexa Academy.
Schema elettrico
Questo contenuto è riservato agli abbonati premium di Alexa Academy.
