L’Architettura del processore Blackfin 2

Il core Blackfin
Lo stesso core blackfin consiste di diverse unità, c'è un'unità aritmetica, che consente di eseguire operazione SIMD, dove semplicemente con una singola istruzione si può operare su flussi di dati multipli. Il Blackfin è inoltre un'architettura load store, che significa che i dati con cui si lavora devono essere letti dalla memoria utilizzati per calcolare il risultato e memorizzati di nuovo. E' presente inoltre un'unità di indirizzamento che supporta il dual data fetch, quindi in un singolo ciclo possiamo interpretare due pezzi di informazione, tipicamente dati e coefficienti di filtro. E' presente inoltre un sequenziatore che gestisceil flusso del programma sul Blackfin, e ci sono diversi file di registri, per esempio per dati o per l'indirizzamento.

L'Aritmetica Blackfin
Il primo passo è l' unità aritmetica. L'unità aritmetica di sicuro compie le operazioni aritmetiche nel Blackfin. Ha una doppia ALU da 40 bit, che esegue operaziooi a 16, 32 o 40 bit, aritmetiche e logiche. Sono presenti anche un paio di moltiplicatori 16 per 16 bit, così è possibile utilizzare una coppia di moltiplicatori a 16 bit allo stesso tempo e quando sono combinati con i registri accumulatori ALU a 40 bit è possibile fare un MACS doppio nello stesso ciclo. E' presente anche un circuito di shift che è usato per eseguire shift, rotate e altre operazioni bit.

Registri dei dati Blackfin
I registri dei dati sono divisi in sezioni, qui è presente un file register che è composto da 8 registri a 32bit che vanno da R0 a R7. Possono essere usati per mantenere valori a 32bit. Ovviamente quando si eseguono operazioni di DSP, la maggior parte dei dati è nel formato a 16bit quindi possono contenere coppie di 16 bit. R0.H e R0.l ad esempio corrispondono alle metà superiore e inferiore del registro R0 che può conteneredue valori a 16bit. Sono presenti inoltre una coppia di accumulatori a 40 bit A0 e A1, che sono usati tipicamente per accumulare le operazioni di moltiplicazione e spazio a precisione estesa per i prodotti intermedi.

Operazioni ALU a 16bit
 
Il grafico è una sintassi algebrica per il linguaggio assembly. La sintassi è abbastanza intuitiva e rende molto facile capire cosa fanno le istruzioni. Il primo esempio è una singola operazione a 16 bit, R6.H = R3.H + R2.L; così questa è solo la notazione del linguaggio assembly. Con questa operazione si intende prendere la metà superiore della R3 a cui si aggiunge la metà inferiore di R2 e si mette il risultato nella parte superiore della R6.Il prossimo esempio è una doppia operazione a 16 bit. R6=R2*|-R3. Il primo punto è leggere R2 ed R3 come una coppia di registri a 32 bit, ma che l' operazione +|- dice che è una ooperazione a 16 bit. Il punto successivo è prende la metà inferiore di R3 e sottrarla dalla metà inferiore di R2 con il risultato che andrà nella metà inferiore di R6. Inoltre l' operazione prende la metà superiore di R3 a cui si aggiunge la metà superiore di R2 e posizione il risultato nella metà superiore di R6. Questo effettivamente è un solo ciclo di operazione. L' ultimo esempio è una quadrupla operazione a 16 bit dove si combina solo due operazioni a 16 bit nella stessa istruzione. E' presente una virgola tra queste due per indicare queste quattro operazioni nello stesso ciclo. Questo è usato quando sono richieste la somma e la differenza di coppie di valori a 16 bit nei due operandi. Notare che R0 e R1 sono usati in entrambi i lati della virgola in questo esempio.

Operazioni ALU a 32 bit
Ovviamente il processore Blackfin può eseguire operazioni aritmetiche a 32bit come mostrato R6=R2+R3; esempio simile ai precedenti, la differenza è solo un singolo operatore che dice all'assemblatore che si sta eseguendo un'operazione a 32bit. In altre parole R2 e R3 contengono valori a 3bit e non coppie di valori da 16bit. Si può anche eseguire una doppia operazione a 32bit dove prendiamo la somma e la differenza tra, in questo caso, R1 e R2. Ci sono inoltre operazioni eseguite in un singolo ciclo.
 

