Introducción

Las FPGA conforman actualmente la máxima evolución de los PLDs (Programmable Logic Device), definidos éstos como circuitos integrados en los que se pueden programar ecuaciones lógicas booleanas, tanto combinatorias como secuenciales. Existen actualmente una gran variedad de estos chips, y algunos de ellos pueden contener hasta 10,000 compuertas lógicas. Así mismo, las FPGA (Field Programmable Gate Array) son circuitos lógicos programables directamente por el usuario, lo cual requiere de herramientas de costo relativamente bajo, como lo son el software de desarrollo y el dispositivo grabador. La grabación o programación de uno de estos dispositivos se puede llevar a cabo en milisegundos. La figura 1 muestra como es físicamente un PLDs producido por la empresa Xilinx.

¿Qué es una FPGA?

Básicamente, un dispositivo FPGA es un dispositivo semiconductor que contiene bloques de lógica cuya interconexión y funcionalidad se puede programar. La lógica programable puede reproducir desde funciones tan sencillas como las llevadas a cabo por una compuerta lógica o un sistema que combine hasta complejos sistemas en un chip. Históricamente las FPGAs surgen como una evolución de los conceptos desarrollados en las PLAs (Programmable Logic Array) y los CPLDs (Complex Programmable Logic Device). La figura 2 muestra una tarjeta FPGA Altera con sus respectivas entradas, salidas y conexiones:

Figura 2: FPGA Altera

Figura 2: FPGA Altera

Una jerarquía de interconexiones programables permite a los bloques lógicos de una FPGA ser interconectados según la necesidad del diseñador del sistema. Estos bloques lógicos e interconexiones pueden ser programados después del proceso de manufactura por el usuario/diseñador, de esta forma una FPGA puede desempeñar cualquier función lógica necesaria.

Una tendencia reciente ha sido combinar los bloques lógicos e interconexiones de las FPGA con microprocesadores y periféricos relacionados, para formar un sistema programable en un chip. Además, muchas FPGA modernas soportan la reconfiguración parcial del sistema, permitiendo que una parte del diseño sea reprogramada, mientras las demás partes siguen funcionando. Este es el principio de la idea de la computación reconfigurable, o de los sistemas reconfigurables.

FPGA versus otras tecnologías

1. FPGA versus CPLD.

Ambos son chips de lógica digital pero ellos tienen diferentes características. Las FPGAs contienen hasta 100 mil bloques lógicos, mientras que los CPLD contienen a lo más 100 bloques lógicos, ambos con flip-flops. Además, las FPGAs pueden contener funciones aritméticas como sumatorias, comparadores y memoria RAM; lo que conlleva a contener diseños digitales grandes. Sin embargo, los CPLDs poseen tiempos de entrada/salida más rápidos que las FPGA.

2. FPGA versus Microcontrolador

Los microcontroladores están basados en una arquitectura CPU y ejecutan las instrucciones de una manera secuencial. En contra parte, las FPGAs son dispositivos de lógica programable y el algoritmo se ejecuta de una manera paralela.

3. FPGA versus ASIC

Los FPGA son muy utilizados por fabricantes que producen tecnología a baja escala, los cuales no pueden justificar la producción de ASICs (Circuito Integrado de Aplicación Específica) por los bajos volúmenes de dispositivos que venden. Los FPGAs tienen una funcionalidad similar, a costos menores y con una velocidad ligeramente menor, sin embargo tienen un mayor consumo de potencia y no pueden abarcar sistemas tan complejos como ellos. A pesar de esto, las FPGAs tienen las ventajas de ser reprogramables (lo que añade una enorme flexibilidad al flujo de diseño), sus costes de desarrollo y adquisición son mucho menores para pequeñas cantidades de dispositivos y el tiempo de desarrollo es también menor. También los FPGAs se utilizan como prototipos, los cuales se pueden depurar y permiten refinar el diseño. Con el software de diseño se puede simular en hardware antes de mandar a fabricar el ASIC correspondiente.

Arquitectura General de las FPGAs

Una FPGA consiste en arreglos de varios bloques programables (bloques lógicos) los cuales están interconectados entre sí con celdas de entrada/salida mediante canales de conexión verticales y horizontales, tal como muestra la figura 3. En general, se puede decir que posee una estructura bastante regular, aunque el bloque lógico y la arquitectura de ruteo varían de un fabricante a otro.

03

Figura 3: Arquitectura básica de un FPGA

