• Non ci sono risultati.

FASE DI MONITORAGGIO E ACCESSO ALLA MEMORIA RAM

PROGRAMMAZIONE IN VHDL DELL’FPGA

3.2 FASE DI MONITORAGGIO E ACCESSO ALLA MEMORIA RAM

Figura 2 : pin di ingresso/uscita della memoria RAM

La memoria RAM (si veda figura 2) effettua operazioni di lettura e di scrittura secondo la tabella di verità di figura 3.

CS# OE# WE# MODO I/O

H X X non attivo Hi-Z

L H H uscite non attive Hi-Z

L X L scrittura Din

L L H lettura Dout

Figura 3 : tabella di verità della RAM (X=don’t care)

L’accesso alla RAM viene dal microcontrollore per scrivere e leggere i dati, ma anche dall’ADC per memorizzare i suoi 12 bit in cui è contenuta la conversione in digitale delle grandezze di controllo provenienti, a monte, dagli alimentatori.

L’abilitazione della RAM avviene attraverso il livello ‘0’ di una delle sei uscite (O_int0) del programma decoder (che implementa un decoder fisico) del quale si parlerà nel paragrafo 3.5).

Si decide di dare priorità all’ADC in caso di una contemporanea richiesta di accesso da parte del microcontrollore e dell’ADC.

A tale scopo si scrive il programma “arb” che fa appunto da arbitro per i due accessi.

Esso ha in ingresso le richieste di accesso dell’ADC (req_adc_arb a ‘1’) e del microcontrollore (req_micro a ‘1’) e acconsente all’accesso del processore (ack_micro a ‘1’)

Capitolo 3 : Programmazione in VHDL dell’FPGA

(altrimenti si avrebbe in uscita ack_adc_arb a ‘1’).

Il programma che si occupa della conversione dell’ADC delle grandezze analogiche provenienti dal suo ingresso e poi della scrittura delle grandezze convertite in memoria è adc_mux.

Quest’ultimo riceve in ingresso i dati provenienti dall’ADC, l’ack_adc_arb proveniente dall’arbitro e il pin stsq col quale l’ADC comunica se sta convertendo (stsq a ‘0’) oppure no. Le sue uscite sono i dati da scrivere nella memoria, gli indirizzi ai quali scrivere i dati nella RAM, il segnale che abilita l’ADC mettendo a ‘0’ il suo CS#, i comandi di scrittura della RAM (wrn_sram a ‘0’ e oe_sram_n a ‘0’) o di lettura della stessa (wrn_sram a ‘1’ e oe_sram_n a ‘0’).

Infine serve un tristate (tristate_addr(ADC)) che mandi gli indirizzi dell’ADC alla RAM solo quando è l’ADC a scrivere nella RAM, altrimenti ci sarebbe un conflitto tra gli indirizzi provenienti dall’ADC e quelli provenienti dal processore (si veda figura 4).

Il microcontrollore, per scrivere e leggere i dati nella RAM, deve comunicare anche i 15 bit di indirizzo delle locazioni dei dati nella memoria.

Essendo appartenente alla famiglia dell’8051, il processore ha la caratteristica di fornire gli otto bit più significativi di indirizzo e di “latchare” altri otto indirizzi attraverso un latch esterno.

Quest’ultimo riceve in ingresso il bus dati da otto bit dal microcontrollore insieme ad un latch enable, che è il piedino ale del processore stesso, e fornisce in uscita un bus di otto bit che costituisce gli otto bit meno significativi di indirizzo .

Allora si implementa, attraverso il VHDL, un latch fisico ed il programma usato per fare ciò è chiamato “latch” anche se più propriamente esso agisce come un flip flop, essendo sincrono.

I dati del microcontrollore vanno verso la memoria per la scrittura e vanno in direzione opposta durante la lettura della RAM.

Per evitare conflitti, durante la scrittura si mette in alta impedenza il bus dati del processore nella direzione in cui i dati sono degli ingressi del microcontrollore, mentre nel caso di lettura si mettono in alta impedenza nella direzione in cui sono ingressi della memoria. La schematizzazione di quanto è stato detto è in figura 4.

Capitolo 3 : Programmazione in VHDL dell’FPGA