Operazioni Dual MAC
Abbiamo accennato ai moltiplicatori, in questo esempio particolare abbiamo una coppia di operazioni MAC eseguite allo stesso tempo, quindi so A1-=R2.H*R3.H, A0+=R2.L*R3.L; Di nuovo due operazioni di moltiplicazione separate, R2 e R3 sono i registri a 32 bit contenenti i dati di ingresso e possiamo mescolare e confrontare i semi registri in uso come operandi di input. Di nuovo questa è effettivamente un'operazione da un solo ciclo, inoltre può essere combinato con un dual data fetch.

Circuito di Shift
Il processore Blackfin ha anche un circuito di shift, il quale permette lo shift, il rotate di ogni nuero di bit in una metà del registro, a 32 o 40 bit, tutto in un singolo ciclo. E' anche usato per compiere operazioni sui bit individuali in un registro a 32 bit in quel file registro, per esempio si può impostare, cancellare, o togliere individualmente un bit senza modificare nessun altro bit nel registro. Si può anche usare per vedere se un particolare bit è stato cancellato. Sono presenti anche istruzioni per permettere l' estrazione e il deposito da campi. Con questa si specifica la posizione iniziale del campo, quanti bit sono interessati, e si può estrarre questo campo fuori dal registro e riportarlo nei bit bassi di un altro registro. Usato per la manipolazione dello scambio di bit.

Alu video a 8bit
Il Blackfin possiede inoltre quattro alu video a 8bit, e lo scopo di questi dispositivi è di permettere all'utente di eseguire fino a quattro operazioni ad otto bit in un singolo ciclo. Questo perchè la maggior parte delle operazioni video tipicamente lavora con valori di 8bit. Ad esempio se bisogna eseguire quattro somme o sottrazioni a 8bit dove ci sono quattro componenti per ogni operando basta sommarli o sottrarli. E' possibile eseguire quattro medie a 8bit,dove è possibile fare la media tra coppie di pixel o gruppi di quattro pixel. C'è inoltre un'istruzione SAA, Sottrai, Assoluto, Accumula. Quello che fa è di prendere due insiemi di quattro pixel, prendere il valore assoluto della differenza tra essi accumula i risultati. Infatti sono usati quattro accumulatori a 16bit. Viene usato per algoritmi per la stima di un movimento.
 

Operazioni ALU a 8 bit
Tutte le istruzioni ALU quadruple a 8 bit prendono efettivamente ancora un ciclo per l' esecuzione, così sono abbastanza efficienti. Ciò che si mostrerà in seguito è solo l' impostazione tipica. Sono necessari operandi a quattro byte, si partirà con un doppio campo di registro a 32 bit, che fornisce 8 byte, e si selezionerà ogni 4 byte contigui in una riga dal ognuno di questi campi. E’ presente un operando il secondo che sostiene i quattro bit dell’ALU.

Ulteriori Istruzioni aritmetiche
Il Blackfin supporta inoltre un numero di ulteriori istruzioni che aiutano a velocizzare i cicli interni di diversi algoritmi, come uno XOR tra bit, infatti se si sta creando un registro di scorrimento a retroazione lineare, ed è probabile che sia necessario nel caso di calcoli CRC, o se si sta lavorando sulla generazioni di sequenze di numeri pseudo casuali, ci sono delle istruzioni che incrementano la velocità del processo. Ancora, lo XOR tra bit e il Multiplexing del flusso di bit sono usati per velocizzare operazioni come un codificatore convoluzionale. C'è inoltre la somma con segno,confronto, selezione che può essere usato per facilitare le decodifiche di Viterbi. C’è inoltre il supporto alla compatibilità con lo standard IEEE 1180 per la trasformata a coseni discreti bidimensionale otto per otto. L’addizione e la sottrazione con pre-scale up e down, si possono sommare o sottrarre valori a 32 bit e poi moltiplicarli per 16 o dividerli per 16 prima di restituire un valore a 16 bit. C’è inoltre una ricerca vettoriale dove si può scorrere lungo un vettore di dati a una coppia di numeri a 16bit alla volta, ricerca per il massimo o il minimo nel vettore.

