La futura generazione di sviluppatori di logica programmabile
Una volta, prima dell'era della sintesi logica, a un ingegnere si chiedeva di progettare un sistema in logica pura. Ai tempi avevamo radar ma non microcontroller, c'era l'elaborazione dei segnali digitali ma non esistevano processori di serie per l'elaborazione dei segnali digitali. Eppure avevamo i radar con elaborazione digitale.
Sempre a quei tempi, un ingegnere appena laureato doveva saper progettare hardware analogico e digitale e sviluppare software. Ho paura che i tempi dell'ingegnere eclettico e di ampie vedute siano solo un ricordo e guardo con apprensione al futuro della progettazione logica. In inglese c'è un proverbio che dice che se un carpentiere ha solo un martello, qualsiasi problema gli sembrerà un chiodo. Siamo già al punto in cui ogni problema sembra un problema software?
Se cercate su Internet l'espressione "applicazioni FPGA", troverete un elenco di applicazioni all'avanguardia dell'elettrotecnica, dall'intelligenza artificiale, alla sintesi vocale, fino alle comunicazioni e all'elaborazione delle immagini. Purtroppo queste applicazioni non sono semplici e alla portata dei principianti. La curva di apprendimento per saperle usare in modo adeguato è ripida e include molti argomenti non proprio semplicissimi.
Bisogna conoscere i dispositivi a logica programmabile, i loro ambienti di sviluppo integrato (IDE), e ogni produttore ha il proprio, nuovi paradigmi di programmazione (ad esempio linguaggi di descrizione hardware - HDL - e la loro capacità di supportare la concorrenza e il concetto di tempo) e bisogna capire l'applicazione stessa. Sono ostacoli insormontabili se non si è esperti. La situazione non lascia ben sperare per la nuova generazione di progettisti logici che desidera mettere a frutto le proprie competenze in fatto di programmazione logica. Il primo gradino è troppo alto. Credo che questo scoraggi chi vuole occuparsi di questo campo, e quindi riduca il numero di persone che in futuro potrebbero diventare fanatici della logica programmabile. Internet è piena di storie che esprimono frustrazione per lo stato attuale della progettazione della logica programmabile e diverse community open-source tentano di risolvere questo problema. Molti credono che la soluzione verrà dalla metaprogrammazione, una tecnica di programmazione in cui un programma considera un altro programma come dati di sua proprietà.
Le aziende che si occupano di logica programmabile sono in stato di emergenza. Da un lato, gli investitori chiedono loro di sviluppare chip ancora più capaci e costosi e, dall'altro, sempre meno gente è capace di usarli. La soluzione che offrono è convertire gli sviluppatori software in progettisti hardware e per fare questo utilizzano nuovi strumenti.
Compilatori per la sintesi di alto livello (HLS) portano l'astrazione della progettazione a un livello ancora più alto e, quindi, sempre più lontano dalle origini della progettazione logica. Fa pensare il fatto che siamo in grado di realizzare progetti hardware sofisticati a partire da descrizioni puramente software, ma che questo modo di agire non susciti quell'attrazione viscerale che invece può esercitare la progettazione logica. Non arriverò a dire che sia il caso di ridurre l'ottimizzazione di un computer, ma di certo posso affermare che progettare circuiti semplici non è più facile come in passato. Il problema è proprio che oggi progettare circuiti semplici è addirittura più difficile di quanto fosse in passato.
Mi ricordo la mia soddisfazione quando un lavoro manuale di progettazione logica si trasformava in un circuito. Era la mia bravura che riusciva a ridurre al minimo il numero di dispositivi richiesti. Quando imparai la logica programmabile all'inizio degli anni '90, ero ancora più contento di poter applicare le mie conoscenze alla progettazione dei circuiti, per implementare la logica che avevo sviluppato in un solo dispositivo di 128 elementi logici, ed era la mia mente che sceglieva ognuno di quegli elementi logici. Non dipendevo dall'intelletto di qualche sviluppatore di algoritmi sconosciuti.
Ma mentre la progettazione logica si evolveva, anche la progettazione software diventava più complessa. Ormai viviamo in un mondo di programmazione prettamente orientata agli oggetti e le librerie dei modelli di progettazione comuni sono ben documentate e facilmente reperibili nelle librerie di codice. Il manuale di modelli di programmazione su cui ho studiato è un testo una volta molto noto, di Erich Gamma e altri autori: Design Patterns, Elements of Reusable Object-Oriented Software. Trovo interessante che la progettazione hardware sia iniziata come orientata agli oggetti e in seguito il suo sviluppo abbia raggiunto una fase di stallo con l'introduzione degli HDL. Anche se gli HDL permettono di riutilizzare la progettazione, le librerie contengono la maggior parte delle funzionalità fondamentali. Cercate "Elenco dei circuiti integrati 7400-series" su Internet e troverete alcuni dei primi modelli di progettazione hardware. Trovo interessante che Meilir Page-Jones, nel suo libro Fundamentals of Object-Oriented Design in UML parli dei circuiti integrati come esempi di una buona progettazione a oggetti grazie all'elevata coesione e al basso accoppiamento. Nel cercare dispositivi logici a logica programmabile sempre più complessi abbiamo però perso la semplicità e la natura diretta della programmazione logica, da cui tutto ebbe origine. Le metodologie di progettazione di oggi dipendono da un algoritmo per implementare la logica che sviluppiamo. Ritengo che questo approccio rappresenti un ostacolo per chi muove i primi passi con la logica programmabile.
Provate a chiedervi "Quante righe di codice c'erano nel primo gioco elettronico, Pong, che collegavamo al televisore?" La risposta è zero. Era solo hardware (figura 1), il software non esisteva! Non credo che oggi molti ingegneri appena laureati siano in grado di progettare Pong senza usare software. Perché dovrebbero farlo? Per avere una prospettiva più completa e per sapere che si può fare. È più semplice di quanto crediate.
Figura 1: Schema di Pong (Immagine reperita dal blog Adafruit, di origine sconosciuta)
L'IEEE ha pubblicato un elenco di linguaggi di programmazione amati e odiati dagli ingegneri all'inizio del 2019. Indicava che tutti amano Python. Ci credo. Molti anni fa ero uno dei giudici al concorso di progettazione di Texas Instruments e ho visto che nove dei dieci team universitari usavano Python per i loro progetti. VHSIC Hardware Description Language (VHDL) e Verilog non erano nell'elenco né dei più amati né dei più odiati. Forse chi si è occupato dell'elenco dell'IEEE non considera questi HDL linguaggi di programmazione ma, più probabilmente, gli intervistati non hanno neanche preso in considerazione gli HDL. Se fosse così, dimostrerebbe quanto pochi siano gli ingegneri che tengono conto di questi linguaggi o addirittura di tutta la progettazione logica, e sarebbe un cattivo auspicio per il settore della progettazione logica.
Cosa bisogna fare quindi? Come possiamo far capire ai nuovi ingegneri che devono prima esaminare un problema e poi pensare a trovare una soluzione tramite software o hardware? Dopo tutto, la maggior parte dei problemi può essere risolta in entrambi i modi. Ho un'idea.
Credo che la piattaforma Arduino abbia creato molti gruppi di giovani interessati al software, che poi si sono iscritti all'università per diventare ingegneri o informatici. Come ci è riuscita? Arduino ha ridotto la curva di apprendimento per lo sviluppo di software. Lo ha reso meno temibile.
Definendo una scheda, è stato possibile eliminare la necessità di impostare file di comando linker, i nomi dei segnali sono diventati standard e l'IDE ha nascosto i dettagli della compilazione. Uno dei punti forti di Python è il fatto che richiede una formattazione rigida, ad esempio le indentazioni devono essere tutte uguali. In questo modo si eliminano le scelte arbitrarie di basso valore, semplificando l'intero processo di sviluppo e quindi rendendo gli sviluppatori più produttivi. Abbiamo bisogno di qualcosa di equivalente per la logica programmabile, che invogli il settore a collaborare alla definizione di uno standard.
Ecco alcuni attributi che vorrei all'interno di questo standard. Dato che Arduino non ha una robusta capacità intrinseca di modificare la propria architettura ad esempio per integrare interrupt annidati, supponiamo che i problemi logici da risolvere con questa piattaforma siano talmente semplici che i dispositivi a logica programmabile odierni riescano a soddisfare tutti i vincoli di temporizzazione. La scheda del dispositivo a logica programmabile (PLDB) equivalente ad Arduino dovrebbe avere un clock sufficientemente lento da permettere il funzionamento di progetti con 1000 elementi logici. Questo significherebbe che la piattaforma richiede solo la verifica funzionale.
Dato che tutti amano Python, propongo che la PLDB supporti Python e venga creata su un framework come nMigen o MyHDL (Figura 2) o anche Yosys con RTLIL. I principianti potrebbero così simulare progettazioni logiche con un linguaggio interpretato, produrre tabelle della verità e accedere a qualsiasi libreria Python disponibile. Parlando della libreria di Python, l'uso di questo linguaggio consentirebbe anche alla community di utilizzare l'indice del pacchetto Python (PyPI) per distribuire blocchi hardware riutilizzabili e contribuire quindi a mitigare l'assenza di modelli di progettazione robusti e condivisi. nMigen, come Python, consente di utilizzare la metaprogrammazione pertanto, anche se il framework supporterà progettazioni semplici, la piattaforma sarà scalabile e potrà supportare anche progettazioni complesse.
Figura 2: Framework basato su Python (Immagine per gentile concessione di MyHDL.org e m-labs.hk)
L'interfaccia da PC host a PLDB dovrebbe essere di tipo USB, con un microcontroller embedded nella PLDB e un'API per permettere al PC host di rilevare la configurazione della PLDB in modo da autoregolare l'ambiente Python per lo sviluppo della logica programmabile. Il risultato dovrebbe essere quello di nascondere i dettagli di sintesi, collocazione e percorso, nonché programmazione, facilitando allo stesso tempo la simulazione funzionale sul PC e l'esecuzione sull'hardware finale.
Forse alcuni lettori pensano che ormai non esistono più problemi con logica semplice da risolvere? Vi mostro alcune statistiche sulla vendita di microcontroller di Digi-Key. La Figura 3 mostra la suddivisione in classi per i microcontroller che i clienti acquistano e la Figura 4 mostra quante unità vengono vendute per ogni classe. In totale, Digi-Key presenta oltre 80.000 codici componente di microcontroller e ha in magazzino oltre 19.000 microcontroller pronti per la spedizione immediata ovunque nel mondo. Le cifre dimostrano che i semplici processori a 8 bit sono usati da sempre più ingegneri e che Digi-Key spedisce più microcontroller a 8 bit di ogni altra classe di processore. Per me, questo significa che c'è un numero maggiore di problemi semplici che complessi.
Figura 3: Numero di clienti Digi-Key che acquistano ogni tipo di microcontroller (Immagine per gentile concessione di Digi-Key Electronics)
Figura 4: Numero di unità vendute da Digi-Key per ogni tipo di microcontroller (Immagine per gentile concessione di Digi-Key Electronics)
Il nostro obiettivo deve essere quello di rendere tutti entusiasti della logica programmabile, anche chi non ha studiato programmazione logica. Ma per farlo dobbiamo cambiare i paradigmi dello sviluppo.
Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.
Visit TechForum




