¿Cuál es la forma correcta de implementar las operaciones de desplazamiento a la izquierda utilizando multiplicadores?

2

Necesito que se realice una operación de desplazamiento a la izquierda en VHDL. La entrada es de 24 bits y la cantidad de desplazamiento es de 16 bits como máximo.

Las operaciones de desplazamiento a la izquierda de n son sinónimos de multiplicación con 2 ^ n, lo que quiere decir que:

  

x < < n = x * 2 ^ n.

Normalmente, la implementación de una operación de desplazamiento a la izquierda en VHDL con una cantidad de desplazamiento variable implementará un multiplexor, por ejemplo, la implementación de un desplazador de 16 bits en una entrada de 24 bits creará un multiplexor de 16 a 1. La cantidad de desplazamiento n seleccionará una de las 16 salidas posibles de 24 bits. Este enfoque puede crear multiplexores masivos que luego limitarán Fmax en el diseño.

He encontrado que la alternativa a esto es usar un multiplicador para la operación de cambio. El uso de un multiplicador duro en lugar de un mux creado a partir de recursos lógicos FPGA llevará a una mejor Fmax en el diseño. En este caso, la entrada de 24 bits será un operando y un 2 ^ n donde n tiene un valor máximo de 16 será el otro operando. Aquí también, n es una entrada para controlar la cantidad de cambio.

Tengo una confusión aquí; al usar un multiplicador tendremos que generar la cantidad 2 ^ n a partir de la cantidad de turno n. Esto requerirá una tabla de consulta. En este caso, se convertirá en un multiplicador de 16 a 1 donde n selecciona la salida mux de 16 bits. Ya que en este caso también terminamos con un multiplexor grande, ¿no se anula el propósito de usar un multiplicador?

    
pregunta quantum231

1 respuesta

0

Si su desplazamiento de entrada es de 4 bits de ancho, necesita 16 LUT para las 16 entradas del multiplicador, y genere 00001, 00010, 00100 ...

A<=INPUT;
OUTPUT <= A  * B;
B(0)<='1' WHEN SHIFT="0000" ELSE '0';
B(1)<='1' WHEN SHIFT="0001" ELSE '0';
B(2)<='1' WHEN SHIFT="0010" ELSE '0';
*etc...*

Con los multiplicadores "libres", puede ser más pequeño que una palanca de cambios de barril.

Por lo general, los desplazadores de barril están hechos con multiplexores en cascada. Algo así:

X0 <= INPUT & '0' WHEN SHIFT(0)='1' ELSE '0' & INPUT;
X1 <= X0 & "00" WHEN SHIFT(1)='1' ELSE "00" & X0;
X2 <= X1 & "0000" WHEN SHIFT(2)='1' ELSE "0000" & X1;
OUTPUT <= X2 & "00000000" WHEN SHIFT(3)='1' ELSE "00000000" & X2;

También puede usar las bibliotecas estándar de VHDL y dejar que el sintetizador decida qué implementación es la mejor:

OUTPUT <= ieee.numeric_std.shift_left(INPUT,to_integer(SHIFT));
    
respondido por el TEMLIB

Lea otras preguntas en las etiquetas