Salta al contenuto
Note per Studenti Esercizio 30 · istruzione MAC con accumulatore a 32 bit e arrotondamento (tema d'esame luglio 2020)

Esercizio 30istruzione MAC con accumulatore a 32 bit e arrotondamento (tema d'esame luglio 2020)

Esame
In questa pagina 5

Testo (tema d'esame del 7 luglio 2020, terzo appello, problema 4). L'unità di moltiplicazione di un DSP esegue l'istruzione MAC (moltiplicazione e somma sull'accumulatore) sui due registri a 16 bit x0x_0 e y0y_0, il cui valore esadecimale è dato di seguito. La moltiplicazione è eseguita in modalità frazionaria (1.15) automatica, con segno, con arrotondamento, e il risultato è sommato, nello stesso ciclo di clock, all'accumulatore ACCACC a 32 bit. Indicare il valore esadecimale presente nella parte alta ACCHACCH dell'accumulatore al termine. Si faccia uso di arrotondamento ove necessario. Dati: x0=0x3FFFx_0=\texttt{0x3FFF}, y0=0xB000y_0=\texttt{0xB000}, ACC=0x3B00FFFFACC=\texttt{0x3B00FFFF}.


Teoria usata: Operazioni in virgola fissa - somma, prodotto e riallineamentoIn virgola fissa il processore opera sugli interi e non sa dov'è la virgola: tocca al programmatore. Regola 1: si sommano solo dati con lo stesso formato (stesso $m$). Regola 2: il prodotto di $n_1.m_1$ per $n_2.m_2$ ha $m_1+m_2$ bit frazionari e il doppio dei bit: va riallineato con uno shift a destra di $m_2$ posizioni (per riportarlo a $m_1$) o preso dalla parte alta. Con la normalizzazione frazionaria $1.15$ il prodotto è $2.30$ e basta uno shift a sinistra di 1 prima di prendere la parte alta. I fattori di scala si scelgono per evitare overflow e perdita di risoluzione.Operazioni in virgola fissa - somma, prodotto e riallineamento →, Architettura del repertorio di istruzioni - RISC, CISC, VLIW e indirizzamentoL'architettura è l'insieme delle risorse visibili al programmatore (istruzioni, modi di indirizzamento). RISC: poche istruzioni semplici, di uguale lunghezza, decodifica cablata, quasi tutte a 1 ciclo; CISC: molte istruzioni complesse, decodifica microprogrammata, più cicli. I DSP sono RISC "potenziati" (MAC, saturazione, barrel shifter, arrotondamento, VLIW, SIMD); i modi di indirizzamento tipici sono immediato, a registro, diretto, indiretto, con auto-incremento, circolare e a bit rovesciati (per la FFT).Architettura del repertorio di istruzioni - RISC, CISC, VLIW e indirizzamento →, Quantizzazione, fattori di scala e cicli limiteUn algoritmo di filtro o regolatore pensato per un processore ideale va adattato alla realtà: temporizzazionedistribuzione nel tempo delle operazioni di un algoritmo (l'algoritmo nella ISR dell'ADC, durata minore di $T_c$), acquisizione (condizionamento del segnale per sfruttare tutto il fondo scala dell'ADC), fattori di scala (normalizzazione intera o 1.15; evitare overflow), quantizzazione di ingresso, uscita, coefficienti e prodotti (sposta i poli, genera errori a regime e cicli limite). Una frequenza di campionamento troppo alta rende più critica la quantizzazione dei coefficienti: va scelta coerente con la lunghezza di parola.Quantizzazione, fattori di scala e cicli limite →.

Interpretazione dei dati

In formato frazionario 1.15 con segno, x0=0x3FFF=16383x_0=\texttt{0x3FFF}=16383, cioè 1638332768=0,49997\frac{16383}{32768}=0{,}49997 (quasi 0,50{,}5). y0=0xB000=45056y_0=\texttt{0xB000}=45056, bit di segno 1: 45056−65536=−2048045056-65536=-20480, cioè −2048032768=−0,625\frac{-20480}{32768}=-0{,}625. ACC=0x3B00FFFFACC=\texttt{0x3B00FFFF} è un numero positivo a 32 bit che in formato 1.31 vale 989 921 279231=0,4609\frac{989\,921\,279}{2^{31}}=0{,}4609.

Moltiplicazione

Il prodotto intero dei due codici è 16383⋅(−20480)=−335 523 840=0xEC00500016383\cdot(-20480)=-335\,523\,840=\texttt{0xEC005000} (in complemento a 2 a 32 bit): è un numero in formato 2.30 (15+1515+15 bit frazionari). La modalità frazionaria automatica sposta il risultato a sinistra di 1 bit (perché il prodotto di due frazioni 1.15 deve essere letto in 1.31): −335 523 840⋅2=−671 047 680=0xD800A000-335\,523\,840\cdot2=-671\,047\,680=\texttt{0xD800A000} (valore −0,3125-0{,}3125, coerente con 0,49997⋅(−0,625)=−0,312480{,}49997\cdot(-0{,}625)=-0{,}31248).

Somma sull'accumulatore

ACCnew=ACC+0xD800A000ACC_{new}=ACC+\texttt{0xD800A000} (somma modulo 2322^{32}, il secondo addendo è negativo): in decimale 989 921 279−671 047 680=318 873 599989\,921\,279-671\,047\,680=318\,873\,599, cioè ACCnew=0x13019FFF  (valore 0,1485 in 1.31).ACC_{new}=\texttt{0x13019FFF}\ \ (\text{valore }0{,}1485\text{ in 1.31}). Non c'è overflow (positivo più negativo: segni opposti).

Parte alta con arrotondamento

La parte alta dell'accumulatore è ACCH=0x1301ACCH=\texttt{0x1301} (troncamento) e la parte bassa è 0x9FFF\texttt{0x9FFF}. Per ridurre l'accumulatore da 32 a 16 bit con arrotondamento si somma metà LSB della parte alta (0x8000\texttt{0x8000}) prima di scartare la parte bassa: poiché 0x9FFF≥0x8000\texttt{0x9FFF}\ge\texttt{0x8000} (il primo bit scartato è 1), la parte alta si incrementa di 1: ACCH=0x1302(0,1485 in 1.15: 486632768=0,14850).\boxed{ACCH=\texttt{0x1302}}\qquad(0{,}1485\ \text{in 1.15: }\tfrac{4866}{32768}=0{,}14850).

Verifica del valore: 0,46096+0,49997⋅(−0,625)=0,46096−0,31248=0,148480{,}46096+0{,}49997\cdot(-0{,}625)=0{,}46096-0{,}31248=0{,}14848; in 1.15: 0,14848⋅32768=4865,5→4866=0x13020{,}14848\cdot32768=4865{,}5\to4866=\texttt{0x1302} ✓ (la parte bassa 0x9FFF\texttt{0x9FFF} vale circa 0,620{,}62 LSB della parte alta, quindi si arrotonda per eccesso).

Errori comuni

  • Dimenticare lo shift a sinistra di 1 della modalità frazionaria (il prodotto sarebbe interpretato come 2.30).
  • Trattare y0=0xB000y_0=\texttt{0xB000} come positivo (4505645056): è negativo (−20480-20480).
  • Sommare la parte alta del prodotto alla parte alta di ACCACC senza tenere conto della parte bassa e del riporto.
  • Troncare invece di arrotondare quando la parte bassa è ≥0x8000\ge\texttt{0x8000}.

Versione ripasso

Testo. MAC frazionaria 1.15 con arrotondamento: x0=0x3FFFx_0=\texttt{0x3FFF}, y0=0xB000y_0=\texttt{0xB000}, ACC=0x3B00FFFFACC=\texttt{0x3B00FFFF}; ACCHACCH finale (luglio 2020).

Teoria collegata