Figura 4 : tristate per evitare conflitti sui dati del microcontrollore

Come si vede da figura 4, il tristate che manda in uscita i dati nel caso di scrittura da parte del processore (tristate_scr) è abilitato (il suo enable è attivo basso) dal comando di scrittura (wrq_n a ‘0’) del microcontrollore.

Invece il tristate che manda in uscita i dati nel caso di lettura (tristate_lett) è abilitato dall’uscita della porta logica NAND (realizzata tramite VHDL) che ha come ingressi il negato dell’indirizzo più significativo del processore, l’uscita da arb, ack_micro, e il pin psen del microcontrollore.

Infatti psen è a ‘1’ quando il processore legge la RAM, mentre è a ‘0’ quando legge la FLASH; ack_micro è a ‘1’ quando l’arb concede al processore l’accesso alla RAM mentre a(15) è a ‘0’ quando si vuole accedere alla RAM (si veda figura 1 del capitolo 2) occupando quest’ultima i primi 32kbytes dello spazio di memoria dati del microcontrollore.

Analizziamo ora il blocco di programma corrector visto in figura 4.

Esso, insieme al programma hencoder, ha l’obiettivo di fare un controllo sui dati memorizzati nella memoria RAM attraverso un meccanismo di tipo EDAC (Error Detection And Correction); in particolare si fa in modo da rivelare fino a due errori nei dati e da correggerne uno solo ed in tal caso si parla di SCE-DDE (Single Correction Error-Double

Capitolo 3 : Programmazione in VHDL dell’FPGA

Detection Error), come è stato già visto nel capitolo 2).

Il corrector viene usato nella fase di lettura della RAM; esso riceve in ingresso sia i dati della RAM, sia quelli dell’EDAC e dà in uscita i dati corretti dell’EDAC e della RAM ed un segnale di errore che mette a ‘1’ per comunicare al processore la presenza di più di un errore che non è in grado di correggere, o a ‘0’ per comunicargli l’assenza di errore.

I dati in uscita dal corrector vengono memorizzati ciascuno in due registri da 8 e da 5 bit. La fase successiva è quella di scrittura dei dati, contenuti nei flip flop, all’interno della RAM e dell’EDAC.

Tale scrittura è abilitata dal blocco scrittura.

Questi dati o sono già in partenza corretti o sono stati corretti dal corrector nella fase di lettura.

Nella fase di scrittura, inoltre, il blocco hencoder produce, a partire dal bus dati del processore, i 5 bit del codice Hamming che saranno scritti nell’EDAC.

Per evitare conflitti sul bus dati essendo questo bidirezionale si mette un tristate tra i dati da scrivere nelle RAM e l’ingresso delle memorie; tale tristate viene attivato nel caso di scrittura da parte del microcontrollore o da parte dell’ADC.

Il programma le cui uscite comandano direttamente la scrittura o la lettura delle due RAM (comandano OE#, WE# e CS#) è “scrittura” rispettando la tabella di verità di figura 3.

Vengono riportati in figura 5 e 6 due diagrammi in cui sono raffigurati in blocchi i programmi VHDL finora nominati.

Si passa a descrivere come viene gestito il monitoraggio, caratterizzata dal controllo della selezione di una delle cinque grandezze, fornite in uscita dagli alimentatori e caratteristiche delle parti interne del propulsore.

In tale fase due multiplexer differenziali ricevono in ingresso un comando di abilitazione (“en” di figura 6) che attiva o meno il componente a seconda che detto comando abbia un valore logico alto o basso; inoltre ricevono due bit (A0 e A1 di figura 6) che selezionano una delle grandezze di ingresso e la mandano in uscita.

L’abilitazione dei multiplexer e la gestione della scelta della grandezza da controllare vengono eseguite attraverso gli indirizzi meno significativi provenienti dall’FPGA e destinati alle RAM.

Capitolo 3 : Programmazione in VHDL dell’FPGA

Capitolo 3 : Programmazione in VHDL dell’FPGA

Figura 6 : accesso alla RAM dal processore e dall’ADC e selezione della grandezza di controllo tramite multiplexer

Capitolo 3 : Programmazione in VHDL dell’FPGA

Documenti correlati