L’unità di Indirizzamento
L’unità di indirizzamento è responsabile nel generare gli indirizzi per il raggiungimento dei dati. Sono presenti due DAG, o Data Address Generator unità aritmetiche che permettono la generazione di indirizzi indipendenti a 32 bit permettendo di cercare dovunque nella memoria del Blackfin, internamente o esternamente. L’altra cosa da fare è notare che è possibile generare oltre due indirizzi, o eseguire oltre due raggiungimenti nello stesso tempo.

Registri di indirizzo
I registri di indirizzo sono contenuti nell’unità di indirizzamento. Ci sono sei registri puntatori generici, P0 fino a P5. Sono usati per puntamenti generali. Si inizializzano con un valore a32 bit per puntare ad ogni locazione nella memoria del Blackfin., e sono utlizzati per per operazioni di fetch a 8, 16 e 32 bit. Blackfin possiede inoltre quattro insiemi di registri che sono usati nel DSP. Questo include fetch a 16 e 32 bit. Ci sono alcune operazioni particolari nel DSP che vengono eseguite tramite l’utilizzo di questi particolari registri come indirizzamento circolare, inversione di bit ecc.

Indirizzamento
I Blackfin hanno anche uno stack dedicato e puntatori a frame come mostrato qui. L’ unità di indirizzamento supporta anche le seguenti operazioni; Blackfin può indirizzare solo verso uno specifico indice di registro, puntatore di registro per puntare a qualche indirizzo in memoria che andremo si raggiungerà. Si può anche fare un tipo di operazione post-modificata dove il registro che si specifica sarà modificato dopo il raggiungimento dei dati che è fatto automaticamente per prepararlo alla successivo operazione di raggiungimento dati. Il buffering circolare, ad esempio, è supportato usando questo metodo. Blackfin può fornire un indirizzo con un offset dove un point di registro potrebbe essere direzionato all' indirizzo base della tabella e lo si vuole raggiungere con qualche offset conosciuto da questo indirizzo di base. Quando si opera in modo che la modifica dei valori non è applicata, non è eseguito nessun aggiornamento del puntatore.

Esempio di Buffer Circolare
Prima di tutto, i buffer circolari sono usati molto nelle applicazioni DSP, dove si hanno dati in ingresso in un flusso continuo, ma il filtro necessita solo di avere una piccola porzione di questi, quindi i buffer circolari hanno di solito la grandezza dei filtri che stiamo usando. Ciò che succede è che si ha un puntatore, riferente ai dati che stiamo raggiungendo dal buffer circolare. Per passare attraverso i dati è necessario fare un controllo quando si aggiorna il puntatore per avere la sicurezza di non oltrepassare i limiti del buffer circolare. Se si oltrepassasse si deve riavvolgere il puntatore per essere rimesso nei limiti del buffer circolare. Questo passaggio è fatto senza nessun overhead nell'hardware del Blackfin. Si può anche allocare questi buffer dovunque nella memoria senza restrizioni grazie all'indirizzo base dei registri. In questo particolare esempio ciò che si ha è un buffer, che contiene undici elementi a 32 bit, e l' obbiettivo è entrare attraverso ogni quarto elemento e rimanere nei limiti del buffer circolare. Ciò che si farà è inizializzare la base e l'indice del registro. La base del registro è l' indirizzo di dove questo buffer è in memoria, e l'indice del registro è l'indirizzo di partenza di dove si inizierà a prendere. Entrambi questi valori sono inizializzati a 0 in questo esempio.

Il Sequencer
L'ultimo blocco in questo core è il senquencer stesso. La funzione del sequencer è generare indirizzi per raggiungere le istruzioni. Usa una varietà di registri nei quali seleziona quale sia l'indirizzo successivo che si andrà a prendere. Il Sequencer è anche responsabile dell'allineamento. Allinea istruzioni non appena vengono prese. Il Sequencer prende sempre 64 bit a volta dalla memoria, ma c'è una differente dimensione dei codici operativi, e ciò fa sì che riallinei fondamentalmente codici a 16, 32 o 64 bit prima di mandarli al resto della pipeline.

