Questo è il primo episodio di una serie che porterà ALEX80 — il nostro computer didattico basato su Z80 — ad avere un monitor. Il punto di partenza è capire come funziona lo standard VGA, che cosa ci aspetta dal lato hardware e come possiamo generare i segnali necessari con componenti relativamente semplici.
La scelta è caduta sulla VGA non per caso: è uno standard del passato, coerente con lo spirito del progetto, e ha il vantaggio di essere ancora abbastanza diffuso da trovare facilmente monitor o adattatori. Io avevo in giro un vecchio monitor VGA inutilizzato — ha trovato una seconda vita.
Il connettore e i livelli elettrici
Il connettore VGA è quel classico D-Sub a 15 pin blu che chiunque abbia usato un PC negli anni ’90 o 2000 riconosce immediatamente. I segnali che ci interessano sono tre canali video separati — rosso, verde e blu — più i segnali di sincronismo orizzontale (HSync) e verticale (VSync), più le masse.
I canali RGB sono analogici: l’impedenza di ingresso del monitor su ciascun canale è di 75 ohm, e il segnale può variare tra 0 V (nero) e 0,7 V (intensità massima). I segnali di sincronismo sono invece digitali, livello TTL, quindi 0/5 V.
Questo crea subito un problema pratico: se lavoriamo con logica a 3,3 V — come il CPLD che useremo — dobbiamo risolvere sia la conversione di tensione per i canali colore sia la compatibilità TTL per i sync. Ci torneremo.
Perché lo standard VGA è strutturato così
Lo standard VGA è nato nell’era dei monitor CRT, i tubi a raggi catodici. Un CRT funziona con un pennello elettronico che scansiona lo schermo riga per riga, partendo dall’angolo in alto a sinistra, andando verso destra, tornando indietro, e così via fino all’angolo in basso a destra, per poi ricominciare dall’inizio.
Questo pennello non è istantaneo: ha bisogno di tempo per tornare in posizione, e non è preciso al millimetro. Per questo lo standard prevede delle zone di “guardia” intorno all’area visibile: il front porch (il margine dopo la zona visibile), il sync pulse (l’impulso di sincronismo vero e proprio) e il back porch (il margine prima che ricominci la nuova riga o il nuovo fotogramma).
Anche se oggi usiamo LCD che non hanno nessun pennello fisico da gestire, lo standard prevede comunque quelle tempistiche per garantire la compatibilità con tutti i monitor esistenti.
La struttura temporale di un fotogramma
Prendendo come riferimento la risoluzione 640×480 a 60 Hz — quella che usiamo per questo test — il pixel clock è di circa 25,175 MHz, che corrisponde a un periodo di circa 40 ns per pixel. Con un quarzo da 25 MHz la differenza è trascurabile: i monitor tollerano una certa variazione e si agganciano comunque correttamente.
Per la scansione orizzontale, i conteggi totali sono 800 “pixel equivalenti” per riga:
- 640 pixel visibili
- 16 di front porch
- 96 di sync pulse
- 48 di back porch
Per la verticale, il totale è 525 righe:
- 480 visibili
- 10 di front porch
- 2 di sync pulse
- 33 di back porch
Tutti questi numeri si traducono in contatori. Un contatore orizzontale da 10 bit (arriva fino a 799), temporizzato al pixel clock, e un contatore verticale che viene incrementato ogni volta che quello orizzontale completa un ciclo. Tutto sincrono, tutto a 25 MHz.
I segnali da generare
Dalla lettura dei due contatori derivano quattro segnali principali:
HSync e VSync — attivi bassi in questa risoluzione. Il sync orizzontale deve stare basso durante i 96 pixel dell’impulso (da 655 a 751 nel conteggio orizzontale). Lo stesso principio vale per il verticale, con le righe al posto dei pixel.
HBlank e VBlank — segnali che indicano quando i canali RGB devono essere forzati a zero. Durante il front porch, il sync pulse e il back porch — sia in orizzontale che in verticale — i canali colore devono essere a zero, pena malfunzionamenti del monitor.
Il modo più pulito per generare gli impulsi di sync e blank è usare dei flip-flop SR sincronizzati al clock di sistema: quando il contatore raggiunge il valore di inizio impulso, si attiva il reset; quando raggiunge il valore di fine impulso, si attiva il set. Questo evita i glitch che si avrebbero con logica combinatoria pura, dove le uscite del contatore durante le transizioni possono generare stati intermedi spuri.
L’implementazione con Altera MAX II
Per questo test è stato usato un CPLD Altera MAX II, scheda EPM240, che già conoscevamo dal corso di elettronica digitale. Ha un quarzo da 50 MHz: un flip-flop T (o un D con l’ingresso negato) divide per due e otteniamo 25 MHz.
Lo schema è stato realizzato nell’editor schematico di Quartus. Il contatore orizzontale a 10 bit è implementato con flip-flop D più logica combinatoria per individuare i punti di interesse (639, 655, 751, 799). Il contatore verticale segue la stessa struttura, abilitato dal segnale di fine riga orizzontale. I flip-flop SR sincronizzati generano HSync, VSync, HBlank e VBlank. Il segnale di colore viene poi “gated” da HBlank e VBlank prima di uscire dai pin del CPLD.
Per l’assegnazione dei pin: HSync al pin 51, VSync al 53, e i tre canali colore su pin dedicati. Un ingresso di reset al pin 2 garantisce uno stato iniziale definito all’accensione.
La conversione di tensione per i canali RGB
I sync li colleghiamo direttamente al monitor: il CPLD lavora a 3,3 V, ma il livello logico alto TTL è riconosciuto già dai 2 V in su. Nessun problema.
Per i canali colore invece bisogna scendere da 3,3 V a circa 0,7 V. La soluzione è un partitore resistivo che però deve tenere conto della resistenza da 75 ohm già presente all’ingresso del monitor: quella fa parte del partitore. Calcolando, serve una resistenza in serie di circa 278 ohm, approssimabile con una da 100 ohm più una da 180 ohm.
Per verificare la tensione prima di collegare il monitor — collegare con tensioni scorrette può danneggiare gli ingressi analogici — si misura sull’oscilloscopio con in parallelo una resistenza da 75 ohm che simula il carico del monitor. Il valore misurato è risultato intorno ai 650 mV: leggermente sotto lo 0,7 V teorico per via delle resistenze non esatte disponibili, ma comunque entro un margine sicuro.
I test sull’oscilloscopio
Prima di collegare qualsiasi monitor, si verificano le tempistiche sui sync e sul blank con l’oscilloscopio.
Sync orizzontale: impulso negativo di 3,84 µs — esattamente i 96 pixel × 40 ns previsti dalla specifica.
Front porch orizzontale: 640 ns (16 pixel × 40 ns), misurato come tempo tra il fronte di discesa dell’HBlank e il fronte di discesa dell’HSync.
Back porch orizzontale: 1,92 µs (48 pixel × 40 ns), dal fronte di salita dell’HSync al fronte di salita dell’HBlank.
Sul verticale, sync pulse di 64 µs (2 righe × 32 µs), front porch di 320 µs e back porch di 1,056 ms. Tutto quadra con la tabella di riferimento.
Il tempo totale di un fotogramma misurato sul canale rosso è risultato di 16,8 ms, compatibile con i 60 Hz attesi.
Il primo test su monitor
Rimosse le resistenze di simulazione, collegati i fili al connettore VGA (rosso al pin 1, verde al 2, blu al 3, sync ai pin 13 e 14, masse collegate tutte insieme), si alimenta il sistema e si aspetta.
Il monitor riconosce il segnale: il LED si accende. Premendo il tastino del rosso sulla breadboard, lo schermo diventa rosso. Verde: verde. Blu: blu. Rosso + blu: viola. Verde + rosso: giallo. Tutti e tre: bianco. Il menu del monitor conferma 31,2 kHz orizzontale e 59,6 Hz verticale — leggermente diversi dai 31,4 kHz e 60 Hz teorici per via del clock a 25 MHz invece di 25,175 MHz, ma il monitor si aggancia senza problemi.
Prossimi passi
Questa risoluzione — 640×480 a 60 Hz — non è quella che useremo con ALEX80. Il pixel clock di 25 MHz è troppo elevato per una logica discreta basata su Z80, e il numero di contatori necessari non è banale da realizzare senza un CPLD. Nei prossimi episodi capiremo quale risoluzione è compatibile con i vincoli del nostro sistema, quanti colori possiamo permetterci e come progettare la scheda grafica vera e propria.
Le basi, però, sono chiare: sappiamo come funziona il segnale VGA, sappiamo cosa genera un monitor e cosa ci aspetta dal punto di vista dei contatori e delle temporizzazioni. Da qui si costruisce.
Guarda il video per seguire passo dopo passo la realizzazione dello schema, i test sull’oscilloscopio e il momento in cui il monitor si accende per la prima volta.
Contenuti Premium
Questo contenuto è riservato agli abbonati premium di Alexa Academy.
