¿Cómo se reconfiguran los FPGA en función de los deseos de los usuarios? [cerrado]

He leído el libro "Código" y me encanta su explicación de bajo nivel sobre cómo funcionan los cpus.

Ahora estoy buscando una explicación similar para los FPGA.

El problema que no puedo entender es: ¿Cómo cambia el FPGA en sus conexiones entre las puertas lógicas?

Supongo que los bits se guardan en algún lugar, lo que modifica cuáles están conectados.

Pero, ¿cómo se introduce el lenguaje de hardware VHDL/verilog en la FPGA?

Muchos multiplexores, probablemente implementados con puertas de paso y controlados por SRAM. La programación de nuevos valores en las SRAM es lo que cambia la configuración del dispositivo.
¿Cómo llegan los valores a las SRAM?
más importante aún, ¿cómo llega de SRAM a la puerta de paso?
1. Lea la documentación del proveedor sobre cómo programar su dispositivo. Básicamente, es solo un montón de lógica tomar un flujo de datos en serie o en paralelo y usarlo para programar las SRAM. 2. Básicamente, cada celda individual de la SRAM está conectada a lo que necesita controlar.

Respuestas (2)

Cada bit en un flujo de bits funciona como: una selección de multiplexor/demultiplexor, un elemento de almacenamiento para una LUT, un bit de control de transistor de paso (enrutamiento) o una habilitación/deshabilitación de alguna función de la FPGA.

e.g. you may have a bit sequence of 1001001110000111, giving a k-map of:
      cd
      00 01 11 10
ab 00  1  0  1  0  - 1001 first 4-bits of sequence above
   01  0  0  1  1
   11  0  1  1  1
   10  1  0  0  0
which corresponds to a LUT equation of y = ~b&~c&~d | b&c | ~a&c&d | a&b&d

Para el enrutamiento de FPGA, el hardware de FPGA contendría transistores de paso (o basados ​​en amplificadores de detección) para habilitar las conexiones de enrutamiento deshabilitadas, de modo que se usaría un bit SRAM de configuración del archivo de flujo de bits para controlar esa conexión.

Lo mismo ocurre con cualquier otra característica de la FPGA, un bit o varios bits habilitan/deshabilitan o seleccionan algo.

Es un poco complicado e involucra una gran cantidad de software.

Inicialmente, escribe código en un lenguaje de descripción de hardware como Verilog o VHDL. Esto, junto con las restricciones de tiempo y ubicación, conforman la entrada del software de la cadena de herramientas FPGA. La cadena de herramientas es una serie de programas de software que transforman la descripción HDL del diseño en un formato binario que es específico para el FPGA que está utilizando. La misma secuencia básica se usa para diseñar ASIC, aunque es mucho más compleja y se pueden hacer muchos más ajustes en el camino, ya que hay mucha más flexibilidad en lo que se puede hacer en un ASIC.

El primer paso en la cadena de herramientas se llama 'síntesis'. El software 'sintetizador' elabora el HDL y lo convierte en una netlist genérica. Este proceso es algo similar a lo que sucede en un compilador como gcc. Las directivas de preprocesador y síntesis en el código se llevan a cabo durante la elaboración, así como algunas optimizaciones básicas (cálculo de valores constantes, propagación constante dentro de los módulos, eliminación de componentes desconectados/no utilizados, etc.). La lista de conexiones de salida es una representación de un esquema y contiene primitivas lógicas (puertas, multiplexores, RAM, etc.) conectadas entre sí con 'redes'. Estas primitivas también pueden tener restricciones de tiempo y ubicación adjuntas como metadatos.

Después de la síntesis, el diseño se optimiza y mapea. La optimización implica reorganizar y simplificar la lógica para áreas más pequeñas y caminos más cortos. El mapeo implica reemplazar primitivas genéricas con primitivas que son compatibles con el FPGA específico que está utilizando (instancias de RAM de bloque, flip flops, LUT, etc.). El paso de mapeo también determina cómo se dividirán las puertas lógicas en las tablas de búsqueda que usa el FPGA para implementar la lógica. La salida del mapeador también es una lista de conexiones, pero con primitivas específicas del dispositivo en lugar de genéricas.