Il Flusso del Programma
Il Sequencer è anche responsabile della gestione degli eventi. Gli eventi potrebbero essere interruzioni  o eccezioni e saranno trattati brevemente. Anche alcune istruzioni condizionali sono gestite dal Sequencer. Il Sequencer aggiusta diversi tipi di flusso di programma, il flusso lineare è il più comune dove si esegue solo il codice linearmente in modo fortemente lineare. Il codice loop è gestito dove si potrebbe avere una sequenza di istruzioni che si vuole far eseguire più volte. Si può avere un programma con ridirezione permanente di flusso con un'istruzione di tipo jump dove semplicemente viene eseguito un salto ad una locazione di memoria e poi l'esecuzione prosegue da quel punto. Operazioni di tipo Sub-Routine dove viene chiamata un subroutine, a qualche indirizzo, viene eseguita e restituisce il controllo al programma principale, proseguendo dall'istruzione successiva alla chiamata.

Registro del Sequencer
Il Sequencer ha un numero di registri che sono usati nel controllo del flusso di programma sul Blackfin. E' presente un registro di stato aritmetico, ogni volta che si esegue un' operazione aritmetica si potrebbero modificare dei bit in questo resgistro. Ad esempio AZ per zero, AN per il negativo. Il Sequencer usa questi bit di stato per l'esecuzione condizionale delle istruzioni. I Blackfin hanno anche un numero di registri di indirizzo di ritorno, RETS, RETI, RETX per esempio, per subroutine o qualche numero di eventi. Questi bloccano l'indirizzo di ritorno a 32 bit per qualche flusso di interrupt, qualunque chiamata o sorta di interrupt. I Blackfin hanno anche due set di registri di gestione loop dell'hardware; LC, LT, LB, loop counter, indirizzo all'inizio del loop, alla fine.

Sono usati per gestire lo zero looping overhead. Lo zero looping overhead indica che una volta che questi registri sono impostati, non c'è nessun ciclo di CPU per decrementare il contetore di loop, controllare se ha raggiunto lo zero, saltare indietro all'inizio del loop. Tutto questo è gestito senza nessun controllo a priori, solo inizializzando questi registri. Due gruppi di questi registri consentono di avere due livelli di annidamento di zero overhead looping.
Pipeline delle istruzioni.

Il Blackfin ha anche una pipeline delle istruzioni ed è responsabile dei clock ad altà velocità che sono possibili. L'unica cosa da notare è che la pipeline è completamente interbloccata. Ciò significa che nel caso di un hazard di dati, come una coppia di istruzioni una dopo l'altra, un'istruzione imposta un registro che la successiva si pensa utilizzi, se non è pronto perchè è ancora nella pipeline, il Sequencer inserisce automaticamente dei cicli di stallo e mantiene in attesa la seconda istruzione fino a che la prima non sia completata. In questo caso al ciclo N+9 è indicato che la pipeline è piena. Quando la pipeline è piena ogni ciclo di clock risulta in un'altra istruzione che esce dalla pipeline, o abbandaona lo stadio di scrittura dei risultati. Effettivamente, in ogni ciclo di clock è eseguita un'altra istruzione, ed è in questo modo che si ottiene la velocità di esecuzione di un'istruzione per core ad ogni ciclo di clock.

Gestione degli Eventi in Blackfin

Blackfin gestisce anche gli eventi. Gli eventi possono essere classificati come interrupt, di solito generati dall' hardware quando il DMA ha finito di trasferire, o il timer ha raggiunto lo zero. Si possono anche generare interrupt software. Altri eventi includono le eccezioni. Queste potrebbero essere il risultato in una condizione d'errore,  in presenza di un overflow o in mancanza di CPLB, o qualcosa del genere, o il software che richiede il servizio. Esisteun modo per generare via software eccezioni intenzionalmente. La gestione degli eventi è divisa tra il controller degli eventi di core e il controller degli interrupt di sistema. Il controller degli eventi di core e il core clock domain, i controller degli interrupt di sistema e il SCLK domain. Il controller degli eventi di core ha 16 livelli assocciati ad esso e distribuisce le richieste in base alla priorità. I nove livelli più bassi del controller degli eventi di core sono fondamentalmente disponibili la mappatura degli interrupt periferici. Ogni livello ha un registro del vettore di interrupt a 32 bit associato ad esso. Questo può essere inizializzato con l' indirizzo di partenza dell' ISR in modo che quando il particolare livello è attivato, quello è l' indirizzo da dove iniziare a prelevare il codice.

