
Tutti i meccanismi per l’indirizzamento della memoria nel dsPIC: la tecnica PSV (Program Space Visibility), la tecnica con istruzioni Table, l’indirizzamento Modulo Addressing e la tecnica Bit-Reversed.
Introduzione
Per illustrare le varie modalità di indirizzamento per un dsPIC30F è necessario innanzitutto chiarire quale è la struttura della memoria dei dispositivi di questa famiglia. La figura 1 mostra la mappa di memoria del dsPIC30F6014.
Lo spazio fisico termina all’indirizzo 0x27FF e la memoria può essere pensata composta da celle a 16bit in cui ciascun byte ha un proprio indirizzo (indirizzo pari per il byte meno significativo e dispari per quello più significativo). Lo spazio tra 0x0000 e 0x07FF è dedicato agli Special Function Registers (SFR) mentre lo spazio RAM general purpose è allocato a partire dall’indirizzo 0x0800. Tale spazio viene visto come lineare e unidimensionale sia dalle istruzioni MCU sia dalle istruzioni DSP di tipo non MAC. Le istruzioni MAC possono invece gestire lo spazio RAM organizzandolo in una matrice bidimensionale. I primi 8Kbyte dello spazio di memoria sono indirizzabili direttamente da una istruzione e per questo motivo tale spazio viene detto Near Data Space. Il restante spazio può essere mappato nel program space utilizzando un meccanismo noto come Program Space Visibility e che verrà illustrato più avanti.
Modalità di indirizzamento
Sono previste quattro diverse modalità di indirizzamento: accesso diretto da file register o memoria, accesso diretta da registro, accesso indiretto da registro, accesso da operando immediato. Il primo modo prevede l’utilizzo di un registro che è in realtà un indirizzo dello spazio di memoria ed è il modo comunemente usato nella programmazione dei PIC. Il secondo modo consente un accesso diretto al registro W (che in realtà è un array di registri W0..W3), per cui gli operandi di una istruzione che fa uso di questo tipo di indirizzamento dovranno trovarsi in W. Le istruzioni che utilizzano un operando immediato hanno un valore (literal o costante) di 16 bit incluso nella codifica dell’istruzione.
Indirizzamento indiretto da registro
Viste le possibili varianti, l’indirizzamento indiretto da registro merita una particolare attenzione. Esso può avvenire in quattro modi diversi: con pre-incremento o pre-decremento, con post-incremento o post-decremento, con offset da registro, con offset literal. La figura 2 mostra l’indirizzamento indiretto con post-modifica (incremento o decremento).
Con questa tecnica il contenuto di W viene modificato dopo che è avvenuto l’accesso alla memoria. L’operatore di post-modifica viene posto tra parentesi quadre. La figura 2 riporta inoltre lo stato di W e della RAM prima (a sinistra) e dopo (a destra) l’esecuzione dell’istruzione ADD. Nell’esempio viene preso il contenuto della cella di memoria il cui indirizzo è in W1, viene sommato al contenuto di W2 ed il risultato viene messo in W3. Una volta effettuata questa operazione W1 viene incrementato di 2 e W3 viene decrementato di 2. Utilizzando questa tecnica in 8 bit gli incrementi e i decrementi sono di 1 anziché 2. La figura 3 mostra invece l’indirizzamento indiretto con pre-modifica.
In questo caso i registri vengono modificati (incrementati o decrementati) prima di eseguire l’operazione. Nel caso dell’esempio W1 viene decrementato, quindi il suo contenuto viene interpretato come indirizzo di memoria dal quale si preleva il dato da sommare a W2. Il risultato viene posto all’indirizzo ottenuto decrementando di 2 il contenuto di W3. In figura 4 è riportato un esempio di indirizzamento indiretto con offset da registro.
In questo caso l’indirizzo del sorgente è dato dalla somma dei contenuti di W1 e W2: il contenuto della cella indirizzata viene spostato all’indirizzo puntato da W3 quindi W3 viene decrementato di 2. Il contenuto dei registri W1 e W2 non viene alterato dall’operazione. L’ultima variante di indirizzamento indiretto è riportata in figura 5 in cui l’indirizzo del sorgente è dato dalla soma del contenuto di W1 e della costante 0x20.
Il contenuto della cella così indirizzata viene spostato all’indirizzo puntato da W3 che viene incrementato al termine dell’operazione.
Indirizzamento in memoria programma con il metodo PSV
L’architettura dei dsPIC10F consente l’indirizzamento di dati memorizzati nell’area programma. Uno dei meccanismi di accesso è il Program Space Visibility (PSV) che verrà analizzato nel presente paragrafo. Questo meccanismo consente di mappare 32Kbyte di spazio dati in una qualsiasi pagina da 16Kword nella memoria programma o nella EEPROM dati. L’accesso ai dati è consentito in sola lettura per mantenere la consistenza con lo stesso blocco in RAM. La figura 6 mostra come viene determinato l’indirizzo della memoria programma a partire dall’indirizzo effettivo (contenuto in W).
L’indirizzamento PSV viene attivato solo quando il bit 15 del puntatore allo spazio dati vale 1 (ovvero si sta indirizzando una cella di indirizzo superiore a 0x8000). In questo caso il bit 15 viene ignorato ed i rimanenti 15 bit dell’indirizzo vengono concatenati con gli 8 bit del registro PSVPAG ottenendo un indirizzo a 23 bit. Il bit 23 viene azzerato via hardware ottenendo così l’indirizzo a 24 bit della memoria programma. Le locazioni della memoria programma indirizzate con il metodo PSV devono contenere, negli 8 bit più significativi, una istruzione NOP o un codice operativo non valido (ad esempio 0x3F) in modo da prevenire l’esecuzione accidentale di una istruzione non voluta.
Indirizzamento in memoria programma usando istruzioni Table
L’uso delle istruzioni Table è un diverso meccanismo per indirizzare lo spazio di memoria programma. Le istruzioni Table sono 4, due per la lettura e due per la scrittura dei dati:
TBLRDL Ws, Wd
TBLRDH Ws, Wd
TBLWTL Ws, Wd
TBLWTH Ws, Wd
Le quattro istruzioni esistono anche orientate al byte (TBLRDL.B, ecc…). Ws e Wd sono rispettivamente il registro sorgente e destinatario e l’indirizzamento usato per gli operandi è del tutto simile a quello usato per le classiche istruzioni MCU. La tecnica per ottenere l’indirizzo è riassunta in figura 7.
L’indirizzo viene ottenuto concatenando i 16 bit di W (usato come puntatore) e gli 8 bit del registro TBLPAG. Si noti che a differenza del meccanismo PSV, il bit 15 viene ora considerato come bit di indirizzo valido. Il bit 23 dell’indirizzo determina se l’accesso è alla memoria programma/EEPROM dati (bit 23 a 0) oppure ad un registro speciale (Device Configuration Register) il cui contenuto può essere modificato in run-time. Ad esempio se W0=0x1000 e TBLPAG=0x01, l’istruzione TBLRDL [W0], W3 mette in W3 i 16 bit meno significativi letti dall’indirizzo 0x011000 ottenuto concatenando i valori di TBLPAG e W0.
Modulo addressing
Per comprendere al meglio la tecnica Modulo Addressing è necessario richiamare il concetto di Buffer Circolare. Il Buffer Circolare è una regione di memoria utilizzata per memorizzare un array di dimensione fissa (non superiore ai 64Kbyte) in modo ciclico, ovvero una volta riempito l’array il dato successivo viene nuovamente memorizzato all’inizio. Se durante la lettura/scrittura dati nel Buffer Circolare viene fatto un accesso ad un indirizzo al di fuori del limite del buffer, la CPU opera una correzione automatica (eseguendo una operazione di modulo con la dimensione del buffer) generando così l’indirizzo corretto. Il meccanismo di correzione degli indirizzi dipende dal come il buffer circolare viene gestito:
- per un buffer ad incremento la correzione fatta dalla CPU solo quando l’indirizzo è al di sopra del limite superiore del buffer;
- per un buffer a decremento la correzione viene effettuate quando l’indirizzo coinvolto è al di sotto del limite inferiore del buffer;
- per un buffer bidirezionale valgono entrambi i meccanismi illustrati precedentemente.
Per configurare questo particolare tipo di indirizzamento viene usato il registro MODCON la cui struttura è riportata in figura 8.
I bit XMODEN e YMODEN consentono di abilita- re questo indirizzamento negli spazi X ed Y della memoria (si ricorda che nel caso di istruzioni MAC la memoria è organizzata come matrice bidimensionale), i bit XWM consentono di utilizzare W come puntatore allo spazio X ed analogamente i bit YWM consentono di usare W come puntatore allo spazio Y. La dimensione del buffer circolare è determinata dai registri XMODSRT e XMODEND nello spazio X e da YMODSRT e YMODEND nello spazio Y. La figura 9 mostra un esempio di buffer circolare.
Si noti che in questo esempio il buffer è circolare e quando il puntatore W2, trovandosi alla fine del buffer, viene incrementato, il suo valore viene corretto in modo da puntare all’inizio del buffer.
Indirizzamento bit-reversed
L’indirizzamento bit-reversed è una peculiarità del dsPIC30F e risulta particolarmente utile nell’implementazione dell’algoritmo FFT. Dato l’indirizzo di un particolare elemento di un array, l’hardware del dsPIC è in grado di calcolare l’indirizzo dell’elemento successivo nella sequenza bit-reversed. L’algoritmo FFT riordina i dati nella sequenza bit-reversed ottenuta invertendo la sequenza dei bit che indica la posizione nell’array come mostrato in figura 10.
La configurazione di questo indirizzamento avviene mediante i registri MODCON e XBREV. I bit BWM di MODCON (figura 8) consentono di selezionare W come puntatore. Solo W15 non è supportato come puntatore in quanto il suo utilizzo è come puntatore allo Stack, per cui selezionando W15 come puntatore al buffer bit-reversed si disabilita di fatto l’indirizzamento bit-reversed. Il bit BREN del registro XBREV (figura 11) abilita l’indirizzamento bit-reversed mentre i bit XB dello stesso registro costituiscono il fattore di correzione per l’indirizzo.
In figura 12 è riportato un esempio di indirizzamento bit-reversed.
L’ordinamento in questo caso avviene leggendo il buffer sequenziale di ingresso e scrivendo sul buffer di uscita in bit-reversed.

Un’ottima guida di indirizzamento della memoria per i dspic che si stanno affacciando nel mercato dei digital-power, offrendo un pieno controllo digitale ed un notevole miglioramento dell’efficienza nei sistemi di alimentazione.