El mapeo es seguido por la colocación. El FPGA contiene recursos lógicos no comprometidos que su diseño puede usar: tablas de búsqueda, flip flops, RAM, etc. El colocador decide qué instancias específicas en el FPGA físico se usarán para cada instancia en la lista de conexiones asignada. Esta información generalmente se incluye en la lista de conexiones como metadatos. El colocador intenta colocar los componentes conectados cerca uno del otro para que puedan conectarse con las rutas más cortas posibles para que se puedan cumplir las restricciones de tiempo.

La colocación es seguida por el enrutamiento. El software de enrutamiento toma la lista de conexiones colocada y determina qué cables en la red de enrutamiento usar para cada red en la lista de conexiones. Esto puede llevar mucho tiempo para un diseño complicado con cientos de miles de cables. El colocador también tiene en cuenta las restricciones de tiempo para tratar de asegurarse de que las conexiones que realiza permitan que el chip funcione a la velocidad de reloj especificada en las restricciones de tiempo.

La colocación generalmente va seguida de un análisis de tiempo estático. El análisis de temporización analiza todas las rutas a través de la lógica y calcula cuánto tardan las señales en propagarse por esas rutas a medida que se colocan y enrutan. El fabricante mide la información detallada de tiempo, incluidos los tiempos de configuración y espera requeridos de los flip-flops internos, las RAM de bloque y otros componentes, así como los retrasos a través de todos los LUT y los segmentos de red de enrutamiento, y se incluye con la cadena de herramientas. Esta información se utiliza para asegurarse de que el diseño funcionará correctamente en la FPGA.

Una vez que pasa el análisis de tiempo, los pasos finales son la verificación de reglas de diseño y la generación de flujo de bits. La comprobación de las reglas de diseño garantiza que los diversos componentes estén configurados correctamente. Es un proceso mucho más complicado en los diseños de ASIC que en los FPGA. La generación de flujo de bits es el paso final y toma el diseño colocado y enrutado y lo convierte en un conjunto de comandos de configuración para la FPGA. El flujo de bits de la FPGA le dice a la FPGA cómo configurar sus componentes de enrutamiento interno, PLL, flip-flops, bancos de E/S, bloques de RAM, etc. para implementar el diseño.

Ahora, en cuanto al FPGA en sí... hay mucha información útil en varios tutoriales en línea y en los manuales de los dispositivos. Recomendaría descargar los manuales en PDF de una FPGA y echar un vistazo a las figuras. Un ejemplo decente sería Xilinx UG384, el manual para la lógica configurable en el FPGA Xilinx Spartan-6. En las páginas 9, 10 y 11, el manual tiene diagramas bastante detallados de algunos tipos de segmentos lógicos diferentes. La esencia de esto es que básicamente todos los componentes lógicos (LUT/RAM, flip-flops) se pueden configurar tanto en modo de operación como en valor inicial. La LUT en SLICEM, por ejemplo, se puede configurar como una LUT, una RAM o ROM de puerto único o doble, o un registro de desplazamiento, todo con el contenido inicial cargado desde el flujo de bits de configuración. Los flip-flops de salida se pueden configurar como flip-flops o pestillos, también con valor inicial configurable desde el bitstream. Todos los multiplexores que no son controlados por una señal extraída son establecidos por el flujo de bits de configuración (salidas A/B/C/DMUX, entrada flip flop D, entrada LUT DI1, etc.). También hay algunos detalles sobre los recursos de interconexión en la página 36.

Bien, increíble. Pero el flujo de bits es lo que tengo curiosidad. ¿Cómo funciona cambiar la FPGA? Estoy buscando una explicación de nivel de hardware.