La estructura de una FPGA, comparada con la de un CPLD, es mucho más regular, y se encuentra más orientada a diseños que manejan mayores transferencias de datos y registros, en tanto que los CPLD implementan más eficientemente diseños con una parte combinable más intensa.

La figura 4 muestra a primera vista la estructura correspondiente de cada dispositivo.

04

Figura 4: Esquema de bloques de la arquitectura interna de una CPLD y una FPGA

Cada bloque lógico de un CPLD tiene su propia parte combinacional que permite realizar un gran número de funciones lógicas programables, más un biestable (flip-flop) asociado al pin de entrada/salida. Por su parte, la arquitectura de la FPGA cuenta también con un bloque lógico con una parte combinacional y una parte secuencial. La parte combinacional es mucho más simple que la existente en una CPLD, mientras que la parte secuencial posee uno o dos biestables, que no están generalmente asociados a un pin de entrada/salida, pues los bloques lógicos se distribuyen regularmente en todo el dispositivo.

Bloques Lógicos Configurables (CLB)

El bloque lógico consta de una parte combinacional, que permite implementar funciones lógicas booleanas, más una parte secuencial que permite sincronizar la salida con una señal de reloj externa e implementar registros.
La parte combinacional varía de un fabricante a otro. A continuación, explicaremos dos de ellas:

1. Bloque lógico basado en LUT (look-up table):  Una LUT es un componente de celdas de memoria SRAM que almacenan una tabla de verdad, como la de la figura 5. Las direcciones de las celdas son las entradas de la función lógica que se quiere implementar, y en cada celda de memoria se guarda el resultado para cada una de las combinaciones de las entradas. En una LUT de n x 1 es posible implementar cualquier función lógica de n entradas.

Figura 5: Bloque lógico basado en LUT

Figura 5: Bloque lógico basado en LUT

2. Bloque lógico basado en multiplexores: El bloque lógico basado en multiplexores, como el de la figura 6, se caracteriza porque requiere mucha menos lógica que el anterior basado en una LUT, y, en consecuencia, ocupa mucha menos área. De este modo, se pueden implementar mayor número de bloques lógicos en el mismo espacio, o, para el mismo número de bloques disponer de más espacio para incrementar los recursos de ruteo. Como contrapartida, no se puede implementar cualquier función lógica de n entradas, como ocurría con las LUTs. En caso necesario, esta función lógica hay que repartirla entre varios bloques lógicos.

Figura 6: Bloque lógico basado en multiplexores

Figura 6: Bloque lógico basado en multiplexores

Como se mencionó anteriormente, la estructura de los bloques lógicos y las formas en que éstos pueden ser interconectados, tanto salidas como entradas de los bloques, varía de acuerdo al fabricante. En general un bloque lógico tiene menos funcionalidad que la combinación de sumas de productos y macroceldas de un CPLD, pero como cada FPGA tienen una gran cantidad de bloques lógicos, es posible implementar grandes funciones utilizando varios de ellos en cascada.

Interconexión entre bloques lógicos

Además de los bloques lógicos, también es importante la tecnología utilizada para crear las conexiones entre los canales y tecnología de programación. Las más importantes son las siguientes:

  • Antifusible (Antifuse): Una FPGA que utiliza este tipo de tecnología sólo se puede programar una sola vez, y utilizan algo similar a un fusible para las conexiones. La diferencia entre un fusible y un antifusible es que el primero se desactiva deshabilitando la conexión, en cambio, para el segundo se produce una conexión cuando son programados, por lo que normalmente se encuentran abiertos. La desventaja obvia es que no son reutilizables, pero por otro lado disminuyen considerablemente el tamaño y costo de los dispositivos.
  • SRAM (StaticRAM): Estas guardan la configuración del circuito, es decir, que las SRAM son utilizadas como generadores de funciones y además son usadas para controlar multiplexores, que están incluidos en las FPGAs, y la interconexión entre bloques. En éstas el contenido se almacena mediante un proceso de configuración en el momento de encendido del circuito que contiene la FPGA, ya que al ser SRAM, el contenido de la memoria se pierde cuando se deja de suministrar energía; la información binaria de las celdas SRAM generalmente se almacena en memorias seriales EEPROM conocidas como memorias de configuración o celdas de configuración. En el momento de encendido del circuito toda la información binaria es transferida a los bloques e interconexiones de la FPGA mediante el proceso de configuración el cual es generalmente automático, dado que la propia FPGA contiene un circuito interno que se encarga de hacer toda la programación.
  • Flash: Las FPGAs basadas en celdas flash recogen las ventajas principales de las dos técnicas anteriores situándose en un punto intermedio. Su tamaño es más reducido que el de una celda de SRAM, aunque sin llegar al tamaño reducido de un antifusible; son reprogramables, no obstante la velocidad de programación es más lenta que en el caso de una SRAM; y son no volátiles, por lo que no necesitan dispositivos auxiliares para guardar la configuración interna, como en el caso de la SRAM.

