
MyHDL: a Python-Based HDL
Con l’affermarsi del movimento dei makers abbiamo assisitito al diffondersi di piattaforme embedded (ARM), che prima erano ad appannaggio dei soli specialisti, presso un pubblico più vasto composto da hobbisti e persone non del settore.
Questo perché la programmazione di un micro-controllore si effettua con modalità più o meno uguali a quelle utilizzate una decina di anni fa cioè utilizzando ancora il C. Secondo un recente studio del Barr Group oltre il 95% dei sistemi embedded oggi è programmato in C o C++. Perché utilizzare Python come HDL?Possiamo utilizzare Python come linguaggio di descrizione Hardware (HDL)? Partendo dal presupposto che la prima delle golden rules è che descrivere hardware non è come sviluppare software? Jan Decaluwe, lo sviluppatore di MyHDL, ci ricorda in una serie di articoli che basta anche solo cercare delle analogie fra hardware e software per generare reazioni irrazionali non cogliendone così i vantaggi. Allo stesso modo con cui la retroguardia dei programmatori fanno fatica ad accettare che si possa programmare un micro-controllore in Python anziché in C. Tech Stack[1] Installazione del modulo open source MyHDL Installazione MyHDLPer installare la versione stabile 0.9.0 di MyHDL ci basta digitare:
Anche se raccomando di utilizzare quella in sviluppo 1.0dev dal master branch che introduce una nuova sintassi presente in molti esempi del repository:
Controlliamo la versione installata
MultiplexerPrima di poter utilizzare MyHDL dev'essere chiaro che bisogna studiare e comprendere affondo la logica digitale e la descrizione hardware. Per questo motivo utilizzeremo il Multiplexer (o selettore) a due ingressi come semplice esempio.
MUX 2:1Il MUX più semplice è quello a 2 ingressi e 1 linea di selezione che richiede un 1 bit di selezione: Tutte queste informazioni ci torneranno utili quando andremo a descrivere il nostro primo circuito con Python. Possiamo implentare un MUX con tante porte AND quanti sono i min-termini del segnale di controllo, 1 porta OR e La funzione logica che esprime l'uscita: Dalla Truth Table possiamo ricavarne il comportamento ( "il che cosa deve fare") infatti sappiamo che se
Iniziamo a descrivere hardware con Python
I decoratori, introdotti dal carattere @ ("at",presso) , sono alla base del funzionamento di MyHDL difatti vengono utilizzati per creare moduli hardware o generatori che avendo la capacità di mantere uno stato interno permettono la concurrency e la simulazione.
Nel secondo caso si utilizzano i decoratori per avere come funzione di ritorno un generatore per ottenere circuiti combinatori e sequenziali.
Step 1 - Modeling ComponentsQuando si descrive hardware hanno un ruolo fondamentale i segnali perché spostano i dati tra parti diverse del sistema. Le porte sono quindi segnali particolari perché spostano i dati da e verso l'esterno dell'interfaccia (interface) del componente.
Per MyHDL il nome della funzione equivale a quello del modulo hardware e i parametri sono le porte di solo ingresso (in), solo uscita (out), ingresso/uscita (inout) con cui nella entity descriviamo l'interfaccia. Il corrispettivo codice in VHDL sarebbe stato il seguente:
Nel nostro caso passeremo alla funzione MUX i 4 parametri che corrispondeanno alle 4 porte dell'interfaccia con segnali da 1 bit (std_logic): Possiamo rappresentare un segnale in VHDL come una connessione singola (wire) di tipo std_logic o come un'insieme di connessioni (bus) cioè un array monodimensionale di tipo std_logic_vector.
Step 2 - Modeling ProcessesAbbiamo appena visto come i componenti vengono modellati utilizzando le funzioni e i parametri ne mappano le porte (port maps) descrivendo così l'interfaccia esterna del componente. Ora dobbiamo però descriverne l'architettura cioè "il che cosa deve fare" l'intero sistema.
Se andiamo a controllare come MyHDL converte il codice in VHDL otterremo un listato come il seguente:
Notiamo che il nome del processo è composto dal nome della funzione mux() con cui abbiamo creato la entity più quello della funzione logic() con cui abbiamo descritto il comportamento del sistema. Invece i 3 segnali in ingresso del Multiplexer Una particolare categoria di iteratori: generatorsPrima di procedere oltre, dobbiamo aver ben chiaro che cos'è un generatore in Python e il meccanismo di esecuzione e sospensione dell'iteratore.
Se volessimo creare un generatore dalla stessa funzione la sintassi cambierebbe in questo modo:
La funzione generaQuadrati() , quando invocata, crea un'istanza dell'oggetto generatore, ma non genera alcun numero.
Concurrency e sensitivity listLa capacità dei generatori di mantenere lo stato e di poterlo riprendere é alla base di MyHDL perché equiparabile al funzionamento di un processo in VHDL che nel suo complesso è uno statement concorrente cioè che si attiva ogni volta che uno dei segnali della sensitivity list cambia.
Un processo entra in esecuzione quando uno dei segnali elencati nella sensitivity list cambia il proprio valore-stato a causa di un evento. A seguito di questo evento, le istruzioni contenute nel process body vengono eseguite in sequenza fino a giungere all’end process.
Bibliografia[1] Magnus Lie Hetlnd, Beginnig Python, 2nd edition, Apress,2008 FPGA Decorators Embedded-systems MyHDL:articoli e documentazione MyHDL:documentazione |