FPGA Cyclone e Display LCD 2

Stampa
( 0 Votes ) 
Valutazione attuale:  / 0
ScarsoOttimo 
Categoria principale: Elettronica Categoria: Microcontrollori
Data pubblicazione
Scritto da Primok_V Visite: 3354

FPGA Cyclone e Display LCD

Seconda parte


Concludiamo quest’articolo riprendendo brevemente i punti salienti descritti nella puntata precedente.
• Descrizione dell’architettura dell’ FPGA.
• Schema elettrico dell’interfaccia LCD con l’FPGA.
• Descrizione hardware , funzionalità dei pin.
• Dettagli di collegamento della EPCS1 esterna con l’FPGA.
• Creazione di un progetto con generazione del firmware da scaricare nella eeprom.
Per avere in mente il circuito , potremmo fare riferimento al seguente schema a blocchi.

+



 

Vediamo ora com'è possibile assegnare a determinati pin dell'FPGA i segnali di ingresso/uscita stabiliti in fase di creazione del progetto.

Quando si edita il codice con Quartus2 , viene creata un'entità ( una porta ) con segnali d'ingresso e segnali d'uscita.Ad esempio un segnale d'ingresso è il clock mentre un segnale d'uscita è l' Out_Rs.Bene, questi nomi di segnali vengono associati ai pin dell'FPGA ; il pin 16 dell'FPGA sarà l'ingresso del clock esterno,il segnale Out_RS sarà per noi il pin 53 sempre dell'FPGA e cosi via per tutti i segnali usati  in fase di creazione di progetto.

Lanciamo Quartus2 e clicchiamo sul pulsante  Pin Planner come mostrato in figura:

+

poi avremo

+

Ora per assegnare il segnale CLK ( dichiarato in fase di progetto) al pin 16 dell'FPGA , da location selezioniamo il PIN_16 come è mostrato nella figura di sopra e così via per  tutti i segnali.

Un altro metodo è quello di posizionarsi con il cursore direttamente sul pin interessato e cliccarci sopra come si vede  nella figura:

+

+

Dopo aver completato la "mappatura" dei pin bisogna compilare di nuovo il progetto

+

Ora è il momento di scaricare il firmware nell'FPGA.Prima di farlo però dobbiamo configurare il dispositivo; seguite questa sequenza di immagini.

+

+

+

+

+

+

+

+


+

Cliccare infine su ok.Per scaricare il firmware nell'FPGA abbiamo bisogno di un programmatore e qui abbiamo diverse strade.Acquistarlo direttamente online da qui http://www.terasic.com.tw/cgi-bin/p ... &No=46 oppure tentare di costruirselo facendo riferimento al seguente documento doc.In alternativa sulla rivista di nuova elettronica maggio 2007 pag 79 c'è un programmatore di CPLD che dovrebbe funzionare.Collegare il programmatore al connettore seriale come si vede in questa figura:

+

Adesso possiamo finalmente scaricare il firmware LCD.pof nell'FPGA.Seguite la seguenza di immagini per farlo.

+

+  


+

+

+

+

+

+

+

Adesso dovete solo accendere il circuito e vedere il vostro circuito funzionare.Ora ci occuperemo del codice sorgente ,ma prima di farlo vi fornirò alcuni links dove acquistare i componenti ,se intendete realizzare il circuito.

Per il circuito stampato,potete fare riferimento qui:

http://it.rs-online.com/web/search/ ... 073#header .Guardate quest'immagine,il layout è il numero1 a sinistra.

L'immagine è stata ridimensionata. Clicca qui per vedere l'immagine ingrandita. Le dimensioni originali sono 900x907
+  


Per l'FPGA il link è questo: http://it.rs-online.com/web/search/ ... =14#header,Il quarzo qui:http://it.rs-online.com/web/search/ ... der.  Infine la eeprom EPCS1 qui: http://it.rs-online.com/web/search/ ... 73#header.


 

Il codice sorgente

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Display_LCD is
port(
CLK : in std_logic; -- Clock (25 MHz)
DATA : out std_logic_vector (7 downto 0); -- Dati/Comandi
Out_En : out std_logic ; -- Segnale di Enable
Out_Rs : out std_logic ; -- Register Select
Uscita : out std_logic ; -- Uscita ad 1 Hz
Out_Rw : out std_logic -- Segnale di lettura/scrittura
);

-- Variabili di controllo --------

shared variable OK_EN:BOOLEAN:=FALSE;

shared variable STOP_CONT1:boolean:=FALSE;

end Display_LCD;

architecture Display_LCD of Display_LCD is


component CLOCK_DIV is
generic(
CLK_TIMING_IN_NS : integer; -- Periodo del clock d'ingresso (in ns)
CLK_TIMING_OUT_NS: integer -- Input clock cycle time (in ns)
);
port(
CLK_IN : in std_logic; -- Input clock
CLK_OUT: out std_logic -- Output clock
);
end component;
-- Array di 32 caratteri: ogni carattere è di 8 bit ( 1 Byte )
type Stringa is array(1 to 32) of std_logic_vector (0 to 7);