Interrupt di sistema e di core
Blackfin dispone del SIC, o System Interrupt Controller parte del gestore di Interrupt. Il mapping ad uno specifico core di una richiesta di interrupt da parte di una periferica avviene qui. Questo permette di cambiare la priorità di una particoalre richiesta di interreput di una periferica. Ciò che andrà ad essere visto in seguito è un esempio con il meccanismo  del gestore di interrupt BF533. Il lato sinistro è la parte del controller degli interrupt di sistema, mentre l' altra è la parte del controller degli interrupt del core. Di nuovo 16 livelli a core e ora si andrà a vedere che sono priorizzati. Il livello 0 o IVG0 ha la più alta priorità nel sistema, il livello 15 ha la più bassa. Nel caso più interrupt arrivino nello stesso momento, il più alto verrà servito per primo.

Istruzioni a lunghezza variabile
Il Blackfin ha anche delle istruzioni di lunghezza variabile. Ci sono tre principali lunghezze del codice di cui il Blackfin si occupa. Le istruzioni a 16 bit comprendono la maggior parte delle istruzioni di controllo di tipo, come anche il recupero dei dati, per cui queste sono lunghe tutte 16 bit, per migliorare la densità del codice. Un altro tipo sono le istruzioni a 32 bit. Queste includono la maggior parte delle istruzioni di controllo di tipo che hanno valori immediati, per esempio caricare registri con valori immediati o cose di questo tipo. Anche la maggior parte delle istruzioni aritmetiche hanno una lunghezza di 32 bit. C'è anche un punto per le istruzioni a 64 bit, e questo permette di combianre un codice a 32 bit con una coppia di istruzioni a 16 bit. Di solito un' operazione aritmetica con uno o più prelievi di dati. Nell' esempio c'è un' operazione di doppio accumulo in parallelo con un doppio prelievo di dati a 32 bit. Questo operatore pipe parallelo è usato per chiamare l' assembler a combinare queste operazioni allo stesso tempo. Quello che avviene è come un codice operativo a 64bit, queste tre istruzioni attraversano la pipeline insieme quindi sono eseguite contemporaneamente.

Compilazione Istruzioni
Quando il codice è compilato e linkato, il linker alloca il codice nello spazio immediatamente disponibile nella memoria così le istruzioni non sono imbottite, per esempio alla più grande istruzione che il Blackfin può gestire. Ciò si traduce in assenza di  spazio sprecato. Come programmatore non bisogna preoccuparsi di ciò, il sequencer ha una caratteristica di allineamento quindi legge i 64 bit dell' istruzione dalla memoria e esegue l' allineamento. Così estrae i codici a 16, 32 e 64 bit. Se succede che scavalca il limite di un indirizzo ottale lo riallineerà prima di passarlo al resto della pipeline.

FIR 18Bit Filter Exemple
Blackfin è ottimizzato per compiere operazioni come il filtraggio FIR o FFT. Questi sono esempi di un filtro FIR a 16 bit. Infatti c'è un flusso di dati di input e due filtri applicati allo stesso flusso dati. R0 e R1 sono usati come due registri di input. Ro contiene due pezzi di dati di input a 16 bit, R1 contiene i coefficienti del filtro a 16 bit. I dati sono nel circuito ritardante, il coefficiente del filtro è preso dal buffer, il primo coefficiente del filtro sarà usato con i primi due pezzi dei dati e poi gli altri pezzi di dati saranno presi mentre il prossimo coefficiente del filtro è usato con altri 2 pezzi di dati. L' esempio del codice qui in basso mostra solamente due istruzioni multiple accumulate in parallelo con ciascuna con singolo o doppio prelievo di dati. In aggiunta per fare questi prelievi di dati i puntatori sono impostati per puntare al blocco di dati successivo.

Risorse aggiuntive
Vi ringraziamo per esservi presi il tempo di leggere questa presentazione del processore ADI Blackfin. Se desiderate conoscere di più o volete acquistare alcuni di questi dispositivi, potete cliccare sulla lista, o chiamare la nostra linea diretta. Per ulterioir informazioni tecniche potete visitare il sito di ADI - link - o se preferite parlare con uqalcuno, chiamate i numeri mostrati, o usate la live chat online.

Leggi la versione inglese: Blackfin Processor Core Architecture

Scarica subito una copia gratis
Tags:

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend