Un desplazador de barril es un circuito digital que puede desplazar una palabra de datos por un número específico de bits sin el uso de ninguna lógica secuencial , solo lógica combinacional pura , es decir, proporciona inherentemente una operación binaria . Sin embargo, en teoría también se puede utilizar para implementar operaciones unarias , como el desplazamiento lógico a la izquierda , en casos en los que esté limitado por una cantidad fija (por ejemplo, para la unidad de generación de direcciones ). Una forma de implementar un desplazador de barril es como una secuencia de multiplexores donde la salida de un multiplexor está conectada a la entrada del siguiente multiplexor de una manera que depende de la distancia de desplazamiento. Un desplazador de barril se utiliza a menudo para desplazar y rotar n bits en microprocesadores modernos, [1] normalmente dentro de un solo ciclo de reloj .
Por ejemplo, tomemos un desplazador de barril de cuatro bits, con entradas A, B, C y D. El desplazador puede ciclar el orden de los bits ABCD como DABC , CDAB o BCDA ; en este caso, no se pierde ningún bit. Es decir, puede desplazar todas las salidas hasta tres posiciones a la derecha (y así hacer cualquier combinación cíclica de A, B, C y D). El desplazador de barril tiene una variedad de aplicaciones, incluyendo ser un componente útil en microprocesadores (junto con la ALU ).
Los desplazadores más rápidos se implementan como barras cruzadas completas, de una manera similar al desplazador de 4 bits representado anteriormente, solo que más grande. Estos incurren en el menor retraso, con la salida siempre un retraso de una sola compuerta detrás de la entrada que se va a desplazar (después de permitir el pequeño tiempo necesario para que el decodificador de recuento de desplazamientos se estabilice; esta penalización, sin embargo, solo se incurre cuando cambia el recuento de desplazamientos). Sin embargo, estos desplazadores de barras cruzadas requieren n 2 puertas para desplazamientos de n bits. Debido a esto, el desplazador de barril a menudo se implementa como una cascada de multiplexores 2×1 paralelos, lo que permite una gran reducción en el recuento de puertas, que ahora crece solo con n x log n ; sin embargo, el retraso de propagación es mayor, creciendo con log n (en lugar de ser constante como con el desplazador de barras cruzadas).
Para un desplazador de barril de 8 bits, se utilizan dos señales intermedias que se desplazan en cuatro y dos bits, o pasan los mismos datos, en función del valor de S[2] y S[1]. Esta señal se desplaza luego mediante otro multiplexor, que está controlado por S[0]:
int1 = IN , si S[2] == 0 = EN << 4, si S[2] == 1 int2 = int1 , si S[1] == 0 = int1 << 2, si S[1] == 1 OUT = int2, si S[0] == 0 = int2 << 1, si S[0] == 1
Los cambiadores de barril más grandes tienen etapas adicionales.
La palanca de cambios en cascada tiene la ventaja adicional sobre la palanca de cambios de barra transversal completa de no requerir ninguna lógica de decodificación para el conteo de cambios.
La cantidad de multiplexores necesarios para una palabra de n bits es . [2] A continuación se enumeran cinco tamaños de palabras comunes y la cantidad de multiplexores necesarios:
Coste de la ruta crítica en FO4 (estimado, sin retraso de cable):
Un uso común de un desplazador de barril es en la implementación de hardware de aritmética de punto flotante . Para una operación de suma o resta de punto flotante, los significados de los dos números deben estar alineados, lo que requiere desplazar el número más pequeño hacia la derecha, aumentando su exponente , hasta que coincida con el exponente del número más grande. Esto se hace restando los exponentes y usando el desplazador de barril para desplazar el número más pequeño hacia la derecha por la diferencia, en un ciclo.