• Non ci sono risultati.

SCRITTURA, LETTURA CANCELLAZIONE DELLA FLASH

PROGRAMMAZIONE IN VHDL DELL’FPGA

3.4 SCRITTURA, LETTURA CANCELLAZIONE DELLA FLASH

Il blocco contr_seriale manda all’FPGA un byte; quest’ultimo arriva alla FLASH per essere in essa scritto.

Il protocollo di trasmissione della seriale usato è il seguente : il primo byte trasmesso comunica alla memoria il comando di scrittura o quello di lettura o quello di chip-erase, a seconda che le venga trasmesso, rispettivamente, il numero 10, 20 o 30.

Nel caso in cui si voglia scrivere nella memoria si mandano, in due byte consecutivi, 16 bit in cui è contenuto il numero di byte di programma che si decide di memorizzare nella FLASH e a questi seguono i byte del programma effettivo.

Se si vuole leggere dalla FLASH si manda il numero di byte che si intende leggere, mentre se si vuole cancellare l’intera memoria è sufficiente mandare il comando 30 di chip- erase.

Per interfacciarsi alla RS232 si usano due programmi VHDL : uno, dichiarato come contr_seriale, usato per ricevere dati dalla porta seriale da inviare verso l’FPGA, e un altro, detto seriale_tx, che invia all’RS232 i dati proveniente dall’FPGA.

Seriale_tx è una macchina a stati sincrona; essa riceve in ingresso dall’FPGA il byte dei dati da trasmettere (tx_line) e un bit (tx_start) che comanda, al blocco seriale_tx, di iniziare la trasmissione.

Le sue uscite sono il bit (tx_rs232) da trasmettere all’RS232 ed un bit (tx_end) con il quale comunica, al blocco di programma chiamato blocco_a al quale è collegato (del quale si parlerà in seguito), la fine della trasmissione del dato.

Contr_seriale è anche essa una macchina a stati sincrona.

Il suo unico ingresso è il bit rx_rs232 di dato scambiato tra l’RS232 e l’FPGA, mentre le sue uscite sono il byte di dato rx_line che va in ingresso al suddetto blocco_a e che deve

Capitolo 3 : Programmazione in VHDL dell’FPGA

raggiungere la FLASH, il bit data_ready che comunica all’RS232 sel’FPGA è pronto a ricevere o meno ed infine il bit fine_rx che comunica al blocco_a la fine o meno della ricezione del dato.

In figura 7 viene riportato un diagramma in cui sono raffigurati in blocchi i programmi VHDL finora nominati.

Sono indicati in giallo i blocchi raffiguranti gli ingressi e le uscite dei programmi VHDL contr_seriale, seriale_tx e blocco_a e in blu è rappresentata la porta seriale RS232 fisica.

Il protocollo di comunicazione seriale vede l’inizio della trasmissione con un bit di start (0 logico), seguito dall’invio dell’informazione, ovvero degli 8 bit, dal meno significativo fino a più significativo; poi viene trasmesso un bit di stop (1 logico), che indica la fine della comunicazione.

Si lavora con un baud rate della porta seriale pari a 115,2 kbit/s; di conseguenza il tempo che ci vuole per trasmettere ogni bit è pari a 8,7 µsec, ovvero all’inverso del baud rate.

E’ importante garantire il rigoroso rispetto della durata dei singoli bit; infatti non è presente alcun segnale di clock comune a trasmettitore e ricevitore e l’unico elemento di sincronizzazione è dato dal fronte in salita del bit di start.

Il campionamento in ricezione è effettuato al centro di ciascun bit, come si è già detto nel capitolo riguardante la comunicazione seriale.

Quindi se 8,7 µsec è il tempo per ogni bit, si campiona il bit di start dopo 4,35 µsec e tale ritardo si protrae per ciascun bit fino al bit di stop.

Si usa allora un contatore che ritardi l’inizio della ricezione del byte di 4,35 µsec ed un altro che conti fino a 8 in modo che gli otto bit ricevuti siano accorpati in un unico byte.

Quindi il primo conta fino a 4,35µsec/30MHz=145, dove 30MHz è la frequenza di clock dell’FPGA, mentre il secondo conta fino a 8,7 µsec/30MHz= 290, per porsi a metà del primo bit e poi dei bit successivi.

Capitolo 3 : Programmazione in VHDL dell’FPGA

Figura 7 : trasmissione e ricezione della porta seriale RS232 con l’FPGA.

Si nota che, per la ricezione dei dati da RS232 a FPGA, l’evento che permette il passaggio da uno stato di idle agli stati successivi è l’invio di un bit di start, dello 0 logico, mentre il comando effettivo di ricezione del byte è :

Capitolo 3 : Programmazione in VHDL dell’FPGA

“rx_line_i<= rx_RS232 & rx_line_i(6 downto 0);”

