La asignación precisa depende del tipo de LUT implementado. Una configuración muy común es una LE con una LUT de 16 entradas (4 entradas), dividida en dos mitades para obtener dos salidas. Cada una de las medias LUT se parece a esto:
simular este circuito : esquema creado usando CircuitLab
La configuración de LE contiene los valores que vienen de la izquierda (datos de la tabla), así como algunos valores que se aplican a otras puertas alrededor de la LUT, por ejemplo, un indicador de selección que puede extraer la tercera entrada de la parte superior de un LE vecino La mitad de la mesa. De esa manera, puede implementar fácilmente un sumador:
left right cin out cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
La señal cout
de la tabla para el bit 0 está conectada a la señal cin
del bit 1, por lo que obtiene un sumador completo con carry.
La resta agrega el complemento de dos del valor del lado derecho, y la multiplicación agrega el valor del lado izquierdo desplazado en N bits a la izquierda si el bit N se establece en el valor del lado derecho (por lo tanto, un multiplicador de 9x9 necesita un bit de 9 bits). sumador, un sumador de 8 bits, un sumador de 7 bits, ...).
Estas operaciones pueden combinarse si hay un paquete de tablas más óptimo; por ejemplo, puedo representar el complemento de dos necesario para la resta en la tabla de búsqueda para el sumador. Esa optimización es un problema difícil ya menudo no existe una solución óptima, pero encontrar una que coincida con los requisitos de tiempo suele ser suficiente.
El mapeo c=(a+b)*c-d
requiere lógica combinatoria para (a+b)*c-d
, y una etapa de registro que guarda el valor de c
. El registro necesita una señal adicional para activar la actualización, de lo contrario terminarías con (a+b)*((a+b)*c-d)-d
bastante rápido.