--Costante contenente i 32 caratteri da visualizzare

constant frase_da_scrivere : Stringa := (x"50", x"52", x"49", x"4D", x"4F", x"4B", x"5F", x"56", x"20",
x"42", x"4F", x"4C", x"4F", x"47", x"4E", x"41",x"2E" ,x"49", x"4E", x"46", x"4F",
x"50", x"4F", x"52", x"54", x"41", x"4C", x"2E", x"49",x"54", x"2E", x"2E");

signal clk_in : std_logic; -- Buffered master clock

signal clk_out : std_logic; -- LCD clock out (1 sec )

-- Inizio programma

begin
clk_in<=CLK;
Uscita <=clk_out;
CLK_1S :CLOCK_DIV
generic map (
CLK_TIMING_IN_NS => 40,
CLK_TIMING_OUT_NS =>1000000000
)
port map (
CLK_IN => clk_in,
CLK_OUT => clk_out
);

-- Processo ( le istruzioni vengono eseguite sequenzialmente )
PROC1:process (clk_in,clk_out) -- lista dei segnali da processare ( clock d'ingresso e d'uscita )


--variabili di controllo locali al processo ( visibilità limitata )
variable cont1:integer:=0;
variable cont2:integer:=0;
variable J:integer:=0;
variable y:integer:=0;
begin
-- Generazione impulso di scrittura sincronizzato col fronte di salita del clock
if (clk_in='1' and clk_in'event)then
if ( (cont2<13) and (OK_EN=TRUE) ) then

cont2:=cont2+1;

case cont2 is

when 1 => Out_En <= '0'; Out_Rw <= '0';
when 2 => Out_En <= '1'; Out_Rw <= '0';
when 12 => Out_En <= '0'; Out_Rw <= '0';
when 13 => cont2:=0; OK_EN :=FALSE;
when others =>
end case;

end if;

--Inizializzazione del Display LCD

if ( (cont1<1316044) and (STOP_CONT1=FALSE )) then
cont1:=cont1+1;

case cont1 is

when 1125000 => DATA <= x"38"; Out_Rs <= '0';OK_EN :=TRUE;
when 1227500 => DATA <= x"38"; Out_Rs <= '0';OK_EN :=TRUE;
when 1230014 => DATA <= x"38"; Out_Rs <= '0';OK_EN :=TRUE;
when 1231023 => DATA <= x"38"; Out_Rs <= '0';OK_EN :=TRUE;
when 1232030 => DATA <= x"0F"; Out_Rs <= '0';OK_EN :=TRUE;
when 1274044 => DATA <= x"06"; Out_Rs <= '0'; OK_EN :=TRUE;
when 1315044 => DATA <= x"01"; Out_Rs <= '0';OK_EN :=TRUE;
when 1316044 => cont1:=0; OK_EN :=TRUE;STOP_CONT1:=TRUE;

when others =>

end case;
end if;

-- Scrittura dei 32 caratteri nel display e loop


if (clk_out='1' and ( J<33 ) and y=0)then
DATA <=frase_da_scrivere(J); Out_Rs <= '1';OK_EN :=TRUE;
y:=1;
J:=J+1;
else if (clk_out='0' and J<33) then
if(J=17) then
DATA <= x"C0"; Out_Rs <= '0';OK_EN :=TRUE;
end if;
y:=0;
end if;
end if;
end if;
if ( (J=33) and (clk_out='1')) then
DATA <= x"01"; Out_Rs <= '0';OK_EN :=TRUE;
J:=1;
end if;
end process;

end Display_LCD;

Le prime 3 righe sono delle librerie e packages .Avevo accennato ai segnali d'ingresso uscita della porta della entità ( dovreste conoscere un minimo di linguaggio di VHDL per comprendere meglio).In tutti i modi i segnali in gioco sono :CLK ( clock di 25MHz),DATA che è un vettore di segnali digitali che sono i dati per la gestione del display LCD,i segnali di controllo Out_Rs,Out_Rw,Out_En e un segnale per far lampeggiare un led alla frequenza di 1HZ.Poi sono state dichiarate 2 variabili shared ( queste variabili sono visibili ovunque) per il controllo di alcune condizioni.Procedendo verso il basso, troviamo la definizione di un componente ( se ricordate ne avevo già parlato nell'articolo precedente) necessario per dividere la frequenza del clock d'ingresso di 25MHz per 25000000 ed ottenere una frequenza di 1HZ.Poi un array di stringhe che contiene la frase da visualizzare ; seguite i commenti per tutto il resto.Il firmware e il file component per il progetto

LCD.pof   e  CLOCK_DIV.vhd. Credo che non ci sia altro d'aggiungere a parte questo video.Nella mia scheda sperimentale è stata implementata anche una

interfaccia seriale,un display a 7 segmenti e dei led per altri firmwares , ma di questo parlerò nei prossimi articoli.

A disposizione per eventuali dubbi.

 

Saluti

Primok_V
Joomla 1.7 Templates designed by College Jacke