Una FPGA que tiene una gran cantidad de canales de interconexión tiende a tener pequeños bloques lógicos con muchas entradas y salidas en comparación con el número de compuertas que contiene el bloque. Este bloque lógico se caracteriza por ser bastante sencillo, con poca lógica en su parte combinacional. Este es el caso del bloque lógico a base de multiplexores.

Este tipo de FPGA generalmente utiliza tecnología antifusible. Por otra parte, una FPGA que tiene una estructura pequeña en canales de interconexión tiende a tener grandes bloques lógicos con pocas entradas y salidas, en comparación con el número de compuertas que existe en el bloque. Este es el caso del bloque lógico basado en LUTs, que permiten implementar cualquier función lógica del mismo número de entradas. Este tipo de FPGA generalmente está fabricado con tecnología SRAM.
Con respecto a las FPGAs basadas en celdas Flash, éstas suelen emplear un bloque lógico sencillo para incrementar los recursos de rutado, como ocurre con las FPGAs de antifusibles.
Finalmente, una arquitectura con bloques pequeños permite utilizar todos los recursos del dispositivo, sin embargo se tiene que utilizar un gran número de éstos para poder implementar funciones lógicas de varios términos, lo cual genera un tiempo de retardo por cada bloque implementado. Cuando el tamaño del bloque es grande sucede lo contrario, en este tipo de bloques es posible utilizar un gran número de compuertas lo que permite implementar funciones lógicas de varios términos con pocos bloques. El hecho de que el tamaño del bloque sea grande no afecta la frecuencia máxima de trabajo, ya que existe una gran cantidad de compuertas que pueden ser utilizadas en la función en forma paralela, siendo el mismo tiempo de retardo para todas. Sin embargo, cuando las funciones son pequeñas en comparación con el tamaño del bloque, no es necesario utilizar todas las compuertas que soporta el bloque, por lo que este tipo de bloques no son precisamente las más indicadas para desempeñar pequeñas funciones.

Bloques entrada/salida (IOB)

Al igual que en los CPLDs, la función de un bloque de entrada/salida es permitir el paso de una señal hacia dentro o hacia el exterior del dispositivo. Además debe contar con recursos tales como:

  • Salidas configurables como TRI-STATE u open-collector.
  • Entradas con posibilidad de pull-up o pull-down programables.
  • Registros de salida.
  • Registros de entrada.
07

Figura 7: Bloque entrada/salida (IOB) de XC4000

En la Figura 7 tenemos como ejemplo un diagrama en bloques simplificado de un bloque de entrada/salida de la familia 4000 de las FPGA de Xilinx.

Tiempos de propagación

El cálculo de los retardos incluidos en un diseño basado en FPGAs no es tan fácil de predecir como en el caso de un CPLD. La propia estructura matricial de estos circuitos hace difícil saber cuántas celdas básicas, interconexiones programables o bloques de entradas/salida se utilizan para cada señal. Esto hace necesario conocer cómo se ha realizado la interconexión entre los bloques en el dispositivo para tener un conocimiento exacto de los retardos de propagación debidos a cada uno.
Debido a este factor, las herramientas de desarrollo para FPGAs suelen incluir un analizador de tiempos, que sirve para calcular tiempos de set-up, de clock-to-output, y sobre todo dar una estimación de la frecuencia máxima de operación.

Programación

La tarea del programador es definir la función lógica que realizará cada uno de los CLB, seleccionar el modo de trabajo de cada IOB e interconectarlos.

El diseñador cuenta con la ayuda de entornos de desarrollo especializados en el diseño de sistemas a implementarse en una FPGA. Un diseño se puede llevar a cabo, ya sea como un diagrama esquemático, o haciendo uso de un lenguaje de programación especial.

Las figuras 9, 10 y 11 muestran cómo se realiza la programación de una tarjeta FPGA marca Altera, en lenguaje VHDL.

Figura 9. Código compilación VHDL.

Figura 9. Código compilación VHDL.

Figura 10. Compilación, síntesis y análisis de código generado.

Figura 10. Compilación, síntesis y análisis de código generado.

Figura 11. Análisis y síntesis de código realizada exitosamente con lenguaje VHDL.

