Una domanda spesso posta è: dove iniziare con le logiche programmabili come FPGA e CPLD?
Il prerequisito di base è senz’altro una buona conoscenza delle reti logiche e delle basi di elettronica, esistono diversi libri sull’argomento tra cui la quarta edizione del libro Reti Logiche 4/Ed di M. Morris Mano e Charles Kime tradotto in italiano da Pearson (non tratta però le basi di elettronica), l’esperienza con microcontrollori è un plus ma direi indispensabile quando si utilizzerà l’I/O delle FPGA in quanto molto delicato. Una errata impostazione o un cortocircuito anche temporaneo può irreparabilmente rendere inutilizzabile il nostro costoso chip.
Sulle FPGA esistono diversi libri, quasi tutti in inglese, che guidano nei primi passi e nello studio di linguaggi come VHDL o Verilog, tralasciano in genere l’utilizzo dei software di sviluppo come Quartus, ISE, etc.. a favore del linguaggio che è ormai standard e portabile da un’ambiente di sviluppo all’altro. E’ possibile trovare sulla rete delle dispense di corsi o seminari universitari ma spesso meno informative di un libro in quanto pensate per lezioni frontali.
Il datasheet è la fonte informativa principale per ogni circuito integrato, è sempre bene consultarlo per il proprio modello di FPGA.
Ogni produttore di dispositivi (come Altera, Xilinx, etc..) ha poi nel proprio sito un quantitativo più o meno imponente di Tutorial, Application Notes, Handbook e guide sull’utilizzo dei vari strumenti di sviluppo, spesso però iniziare con tale materiale può risultare difficile.
I forum specialistici ufficiali e non (es. alteraforum, delucagiovanni forum) rappresentano inoltre un’utile risorsa per chiarire i dubbi che possono sorgere e che è bene chiarire al più presto per iniziare col piede giusto ad utilizzare le logiche programmabili.
Vediamo in una videolezione come rompere il ghiaccio con programmi come Quartus II di Altera ed il simulatore ModelSim, argomenti che spesso i libri non toccano. Per una proficua visione è necessario sapere cos’è una FPGA ed avere un’idea del linguaggio VHDL, entrambi i software utilizzati sono scaricabili in versione gratuita dal sito Altera.
Con la scheda di sviluppo DE0-Nano (link produttore) creeremo e verificheremo un semplice “hardware su FPGA” che permetterà ad un led di lampeggiare, si potrà così avere un’idea di come utilizzare i tools di sviluppo per poter approfondire poi in autonomia le incredibili possibilità offerte da questi strumenti.
Il codice esaminato nella videolezione (versione finale) occupante 56 LEs (Elementi Logici):
library ieee;use ieee.std_logic_1164.all;entity HelloHw isport(clock : in STD_LOGIC;reset : in STD_LOGIC;led : buffer STD_LOGIC);end HelloHw;architecture HelloHwImpl of HelloHw isbegincount : process(clock, led)variable counter : integer := 0;beginif(reset = '0') thencounter := 0;led <= '0';elseif(RISING_EDGE(clock)) thencounter := counter + 1;if(counter = 50000000) thencounter := 0;led <= not led;end if;end if;end if;end process;end HelloHwImpl;
E’ possibile inoltre visualizzare il circuito generato a livello RTL (Register transfer level) dal menù Tools / Netlist Viewers / RTL Viewer
Verrà visualizzato il seguente schema
Dove è visibile un MUX (Multiplexer), un registro da 32 bit, un sommatore ed un comparatore a 32 bit ed infine un flip flop D.
Per contare fino a 50.000.000 sono necessari però solamente 26 bit, con una piccola modifica al codice, specificando il range della variabile counter si otterrà un risultato molto migliore durante la sintesi
variable counter : integer range 0 to 50000000 := 0;
L’utilizzo delle risorse calerà da 56 a 48 LEs in quanto il circuito sarà sintetizzato con elementi da 26 bit al posto di 32 bit.
Per oggi è tutto, buono studio di logiche programmabili
PS: Il video NON mostra il flusso di sviluppo completo ma introduce solamente l’argomento. Una parte importante della progettazione è l’inserimento di vincoli temporali e la loro analisi assieme a quella dei consumi energetici.
Bravo. Pensi di fare altri video?
RispondiEliminaGrazie ma purtroppo al momento non sono in programma
RispondiEliminaErrata corrige: process(clock, led) => process(clock, reset)
RispondiElimina