Per accedere ai vari dati contenuti in memoria (operandi) e manipolarli, per poi trasferirli negli opportuni registri, si deve fare uso di alcune tecniche di indirizzamento. Nel TMS320C31 esistono svariati modi per indirizzare la memoria, i quali si rivelano più utili in certe circostanze piuttosto che in altre. Si riporta qui di seguito una sommaria descrizione di alcuni di essi :
-Register addressing : l’operando è contenuto in un registro della CPU. Per esempio se si usa l’istruzione ABSF R1,R1 si intende puntare al contenuto del registro R1 per farne il suo valore assoluto, immagazzinando il risultato nel medesimo registro, ossia si sostituisce il vecchio operando con il nuovo risultato (R1=|R1|)
-Direct addressing: l’indirizzo dell’operando viene formato dalla concatenazione degli 8 LSBs del registro data-page pointer (DP) con i 16 LSBs provenienti dall’istruzione. Nella seguente figura è illustrato quanto suddetto con l’aggiunta di un esempio specifico che mostra come agisce una semplice istruzione di somma (ADDI @BCDEh, R7) sui vari registri.
![]()
Fig 1 – Metodo di formazione dell’operando nel direct addressing. Sotto è riportato un esempio nel caso dell’istruzione ADDI @BCDEh,R7.
-Indirect addressing : l’indirizzo dell’operando è contenuto in uno degli otto auxiliary registers (ARn). Si riporta qui di seguito lo schema dell’indirizzamento con un esempio.
![]()
Fig 2 – Indirect addressing. L’indirizzo dell’operando è contenuto nei 24 LSB dei registri ARn. Sotto è riportato un esempio nel caso dell’istruzione LDI *AR0,R0.
Come si può vedere dall’esempio, il contenuto di AR0 non varia dopo che l’istruzione è stata eseguita, tuttavia in alcuni casi può essere utile incrementarlo o decrementarlo di una quantità prefissata, (displacement) per farlo puntare ad una locazione di memoria differente, in una eventuale ripetizione dell’istruzione; il displacement può essere stabilito nei registri IRn in uno dei seguenti modi:
Nel caso in cui si usa una sola volta + o -, il contenuto di ARn viene modificato, ma non in maniera permanente; si ottiene ciò usando ++ o --.
-Immediate addressing : l’operando e contenuto direttamente nell’istruzione da eseguire e non può superare i 16 bit, come è illustrato successivamente.
![]()
L’operando è costituito dal numero 1.
-Circular addressing : è un indirizzamento speciale, che risulta utilissimo per la trattazione di molti algoritmi come la convoluzione o l’implementazione di filtri FIR, i quali richiedono l’utilizzo in memoria di un buffer circolare. Stabilita la lunghezza del buffer e l’indirizzo della sua prima locazione di memoria, tale indirizzamento punterà alle successive locazioni, fino al raggiungimento dell’ultima, per poi tornare a puntare alla prima casella di memoria. La lunghezza del buffer e l’indirizzo relativo al suo inizio vengono rispettivamente stabiliti nel registro BK e in uno degli ARn. La successiva figura illustra ciò che è stato appena esposto.
![]()
Fig 3 – Metodo d’indirizzamento circolare. Sulla sinistra si riporta una rappresentazione logica del metodo, mentre sulla destra una rappresentazione effetiva. Le locazioni di memoria verranno puntate dalla prima (start) all’ultima (end) per poi ricominciare di nuovo dalla prima, come se fossero disposte circolarmente.
Nel caso in questione tale indirizzamanto è stato impiegato per la realizzazione di un filtro FIR. L’equazione di un FIR, di lunghezza N, si può esprimere come:
y(n) = h(0) × x(n) + h(1) × x(n-1) + …+ h(N-1) × x(n-(N-1))
dove y(n) è il campione filtrato, le varie x sono gli ingressi del filtro in tempi differenti e h i coefficienti associati. Quindi per ottenere le y si possono costruire due buffer di memoria, uno per i campioni di ingresso e l’altro per i coefficienti, usando sul primo un indirizzamento di tipo circolare; come si può osservare dalla fig 4 si punta contemporaneamente il campione con il suo coefficiente associato, a cominciare dall’ultimo fino al primo . Per cui, tramite l’uso di altre istruzioni si ottiene la prima y(n). Nel ciclo successivo, il nuovo dato verrà sovrascritto all’ultimo campione e questa volta il puntamento inizierà da quella che prima era la penultima locazione; in altri termini è come se il puntatore del buffer dei campioni si fosse spostato di una posizione nel senso antiorario. Per cui dopo un numero di iterazioni, pari alla lunghezza del filtro, verrà sovrascritto il campione entrato nella prima iterazione.
![]()
Fig 4 – Applicazione dell’indirizzamento circolare per l’implementazione di un filtro FIR.
Home | Precedente | Successivo