arquitectura-interna-fpga

Arquitectura interna de una FPGA: LUT, flip-flops y routing

  • 5 min

La arquitectura de una FPGA es una matriz de bloques lógicos conectados mediante interconexiones programables. Al configurar ambos recursos, el mismo chip puede comportarse como un procesador, un controlador de vídeo o muchos otros circuitos digitales.

Para entender cómo consigue cambiar de circuito, tenemos que meter el bisturí y mirar dentro del silicio. A grandes rasgos, veremos una gran cantidad de “islotes” de lógica programable rodeados por un mar de conexiones configurables.

Estos “islotes” suelen llamarse Logic Cells (Celdas Lógicas) o Logic Elements (LE), y dentro de ellos encontramos los dos protagonistas de nuestra historia: la LUT y el Flip-Flop.

Aunque cada fabricante (Xilinx/AMD, Intel/Altera, Lattice) usa nombres comerciales ligeramente distintos (CLB, LAB, Slice), el concepto subyacente es idéntico en el 99% de las FPGAs modernas.

La LUT (look-up table)

La LUT (Look-Up Table o tabla de búsqueda) es una pequeña memoria que implementa una función lógica a partir de su tabla de verdad.

Cuando estudias electrónica digital clásica, aprendes sobre puertas lógicas: AND, OR, NOT, XOR, NAND… Podrías pensar que dentro de una FPGA hay millones de estas puertas diminutas esperando a ser conectadas. Pues no.

Una FPGA no presenta al diseñador una colección de puertas AND y OR individuales. En su lugar, utiliza LUT configurables para implementar la mayoría de las funciones combinacionales.

¿Cómo funciona una LUT?

Imagina una LUT como una pequeña memoria RAM. Si queremos implementar una puerta AND de 2 entradas, no construimos el circuito de la puerta AND. Lo que hacemos es guardar su tabla de la verdad en la memoria de la LUT.

Entrada AEntrada BSalida (Guardada en la LUT)
000
010
100
111

Cuando las entradas cambian, la LUT simplemente “mira” en su memoria qué valor debe devolver para esa combinación.

Al cambiar los valores almacenados en esta pequeña memoria, la misma estructura física puede comportarse como una AND, una OR, una XOR o cualquier función lógica compleja que te imagines.

Físicamente, una LUT se construye usando Multiplexores y celdas de memoria SRAM. Una LUT típica de hoy en día suele tener 4 o 6 entradas (LUT4 o LUT6). Una sola LUT6 puede implementar cualquier función booleana de hasta 6 variables.

El flip-flop tipo D

Si la LUT es el cerebro que calcula, el Flip-Flop es la memoria que recuerda.

La lógica combinacional (las LUTs) es instantánea y efímera. En cuanto cambian las entradas, cambia la salida. Pero para construir sistemas complejos (contadores, máquinas de estados, CPUs) necesitamos retener información y sincronizarla con el tiempo.

Para eso, justo a la salida de cada LUT, encontramos un Flip-Flop tipo D.

El Flip-Flop captura el valor de salida de la LUT únicamente cuando llega una señal de reloj (el famoso Clock).

El multiplexor de salida (bypass)

Dentro de la celda lógica, solemos tener un pequeño multiplexor que nos permite elegir qué sale hacia el resto del chip:

  1. La salida directa de la LUT (Lógica Combinacional pura).
  2. La salida registrada por el Flip-Flop (Lógica Secuencial).

Esto nos da una flexibilidad total para diseñar circuitos síncronos o asíncronos según necesitemos.

Routing o interconexión programable

Ya tenemos las celdas lógicas que calculan y guardan datos. Ahora, ¿cómo conectamos la salida de la celda 1 con la entrada de la celda 500?

Aquí entra el Routing Fabric o matriz de interconexión.

Si miramos el chip al microscopio, veremos que la mayor parte del área no son LUTs, sino cables y conmutadores (switches). Es como una inmensa centralita telefónica.

El software de la FPGA se encarga de activar o desactivar miles de transistores de paso para crear “caminos” eléctricos entre los distintos bloques lógicos.

El Routing es generalmente el recurso más crítico. Un mal ruteado puede hacer que tu diseño sea lento porque la señal tarda demasiado en viajar de un lado a otro del chip (problemas de Timing).

Otros bloques (hard IP)

Si las FPGAs solo tuvieran LUTs y Flip-Flops, serían muy flexibles pero ineficientes para ciertas tareas pesadas. Por eso, los fabricantes incluyen bloques de silicio especializado, conocidos como Hard IP (Intellectual Property).

Estos bloques ya están “fabricados” físicamente (como en un ASIC) y nosotros solo los configuramos. Son mucho más rápidos y eficientes que intentar hacer lo mismo uniendo miles de LUTs.

Los más comunes son:

Block RAM (BRAM)

Son bloques de memoria RAM dedicados cuyo tamaño depende de cada familia (por ejemplo, 4 Kbit o 36 Kbit por bloque). Son muy útiles para hacer buffers de vídeo, colas FIFO o pequeñas memorias de procesador.

Bloques DSP (digital signal processing)

Son multiplicadores hardware. Una LUT es muy mala multiplicando números grandes. Los bloques DSP pueden hacer operaciones como A * B + C en un solo ciclo de reloj a velocidades vertiginosas. Son la razón por la que las FPGAs dominan en radar, audio y telecomunicaciones.

PLL y MMCM para gestionar el reloj

Bloques analógicos y digitales que permiten tomar el reloj de entrada (por ejemplo, 12 MHz) y multiplicarlo, dividirlo o desplazar su fase para generar otros relojes.

Cómo encajan los bloques

Podemos resumir una celda lógica genérica (Logic Cell) con este esquema mental:

  1. Entran señales.
  2. Pasan por una LUT (que decide qué función lógica aplicar).
  3. El resultado puede guardarse en un Flip-Flop (para sincronizarse con el reloj).
  4. Sale a través de la matriz de Routing hacia otra celda.

Entender esto es importante porque, cuando escribamos código en Verilog, no estaremos dando órdenes a un procesador. Estaremos describiendo cómo conectar estas cajitas.