Barrel shifter
# Barrel shifter

Un barrel shifter è un circuito digitale progettato per eseguire operazioni di bit shift (spostamento di bit) su un data word (costituito da un numero specifico di bit) in un tempo corrispondente ad un ciclo di clock. Può essere implementato come una sequenza di multiplexer in cui l'uscita di un dato multiplexer è connessa all'ingresso di quello successivo.

Come esempio, si consideri un barrel shifter che opera su una word di 4 bit ABCD: il circuito può ruotare l'ordine dei bit ABCD effettuando uno o più spostamenti verso destra senza alcuna perdita di bit, in modo da ottenere in uscita DABC, CDAB, BCDA o ABCD. Il barrel shifter viene impiegato in diverse applicazioni, in particolare come componente nei microprocessori (insieme all'ALU).

## Implementazione

Un barrel shifter è spesso implementato come collegamento in parallelo di multiplexer a 2 ingressi ed 1 uscita. In un barrel shifter con 4 bit in ingresso viene usato un segnale intermedio che effettua lo shift di 2 bit, o fa passare lo stesso dato, in base al valore di S[1]. Questo segnale viene poi spostato da un altro multiplexer, controllato da S[0]:

Barrel shifter di dimensioni maggiori presentano dei passi aggiuntivi.

## Costi

Il numero di multiplexer richiesti per elaborare una word di n bit è $\scriptstyle n\log _{2}n$. A seconda della dimensione della word in ingresso (solitamente 128, 64, 32, 16 o 8 bit), per realizzare un barrel shifter ci vorranno:

* per 128 bit: $\scriptstyle 128\times \log _{2}(128)=128\times 7=896$ multiplexer
* per 64 bit: $\scriptstyle 64\times \log _{2}(64)=64\times 6=384$ multiplexer
* per 32 bit: $\scriptstyle 32\times \log _{2}(32)=32\times 5=160$ multiplexer
* per 16 bit: $\scriptstyle 16\times \log _{2}(16)=16\times 4=64$ multiplexer
* per 8 bit: $\scriptstyle 8\times \log _{2}(8)=8\times 3=24$ multiplexer

## Usi

Un barrel shifter viene usato comunemente per l'implementazione hardware dell'aritmetica in virgola mobile. In un'operazione di addizione o sottrazione in virgola mobile, le mantisse dei 2 operandi devono essere allineate, il che richiede lo shift del più piccolo dei 2 operandi verso destra, incrementando il suo esponente, finché non coincide con l'esponente dell'operando più grande. Ciò viene realizzato sottraendo gli esponenti ed usando il barrel shifter per spostare l'operando più piccolo verso destra in un solo ciclo di clock. Impiegando un semplice shifter, uno spostamento di n bit richiedebbe invece n cicli di clock.