Figura 11. Análisis y síntesis de código realizada exitosamente con lenguaje VHDL.

Los lenguajes de programación para FPGA son conocidos como HDL (Hardware Description Language), siendo los más utilizados:

VHDL

Es el acrónimo que representa la combinación de VHSIC (Very High Speed Integrated Circuit) y HDL. Es un lenguaje textual de alto nivel, definido por el IEEE (ANSI/IEEE 1076-1993), utilizado para la descripción del hardware de los sistemas digitales. Entre sus principales características se pueden mencionar:

  • Lenguaje estándar.
  • Soporte de las principales compañías proveedoras de herramientas CAD (Diseño Asistido por Computadora).
  • Existen formas metódicas para el diseño de máquinas de estadosfiltros digitales, bancos de pruebas etc.
  • Flexibilidad de implementación en circuitos integrados, el código VHDL es portable entre herramientas, aunque normalmente es necesario hacer ajustes según el dispositivo.
  • Es un lenguaje popular cuyo número de usuarios sigue aumentando.

Un ejemplo de código con VHDL es el siguiente:

library IEEE;
    use IEEE.STD _Logic_1164, all;
    entity LATCH_IF _ELSEIF is
               port(En1, En2, En3, A1, A2,A3: in std_logic;
                               Y: out std_logic);
    end entity LATCH_IF_ELSEIF;
    architecture RTL of LATCH_IF_ELSEIF is
    begin
               process(En1, En2, En3, A1, A2,A3)
               begin
                 if (En1 =’1’) then
                   Y<= A1;
               elseif(En2 =’1’) then
                   Y<= A1;
               elseif(En3 =’1’) then
                   Y<= A3;
               end if;
       end process;
    end architecture RTL;

Verilog

Algunas veces llamado Verilog HDL, soporta el diseño, prueba e implementación de circuitos analógicosdigitales y de señal mixta con diferentes niveles de abstracción.

  • Más compacto que el lenguaje VHDL, menos detallado.
  • Semejante al lenguaje C.
  • No tiene estructuras, apuntadores o funciones recursivas.
  • El concepto de tiempo, muy importante en un HDL, no se encuentra definido.
  • Difiere de los lenguajes de programación convencionales, en que la ejecución de las sentencias no es estrictamente lineal. Un diseño en Verilog consiste de una jerarquía de módulos. Los módulos son definidos con conjuntos de puertos de entrada, salida y bidireccionales. Internamente un módulo contiene una lista de cables y registros. Las sentencias concurrentes y secuenciales definen el comportamiento del módulo, describiendo las relaciones entre los puertos, cables y registros. Las sentencias secuenciales son colocadas dentro de un bloque begin/end y ejecutado en orden secuencial, pero todas las sentencias concurrentes y todos los bloques begin/end son ejecutadas en paralelo en el diseño. Un módulo puede contener una o más instancias de otro módulo para definir un sub-comportamiento.

El mismo ejemplo de lenguaje VHDL pero escrito con Verilog quedaría de la siguiente manera:

module LATCH_IF_ELSEIF (En1, En2, En3, A1, A2,A3, Y);
               input En1, En2, En3, A1, A2,A3;
               output Y;
               reg Y;
               always @(En1 or En2 or En3 or A1 or A2 or A3)
                               if(En1 == 1)
                               Y=A1;
               else if(En2 == 1)
                               Y=A2;
               else if(En3 == 1)
                               Y=A3;
end module

ABEL

Es el acrónimo de Advanced Boolean Expression Language. Es un lenguaje de descripción de hardware y un conjunto de herramientas de diseño para programar dispositivos lógicos programables (PLDs). Entre sus principales características se cuentan:

  • Permite describir un diseño concurrentemente mediante tablas de verdad o ecuaciones lógicas.
  • Permite la programación secuencial con máquinas de estados.
  • Permite definir vectores de prueba, patrones de entradas y salidas, que pueden ser programados en el hardware. La estructura de los vectores de prueba es similar a la de las tablas de verdad.

Tradicionalmente, los PLDs eran programados sólo utilizando lenguajes de programación especializados, sin embargo en fechas recientes han surgido herramientas que ofrecen métodos adicionales de programación, como por ejemplo, la plataforma de programación gráfica LabVIEW integra también un módulo para desarrollo de proyectos en FPGAs. Otros métodos para diseñar circuitos son la captura de esquemas con herramientas CAD y los diagramas de bloques, pero éstos no son prácticos en diseños complejos.

Aplicaciones

