Modalità di indirizzamento nei dsPIC30F

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.

Figura 1. Lo spazio di memoria di un dsPIC30F6014

Figura 1. Lo spazio di memoria di un 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).

Figura 2. Indirizzamento indiretto con post-modifica

Figura 2. Indirizzamento indiretto con post-modifica

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.

Figura 3. Indirizzamento indiretto con pre-modifica

Figura 3. 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.

Figura 4. Indirizzamento indiretto con offset di registro

Figura 4. Indirizzamento indiretto con offset di 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.

Figura 5. Indirizzamento indiretto con offset literal

Figura 5. Indirizzamento indiretto con offset literal

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).

Figura 6. Calcolo dell’indirizzo con il metodo PSV

Figura 6. Calcolo dell’indirizzo con il metodo PSV

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.

Figura 7. Indirizzamento con istruzioni Table

Figura 7. Indirizzamento con istruzioni Table

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.

Figura 8. Il registro MODCON per il Modulo Addressing

Figura 8. Il registro MODCON per il Modulo Addressing

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.

Figura 9. Un esempio di Buffer Circolare

Figura 9. 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.

Figura 10. Riordinamento in bit-reversed

Figura 10. Riordinamento in bit-reversed

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.

Figura 11. Il registro XBREV

Figura 11. Il registro XBREV

In figura 12 è riportato un esempio di indirizzamento bit-reversed.

Figura 12. Esempio di ordinamento in bit-reversed

Figura 12. Esempio di ordinamento in bit-reversed

L’ordinamento  in questo caso avviene leggendo il buffer sequenziale di ingresso e scrivendo sul buffer di uscita in bit-reversed.

Scarica subito una copia gratis

Una risposta

  1. Maurizio Di Paolo Emilio Maurizio 10 febbraio 2016

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend