Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Autore
    Post
  • #23581
    Just4Fun
    Partecipante

    Volendo provare una FPGA il primo test che viene in mente è il famoso led lampeggiante…

    Ma una FPGA è costituita essenzialmente da porte logiche per cui non esiste una CPU da programmare, e il solito programmino in C in stile Arduino non può essere utilizzato.

    Nel mondo delle FPGA uno dei linguaggi più utilizzati è il VHDL, per cui è una buona idea disporre di un semplice “blink test” in VHDL.

    Ricordo a tal proposito che il VHDL, anche se assomiglia un pò al C, non è un linguaggio di programmazione ma è un modo di disegnare una rete fisica di porte logiche, ovvero è del tutto equivalente ad uno schema elettrico.

    Di conseguenza ogni “istruzione” rappresenta delle porte digitali HW che come tali operano “in parallelo” a tutto il resto.

    Quindi come in un normale progetto digitale prima di iniziare a scrivere del codice VHDL bisogna avere bene in mente quali segnali in input ed in output vogliamo utilizzare.
    Nel nostro caso avremo bisogno di un segnale in ingresso per il clock esterno e un segnale di uscita per accendere il led.

    La prima parte del nostro codice VHDL contiene i riferimenti alle librerie standard utilizzate:

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

    La seconda parte contiene la dichiarazione della “entità” con cui andremo a dichiarare quali segnali in ingresso ed uscita andremo ad utilizzare. Nel nostro caso i segnali associati al clock in ingresso e al led in uscita:

    entity led_blink is
      port (
        clk_50Mhz_in    	        : in  std_logic;	-- Pin 28 (Studio 68)
        LED1                            : out std_logic	-- Pin 152 (Studio 68)
        );
    end led_blink;

    Infine la terza parte contiene la descrizione della struttura logica (“archittettura”) che genera il segnale da 1Hz a partire dal clock in ingresso e lo usa per accendere e spegnere il led in uscita:

    architecture blink of led_blink is
    
    constant clock_freq    : integer := 50000000;		-- External clock freq [Hz]
    signal count 		: integer := 0;
    signal clk_1Hz		: std_logic;
    
    begin
    
    	-- 1Hz clock generation from a 50MHz clock + led blink
    	process(clk_50Mhz_in) 
    	begin
    		if(rising_edge(clk_50Mhz_in)) then
    			count <= count + 1;
    			if(count = (clock_freq / 2) - 1) then
    				clk_1Hz <= not clk_1Hz;
    				count <= 0;
    			end if;
    		end if;
    		LED1 <= clk_1Hz;
    	end process;
    end;

    Come si vede la “architecture” contiene al suo interno una parte di dichiarazione delle costanti (nel nostro caso la frequenza del clock a 50MHz in ingresso) e dei segnali usati localmente (il contatore usato come divisore ed il clock a 1Hz generato dal divisore stesso).

    L’istruzione “process(<segnale>)” definisce un blocco di attività da considerarsi sequenziali e non in parallelo, e che si attivano quando <segnale> varia. Nel nostro caso il segnale è il clock in ingresso.

    Il primo blocco “if(rising_edge(clk_50Mhz_in)) then … end if” viene eseguito per ogni transizione da 0 a 1 del clock in ingresso ed incrementa di una unità il contatore usato come divisore di frequenza.
    All’interno di questo primo blocco “if” ne troviamo un secondo che si attiva quando il conteggio è arrivato ad un valore pari al fattore di divisione voluto.
    Quando questo valore è raggiunto viene fatto variare lo stato del segnale che rappresenta il clock da 1Hz in uscita ed il contatore del divisore di frequenza viene azzerato per un successivo ciclo di divisione.

    Inoltre ad ogni variazione del clock in ingresso deve essere aggiornato il segnale in uscita per accendere il led (LED1 <= clk_1Hz).

    Il risultato finale, dopo avere caricato la configurazione così generata nella eeprom della FPGA, è il seguente:

    In conclusione quello che sembra simile ad un linguaggio di programmazione è in realtà la descrizione di una schema elettrico di un circuito digitale (ovviamente ho dovuto necessariamente condensare la descrizione del codice HVDL al massimo omettendo molti dettagli…).

    Comunque se vi è venuta curiosità sul VHDL vi consiglio il seguente libretto (free) introduttivo al VHDL:

    https://www.isy.liu.se/edu/kurs/TSEA83/kursmaterial/vhdl/free_range_vhdl_2019.pdf

    • Questo topic è stato modificato 1 anno, 5 mesi fa da Just4Fun.
    • Questo topic è stato modificato 1 anno, 5 mesi fa da Just4Fun.
    • Questo topic è stato modificato 1 anno, 5 mesi fa da Just4Fun.
    • Questo topic è stato modificato 1 anno, 5 mesi fa da Just4Fun.
    • Questo topic è stato modificato 1 anno, 5 mesi fa da Just4Fun.
    #23613
    Picmicro675
    Partecipante

    Bella descrizione. A me incuriosisce il VHDL se si potesse applicare alla simulazione.

    #23620
    Just4Fun
    Partecipante

    Se intendi simulazione digitale assolutamente sì. Considera che esistono due “tipi” di VHDL, quello per sintesi e quello per simulazione (quest’ultimo contiene “istruzioni” dedicate per il simulatore, ovviamente non sintetizzabili in un ASIC/FPGA reale).

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Devi essere connesso per rispondere a questo topic.