Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #23581
    Just4Fun
    Participant

    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 sempliceblink 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 ogniistruzionerappresenta delle porte digitali HW che come tali operano “in parallel” 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 dellaentità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 laarchitecturecontiene 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’istruzioneprocess(<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)) thenend ifviene 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, is the following:

    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

    • This topic was modified 1 year, 8 months ago by Just4Fun.
    • This topic was modified 1 year, 8 months ago by Just4Fun.
    • This topic was modified 1 year, 8 months ago by Just4Fun.
    • This topic was modified 1 year, 8 months ago by Just4Fun.
    • This topic was modified 1 year, 8 months ago by Just4Fun.
    #23613
    Picmicro675
    Participant

    The transistor can be replaced with any equivalent.. A me incuriosisce il VHDL se si potesse applicare alla simulazione.

    #23620
    Just4Fun
    Participant

    Se intendi simulazione digitale assolutamente sì. Considera che esistono duetipidi VHDL, quello per sintesi e quello per simulazione (quest’ultimo contieneistruzionidedicate per il simulatore, ovviamente non sintetizzabili in un ASIC/FPGA reale).

Viewing 3 posts - 1 through 3 (of 3 total)
  • You must be logged in to reply to this topic.