dove “&” fa un’unione del bit rx_RS232, che viene dalla porta seriale, con altri 7 bit. Il blocco contr_seriale ha in ingresso rx_RS232 che, volta per volta, è un bit del byte che costituirà l’uscita rx_line di contr_seriale stesso.

In particolare su rx_RS232 arriva da LSB a MSB del dato che deve essere scritto nella FLASH.

Finito l’invio dell’intero byte si pone il data_ready e il fine_rx a 1.

Nel programma seriale_tx si esce dallo stato di idle se seriale_tx riceve in ingresso tx_start a 1; quindi l’RS232 riceve il bit di start e dopo un ritardo di 8,7 µsec, trasmette dal bit LSB al bit MSB, per poi concludere col bit di stop.

La trasmissione del bit LSB avviene attraverso il comando: “tx_rs232_i<=tx_line(0);”

mentre quella dei restanti 7 bit attraverso: “tx_line_i<=’0’&tx_line_i(7 downto 1);” e poi successivamente con:

“tx_rs232_i<=tx_line_i(0);”

ovvero aggiungendo uno 0 in testa a tx_line facendo scorrere verso destra il bit che si vuole inviare all’RS232, analogamente ad un registro a scorrimento.

Quando seriale_tx ha finito la trasmissione del dato, lo comunica al blocco_a, mettendo tx_end a ‘1’.

Il blocco_a, a seconda che sia stato ricevuto, attraverso il blocco contr_seriale, il comando di scrittura, lettura o cancellazione della FLASH, fa un handshake rispettivamente con i blocchi flash_progr, flash_lett e flash_erase per verificare se sia possibile iniziare l’azione dettata dal comando stesso (si veda figura 13).

Infatti il blocco_a fa a tutti e tre i blocchi detti una richiesta di scrittura o di lettura o di cancellazione accertandosi che i blocchi di programma ad esso collegati siano pronti per abilitare l’azione di competenza.

Nel particolare al blocco flash_progr manda in ingresso i dati da scrivere in memoria, gli indirizzi (inviati in due volte essendo a 16 bit) ai quali scrivere, e il comando di fine scrittura attraverso il bit stop_progr a livello alto; al blocco flash_lett manda il bit stop_lett che, quando è a livello alto, comunica la volontà di far finire la lettura della memoria.

Prima di descrivere in dettaglio i vari blocchi di programma usati per accedere alla memoria FLASH, si fa una descrizione della struttura interna della memoria e dei comandi che permettono la scrittura, la lettura e la cancellazione della stessa.

Capitolo 3 : Programmazione in VHDL dell’FPGA

Gli ingressi/uscite della FLASH sono raffigurate in fig.8 :

Figura 8 : simbolo della memoria FLASH

Le operazioni del bus del dispositivo sono inizializzate attraverso il command register interno alla memoria; questo registro ha al suo interno dei latch che immagazzinano i comandi insieme all’informazione sull’indirizzo e sul dato necessaria ad eseguire il comando.

I contenuti del registro servono come input per la macchina a stati interna alla memoria; le uscite della macchina a stati determinano la funzione del dispositivo.

Si riportano, in tabella 1, gli ingressi, i livelli richiesti e le uscite risultanti che permettono le operazioni di scrittura e di lettura della memoria :

Tabella 1 : valori degli ingressi e delle uscite per le operazioni di lettura e scrittura

CE# è il chip-enable del dispositivo, mentre OE# è il controllo dell’uscita e porta i dati ai pin di uscita; WE# è il write-enable.

L’operazione di cancellazione della memoria vede CE#, OE#, WE# allo stesso livello del caso della scrittura.

La macchina a stati interna è settata per leggere i dati all’accensione del dispositivo; ciò garantisce che nessuna alterazione spuria del contenuto della memoria si abbia durante il transitorio di accensione.

Nessun comando è necessario in tale modalità per leggere i dati e la memoria resta abilitata per l’accesso alla lettura finchè i contenuti del command register non sono cambiati.

Operazione CE# OE# WE# A0-A21 DQ0-DQ7 Lettura L L H AIN DOUT

Capitolo 3 : Programmazione in VHDL dell’FPGA

cancellazione dell’intera memoria sono riportate nella tabella 2, dove : RA=indirizzo della memoria che si vuole leggere;

RD=il dato da leggere all’indirizzo RA; PA=l’indirizzo di memoria in cui scrivere;

PD=il dato da dover essere scritto alla locazione PA.

comandi 1° ciclo 2° ciclo 3° ciclo 4° ciclo 5° ciclo 6° ciclo

addr data addr data addr data addr data addr data addr data lettura RA RD

scrittura 555 AA 2AA 55 555 A0 PA PD

chip-erase 555 AA 2AA 55 555 80 555 AA 2AA 55 555 10

Tabella 2: sequenza di comandi per lettura, scrittura e cancellazione della memoria

Se si scrive un indirizzo o il valore di un dato non corretti o scrivendoli in una sequenza non corretta la memoria ritorna in modalità di lettura.

La programmazione consiste in un’operazione di 4 cicli.

