Se stai studiando i dispositivi logici programmabili e vuoi capire come si passa dalla teoria alla pratica, questo articolo fa per te. Vedremo come realizzare un controller PWM completo su CPLD Altera MAX 2 usando Quartus come ambiente di sviluppo, come simulare il progetto con ModelSim e come pilotare un vero carico — una ventola — tramite un MOSFET di potenza.
Cos’è un controller PWM e perché implementarlo su CPLD
Il PWM (Pulse Width Modulation) è una tecnica di modulazione largamente usata nell’elettronica di potenza e nel controllo di motori: variando il duty cycle di un segnale digitale, è possibile regolare la quantità di energia trasmessa a un carico — un motore, un LED, un riscaldatore — senza dissipare potenza in elementi resistivi.
Implementare un controller PWM interamente in hardware, su un dispositivo logico programmabile come un CPLD, è un ottimo esercizio per comprendere la progettazione sincrona, la gestione dei divisori di frequenza e l’uso di blocchi configurabili come contatori e comparatori.
L’Altera MAX 2 è un CPLD con caratteristiche architetturali che si avvicinano a quelle degli FPGA, pur mantenendo la semplicità tipica dei dispositivi a bassa densità. A differenza degli FPGA tradizionali, tuttavia, la configurazione viene mantenuta anche in assenza di alimentazione senza memoria esterna, e il numero di cicli di riprogrammazione è limitato — un aspetto da tenere sempre a mente durante lo sviluppo.
Architettura del progetto: dallo schema a blocchi al silicio
Il controller PWM è stato progettato seguendo uno schema a blocchi che suddivide la logica in stadi chiari e indipendenti:
- Divisore di frequenza a 11 bit — parte dal clock da 50 MHz della development board e genera un segnale a circa 24 kHz
- Contatore a 8 bit — divide ulteriormente la frequenza portandola attorno ai 95–100 Hz
- Edge detector — rileva il fronte di salita del segnale per generare impulsi di abilitazione precisi
- Contatore up/down a 8 bit — impostabile tramite due pulsanti, con valore iniziale a 127 (50% di duty cycle)
- Comparatore a 8 bit — confronta il valore del contatore up/down con quello del contatore principale e genera l’uscita PWM
Questa suddivisione non è solo teorica: ciascun blocco è stato implementato in modo indipendente e poi integrato nello schema principale in Quartus.
I blocchi di libreria di Quartus: 74163, LPM Counter e LPM Compare
Uno degli aspetti più interessanti dell’ambiente Quartus è la disponibilità di componenti pronti all’uso che replicano fedelmente il comportamento dei chip della serie 74.
Il contatore sincrono 74163
Il 74163 è un contatore sincrono a 4 bit con reset sincrono e ingresso di parallel load. In Quartus è disponibile come primitiva di libreria e può essere cascato per ottenere contatori più larghi: due 74163 in cascata realizzano un contatore a 8 bit. La gestione del riporto avviene tramite l’uscita Terminal Count (TC), che abilita il contatore successivo attraverso il pin Count Enable T (CET) — esattamente come nel dispositivo fisico.
Usare i componenti della serie 74 all’interno di un CPLD ha senso soprattutto quando si vuole validare la compatibilità con circuiteria discreta o si punta a una futura migrazione verso logica convenzionale. Se invece il target finale è il CPLD stesso, i blocchi LPM (Library of Parameterized Modules) sono generalmente più comodi e flessibili.
LPM Counter
L’LPM Counter è un contatore parametrizzabile: si configura la larghezza in bit, la modalità up/down, il valore di preset asincrono e le abilitazioni direttamente nelle proprietà del componente in Quartus. Per realizzare un contatore up/down a 8 bit con preset a 127, è sufficiente inserire i valori nelle apposite caselle — nessun flip-flop da collegare manualmente.
LPM Compare
L’LPM Compare è un comparatore parametrizzabile che opera in modalità sincrona, campionando i suoi ingressi sul fronte del clock. Operare in modo sincrono è fondamentale per evitare glitch sull’uscita PWM, un problema che emerge chiaramente durante i test su hardware reale.
Il problema del clock enable: perché serve un edge detector
Un errore comune nella progettazione sincrona è confondere un segnale di abilitazione con un segnale di clock. Nel progetto, l’uscita del divisore a 11 bit — che rimane alta per metà del periodo — non può essere usata direttamente come enable per il contatore successivo: il contatore conterebbe per tutta la durata del livello alto, producendo un comportamento completamente errato.
La soluzione è l’edge detector: un circuito semplice composto da un flip-flop D e una porta AND. L’uscita del flip-flop è ritardata di un colpo di clock rispetto all’ingresso; facendo l’AND tra l’ingresso e il complemento dell’uscita del flip-flop, si ottiene un impulso della durata esattamente di un periodo di clock in corrispondenza di ogni fronte di salita. Questo impulso viene usato come segnale di abilitazione per il contatore, garantendo che ogni transizione del segnale di divisione produca esattamente un incremento.
Lo stesso principio viene applicato anche ai segnali dei pulsanti up e down, in modo da produrre un singolo impulso per ogni pressione, anche se il pulsante viene tenuto premuto a lungo.
Simulazione con ModelSim: vantaggi rispetto al tool semplificato
Quartus include due modalità di simulazione: il University Program Waveform Editor — semplice ma limitato — e ModelSim-Altera, molto più potente e adatto a simulazioni lunghe e complesse.
Per un progetto come questo, in cui le frequenze in gioco sono nell’ordine dei MHz ma il comportamento rilevante è a frequenze di poche decine di Hz, è necessario simulare intervalli di tempo nell’ordine dei millisecondi. ModelSim permette di farlo, anche tramite script TCL che automatizzano la generazione dei segnali di stimolo e la visualizzazione delle forme d’onda.
Durante la simulazione è possibile verificare:
- il corretto funzionamento del divisore di frequenza
- il comportamento dell’edge detector e dei contatori
- la variazione del duty cycle al variare del valore del contatore up/down
- il blocco del conteggio ai valori limite (0 e 255)
La simulazione ha anche permesso di individuare un errore di progetto: il segnale di preset asincrono del contatore LPM era collegato fisso a VCC, causando il blocco del contatore al valore iniziale. Correggere questo tipo di problema in simulazione, prima di programmare il dispositivo fisico, è molto più efficiente.
Antirimbalzo: perché i pulsanti meccanici hanno bisogno di un circuito dedicato
Un pulsante meccanico, al momento della pressione, genera una serie di rapidi rimbalzi del contatto — transizioni spurie che un sistema digitale veloce interpreta come pressioni multiple. Il problema è particolarmente critico in presenza di un edge detector: ogni rimbalzo produce un impulso, e il contatore viene incrementato molte volte invece di una.
La soluzione classica è un circuito RC con trigger di Schmitt: un condensatore rallenta la variazione di tensione al contatto del pulsante, mentre il trigger di Schmitt — un componente con due soglie di commutazione — filtra le oscillazioni nella zona di transizione, producendo un’uscita netta e priva di rimbalzi. Nel progetto è stato usato un 74HC14, un inverter hex con trigger di Schmitt che opera a 3,3 V.
Un’alternativa puramente digitale sarebbe un latch SR, che richiede però un pulsante a doppio contatto (SPDT). Quando il circuito target è un CPLD, si potrebbe anche implementare un antirimbalzo via software/firmware, ma l’Altera MAX 2 non dispone di ingressi con trigger di Schmitt integrati, rendendo necessaria la soluzione hardware esterna.
Pilotaggio della ventola con MOSFET di potenza
L’uscita PWM del CPLD opera a 3,3 V e non è in grado di pilotare direttamente una ventola da 24 V. È necessario un driver di potenza: nel progetto è stato usato un IRLZ44N, un MOSFET di potenza in logica a bassa tensione di gate, adatto per essere pilotato direttamente dai livelli logici di un CPLD.
Il circuito di pilotaggio comprende:
- una resistenza di gate (100 Ω) per limitare i picchi di corrente durante le commutazioni
- una resistenza di pull-down per garantire l’interdizione sicura del MOSFET quando il segnale è basso
- un diodo di ricircolo in parallelo al motore, per proteggere il MOSFET dai picchi di tensione induttivi generati dalla ventola
Il risultato finale, verificato con un oscilloscopio, è un segnale PWM pulito con duty cycle variabile tra il 12% e quasi il 100%, con risposta corretta ai comandi dei pulsanti e reset al 50% (valore 127).
Programmazione del dispositivo con USB Blaster
La programmazione dell’Altera MAX 2 avviene tramite USB Blaster, il programmatore standard per i dispositivi Altera/Intel. Il tool di riferimento è il Programmer integrato in Quartus, che richiede la corretta installazione dei driver — su Windows può essere necessario installare driver di una versione specifica per il riconoscimento corretto del dispositivo.
Il Pin Planner di Quartus permette di assegnare i segnali del progetto ai pin fisici del chip, tenendo conto del pinout della development board. Nel progetto, i segnali up, down, reset e PWM out sono stati mappati sui pin 1, 2, 3 e 4 del MAX 2.
Verso gli FPGA: cosa cambia
Il CPLD Altera MAX 2 condivide con gli FPGA molte caratteristiche architetturali — logica configurabile, blocchi DSP, gestione del clock globale — ma si distingue per la configurazione non volatile: i dati di configurazione sono memorizzati internamente in flash, senza bisogno di una memoria esterna. Il limite principale è il numero finito di cicli di programmazione e la densità logica inferiore rispetto agli FPGA moderni.
Il passo successivo nella progressione didattica è l’introduzione degli FPGA, dove la configurazione è volatile (caricata in SRAM all’avvio), il numero di reprogrammazioni è illimitato e la densità logica disponibile è ordini di grandezza superiore. Questo apre la strada all’uso di HDL (Hardware Description Language) come VHDL o Verilog, strumenti indispensabili per gestire la complessità di progetti di grandi dimensioni — la progettazione schematica, per quanto didatticamente preziosa, diventa impraticabile già su dispositivi di media densità.
In sintesi
Realizzare un controller PWM su CPLD è un esercizio che tocca molti aspetti fondamentali della progettazione digitale sincrona: gestione del clock, divisori di frequenza, rilevamento dei fronti, componenti parametrizzabili, simulazione funzionale e test su hardware reale. L’uso di ModelSim per la simulazione e di Quartus per la sintesi e la programmazione rappresenta un workflow realistico, direttamente trasferibile allo sviluppo su FPGA.
Se hai trovato utile questo articolo, guarda anche il video su AlexaAcademy — trovi il link nella sezione dedicata ai dispositivi logici programmabili.