Cualquier circuito de aplicación específica puede ser implementado en una FPGA, siempre y cuando ésta disponga de los recursos necesarios. Las aplicaciones donde más comúnmente se utilizan las FPGA incluyen a los DSP, radio definido por software, sistemas aeroespaciales y de defensa, prototipos de ASICs, sistemas de imágenes para medicina, sistemas de visión para computadoras, reconocimiento de voz, bioinformática, emulación de hardware de computadora, entre otras. Cabe notar que su uso en otras áreas es cada vez mayor, sobre todo en aquellas aplicaciones que requieren un alto grado de paralelismo.

Fabricantes

A principios del año 2007, el mercado de las FPGA se ha colocado en un estado donde hay dos productores de FPGA de propósito general que están a la cabeza del mismo, y un conjunto de otros competidores quienes se diferencian por ofrecer dispositivos de capacidades únicas.

  • Xilinx es uno de los dos grandes líderes en la fabricación de FPGA.
  • Altera es el otro gran líder.
  • Lattice Semiconductor lanzó al mercado dispositivos FPGA con tecnología de 90nm. En adición, Lattice es un proveedor líder en tecnología no volátil, FPGA basadas en tecnología Flash, con productos de 90nm y 130nm.
  • Actel tiene FPGAs basados en tecnología Flash reprogrammable. También ofrece FPGAs que incluyen mezcladores de señales basados en Flash.
  • QuickLogic tiene productos basados en antifusibles (programables una sola vez).
  • Atmel es uno de los fabricantes cuyos productos son reconfigurables (el Xilinx XC62xx fue uno de éstos, pero no están siendo fabricados actualmente). Ellos se enfocaron en proveer microcontroladores AVR con FPGAs, todo en el mismo encapsulado.
  • Achronix Semiconductor tienen en desarrollo FPGAs muy veloces
  • MathStar, Inc. ofrecen FPGA que ellos llaman FPOA (Arreglo de objetos de matriz programable).

Metodología de diseño

El proceso de diseño lógico con PLDs, en este caso empleando una FPGA, se resume en tres grandes etapas:

  • Diseño lógico
  • Implementación del diseño
  • Verificación del diseño.

Dentro del diseño lógico, los pasos involucrados son los mismos que en cualquier diseño digital, combinatorio o secuencial, y se pueden subdividir en los siguientes:

• Definir el problema.
• Generar un diagrama a bloques.
• Obtener la tabla de la verdad.
• Derivar las ecuaciones lógicas que describen la operación del diseño.

La implementación del diseño consiste en seleccionar y usar las herramientas, tanto de hardware y software, necesarias para la traducción de los resultados a un mapa de fusibles para la programación del chip. Esta fase consiste en:

• Selección de la FPGA.
• Crear el archivo de ecuaciones.
• Correr el software para generar el archivo mapa de fusibles.
• Configurar el programador universal.
• Programar el chip

La etapa final consiste en la verificación del diseño en donde la correcta programación de la FPGA es comprobada, por medio de técnicas de simulación. Los pasos de la verificación son:

• Generación de vectores de prueba.
• Simulación del funcionamiento de la FPGA en la computadora.
• Prueba funcional del dispositivo.
• Documentación del diseño.

Conclusiones

La importancia de los dispositivos lógicos programables radica en el hecho de que la mayoría de los equipos electrónicos modernos incluyen en su diseño PLDs, por lo que todo profesional relacionado con el mantenimiento o fabricación de equipo electrónico debería dominar dicha metodología.
Los PLDs combinan muchos de los beneficios de la lógica discreta, utilización de circuitos integrados comerciales TTL o CMOS, con la gran ventaja de implementar circuitos a la medida del cliente. Entre otras ventajas de esta tecnología son:

  • Diseño sencillo
  • Alto rendimiento
  • Fiabilidad
  • Ahorro en costo
  • Reprogramación
  • Seguridad

En consecuencia, los circuitos lógicos programables tienen un gran campo de aplicación en la implementación de circuitos lógicos de todo tipo.
Entre la amplia gama de PLDs tenemos a las FPGAs, que son utilizadas para diseños que manejan una mayor transferencia de datos y registros; además permiten implementar dentro de ellas memorias del tipo RAM, ROM, FIFO, etc, a través de sus bloques de memoria.
La elección de la familia de FPGA a utilizar dependerá de la cantidad de lógica combinacional (compuertas), la cantidad de lógica secuencial (flip-flops) y por supuesto la cantidad de memoria a implementar.

También un factor a tener en cuenta son los tiempos de propagación internos, asimismo la cantidad de pines del dispositivo.