La sequenza del comando di scrittura è inizializzata scrivendo due cicli di scrittura in apertura, seguiti da un comando di set-up del programma.

A ciò seguono l’indirizzo a cui scrivere ed il dato da scrivere.

Il diagramma di flusso dell’operazione di scrittura è raffigurato in figura 9a e la sua temporizzazione in figura 9b, dove twp=50ns (WE# a ‘0’), twph=20ns (WE# a ‘1’), twc=150ns (tempo di scrittura).

Il blocco di programma che si occupa della sequenza di programmazione e delle fasi contenute nel diagramma di flusso di figura 9a è il flash_progr, mentre la temporizzazione della scrittura viene trattata nel programma VHDL blocco_a.

Capitolo 3 : Programmazione in VHDL dell’FPGA

Figura 9a : operazione di programmazione

Figura 9b:temporizzazione dell’operazione di programmazione

Il sistema determina lo stato dell’operazione di scrittura (e si vedrà in seguito che ciò vale anche nel caso di chip-erase) usando DQ7 all’interno dell’ algoritmo del Data Polling il cui

Capitolo 3 : Programmazione in VHDL dell’FPGA

Il Data Polling è valido dopo il fronte in salita dell’ultimo impulso di WE# nella sequenza di programma (e lo stesso vale, come si vedrà in seguito, per il caso di cancellazione).

Figura 10 : Data Polling

Infatti, durante l’algoritmo di programmazione, la memoria fa uscire su DQ7 il complemento (DQ7 negato) del dato programmato per DQ7.

Quando l’algoritmo di scrittura è completo il dispositivo fa uscire il dato programmato per DQ7.

Quanto ora detto è raffigurato in fig. 11 :

Figura 11 : temporizzazione del Data Polling.

Il data polling è trattato nel blocco flash_progr (che è attivato dal blocco_a) e consiste in una lettura di durata trc=150ns con OE# e CE# a ‘0’, WE# a ‘1’.

Capitolo 3 : Programmazione in VHDL dell’FPGA

La cancellazione è analoga alla scrittura per quanto riguarda i livelli assunti dagli ingressi della FLASH, volendo CE# e WE# a ‘0’ e OE# a ‘1’, ma è diversa dalla scrittura per quanto riguarda la sequenza di comandi (si veda la tabella 2).

Infatti la cancellazione prevede 6 cicli di comandi; il chip-erase è inizializzato attraverso la scrittura di due cicli in apertura, seguiti da un comando di set-up.

Due cicli di scrittura in apertura aggiuntivi sono poi seguiti da un comando di chip erase che invoca l’algoritmo di cancellazione.

L’algoritmo di cancellazione automaticamente preprogramma e verifica la memoria interna in modo che si abbia un pattern di tutti ‘0’.

La rappresentazione in diagramma di flusso dell’operazione di cancellazione dell’intera memoria è riportata in figura 12.

Figura 12: diagramma di flusso dell’operazione di cancellazione della FLASH

La temporizzazione del chip-erase è analoga a quella della scrittura.

Come nel caso di scrittura, anche nella cancellazione si ha il data polling, successivo alla sequenza di comandi .

L’unica differenza sta nel tipo di controllo fatto su DQ7; infatti durante l’algoritmo di cancellazione la FLASH produce uno 0 su DQ7, mentre quando l’algoritmo è finito produce un 1 su DQ7.

Capitolo 3 : Programmazione in VHDL dell’FPGA

Nel caso della lettura basta dare agli ingressi i valori indicati nella tabella 1 .

Il programma lett_scritt è quello che effettivamente comanda con le sue uscite gli ingressi WE#, CE# OE# della FLASH e abilita alla lettura o alla scrittura a seconda che sia comandato da flash_lett o da flash_progr.

Il programma mux_dati serve a mettere in Hi-Z i dati in uscita da flash_progr quando è flash_erase ad essere stato attivato dal blocco_a (e quindi sono di interesse i dati in uscita da flash_erase) e viceversa.

In uscita dalla memoria FLASH si ha il segnale ry/by (ready/busy); quando assume il valore 0 indica che la memoria sta cancellando o programmando in modo attivo, altrimenti è pronta a leggere i dati.

Quindi si manda tale segnale in ingresso ai blocchi flash_progr, flash_erase e flash_lett in modo che sappiano quando attivare o meno l’operazione specifica che viene loro richiesta dal blocco_a.

La struttura dei blocchi ora nominati e dei reciproci collegamenti è riportata in figura 13. Si nota la presenza di blocchi tristate; questi, una volta abilitati, mettono in uscita il bus dati che trovano in ingresso.

In assenza dei tristate i dati e gli indirizzi della FLASH sarebbero condivisi da più blocchi di programma creando delle situazioni di conflitto.

Capitolo 3 : Programmazione in VHDL dell’FPGA

Capitolo 3 : Programmazione in VHDL dell’FPGA

Documenti correlati