Tuvimos un curso muy corto de FPGA/Verilog en la universidad (hace 5 años) y siempre usábamos relojes en todas partes.
Ahora estoy comenzando de nuevo con los FPGA como pasatiempo, y no puedo evitar preguntarme acerca de esos relojes. ¿Son absolutamente necesarios o un diseño basado en FPGA puede ser completamente asíncrono? ¿Se puede construir un conjunto complejo de lógica y hacer que las cosas fluyan a través de él lo más rápido posible?
Me doy cuenta de que hay muchas trampas con esto, como saber cuándo la señal se ha propagado a través de todas las partes del circuito y la salida se ha estabilizado. Eso no viene al caso. No es que quiera construir un diseño que sea completamente asincrónico, sino solo para mejorar mi comprensión de las capacidades.
Para mi ojo de principiante, parece que la única construcción que requiere absolutamente un reloj es un reg
, y entiendo que un FPGA típico (digamos, un Cyclone II) tendrá sus flip-flops precableados para señales de reloj específicas. ¿Es esto correcto? ¿Hay otros relojes implícitos como este y normalmente pueden ser controlados manualmente por el diseño?
Una respuesta corta sería: sí; una respuesta más larga sería: no vale la pena su tiempo.
Un FPGA en sí mismo puede ejecutar un diseño completamente asíncrono sin ningún problema. El resultado que obtiene es el problema, ya que el tiempo a través de cualquier FPGA no es muy predecible. El mayor problema es el hecho de que su tiempo y el diseño resultante variarán casi definitivamente entre diferentes lugares y sesiones de ruta. Puede imponer restricciones en rutas asíncronas individuales asegurándose de que no tomen demasiado tiempo, pero no estoy seguro de que pueda especificar un retraso mínimo.
Al final, significa que su diseño será impredecible y potencialmente completamente variable incluso con un ligero cambio de diseño. Tendría que revisar todo el informe de tiempo cada vez que cambie algo para asegurarse de que aún funciona. Por otro lado, si el diseño es síncrono, solo busca un paso o falla al final del lugar y la ruta (suponiendo que sus restricciones estén configuradas correctamente, lo que no toma mucho tiempo).
En la práctica, las personas apuntan a diseños completamente sincrónicos, pero si necesita simplemente almacenar en búfer o invertir una señal, no necesita pasar por un flip flop siempre que lo restrinja adecuadamente.
Espero que esto lo aclare un poco.
"¿Se puede construir un conjunto complejo de lógica y hacer que las cosas fluyan a través de él lo más rápido posible?" Sí. Se han construido CPU completas que son completamente asincrónicas; al menos una de ellas era la CPU más rápida del mundo. http://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU
Me molesta que la gente rechace las técnicas de diseño asíncrono, aunque teóricamente tienen varias ventajas sobre las técnicas de diseño síncrono, simplemente porque (como han dicho otros aquí) los diseños asíncronos no son tan compatibles con las herramientas disponibles.
Para mí, eso es como recomendar que todos los puentes estén hechos de madera, porque más personas tienen herramientas para trabajar la madera que herramientas para trabajar el acero.
Afortunadamente, algunas de las ventajas del diseño asíncrono se pueden obtener sin dejar de utilizar técnicas de diseño en su mayoría síncronas mediante el uso de un diseño síncrono local asíncrono global (GALS) .
Un factor aún no mencionado es la metaestabilidad. Si un circuito de enganche recibe una secuencia de entradas/transiciones tal que el estado resultante dependa de retrasos de propagación u otros factores impredecibles, no hay garantía de que el estado resultante sea un "alto" o "bajo" limpio. Considere, por ejemplo, un flip-flop activado por flanco que actualmente emite un "bajo" y su entrada cambia de bajo a alto casi al mismo tiempo que llega un flanco de reloj. Si el borde del reloj ocurre lo suficiente antes de que cambie la entrada, la salida simplemente se mantendrá baja hasta el próximo borde del reloj. Si el borde del reloj ocurre lo suficiente después del cambio de entrada, la salida cambiará rápidamente una vez de bajo a alto y permanecerá allí hasta el siguiente borde del reloj. Si no se cumple ninguna de esas condiciones,. Puede permanecer bajo, o cambiar rápidamente una vez y permanecer alto, pero puede permanecer bajo por un tiempo y luego cambiar, o cambiar y luego, algún tiempo después, volver, o cambiar de un lado a otro varias veces, etc.
Si un diseño es completamente síncrono y todas las entradas están doblemente sincronizadas, es muy poco probable que un pulso de temporización golpee el primer pestillo de un sincronizador de tal manera que haga que cambie en el momento perfecto para confundir al segundo. pestillo. En general, es seguro considerar tales cosas como "simplemente no sucederán". En un diseño asíncrono, sin embargo, a menudo es mucho más difícil razonar sobre tales cosas. Si se viola una restricción de tiempo en un circuito de bloqueo (no solo flip flops, sino cualquier combinación de lógica que actuaría como un bloqueo), no se sabe qué hará la salida hasta la próxima vez que haya una condición de entrada válida que fuerce el bloqueo. a un estado conocido. Es muy posible que las salidas retrasadas provoquen que se violen las restricciones de tiempo de las entradas aguas abajo, lo que provocará situaciones inesperadas,
La forma más segura de modelar un circuito asíncrono sería hacer que casi todos los circuitos de salida produzcan una salida "X" durante un tiempo cada vez que cambie entre "0" y "1". Desafortunadamente, este enfoque a menudo da como resultado que casi todos los nodos muestren "X", incluso en casos en los que en realidad casi con seguridad habrían resultado en un comportamiento estable. Si un sistema puede funcionar cuando se simula que todas las salidas se convierten en "X" inmediatamente después de que cambia una entrada, y permanece "X" hasta que las entradas sean estables, es una buena señal de que el circuito funcionará, pero hacer que los circuitos asíncronos funcionen bajo tales restricciones es a menudo difícil.
Realmente hay TRES tipos de diseños.
En general, al sintetizar/optimizar la lógica combinatoria, las herramientas asumirán que todo lo que importa es cuál es el resultado final y el tiempo máximo necesario para establecer ese resultado.
Puede construir un diseño que sea puramente combinatorio y obtendrá el resultado correcto. Las salidas pueden cambiar en cualquier orden y pueden cambiar varias veces antes de alcanzar sus valores finales. Dichos diseños son un gran desperdicio de recursos lógicos. La mayoría de los elementos lógicos pasarán la mayor parte de su tiempo inactivos, mientras que en un sistema secuencial podría haber reutilizado esos elementos para procesar múltiples elementos de datos.
En un sistema síncrono secuencial, todo lo que importa es que las salidas del bloque combinatorio se hayan establecido en su estado correcto cuando se sincronizan en el siguiente flip flop. No importa en qué orden cambien o si son fallas en el camino. Nuevamente, las herramientas pueden convertir fácilmente esto en una lógica que, siempre que el reloj sea lo suficientemente lento, dé la respuesta correcta (y pueden decirle si el reloj que desea usar es lo suficientemente lento).
En un sistema secuencial asíncrono, esas suposiciones desaparecen. Los fallos pueden ser importantes, el orden de los cambios de salida puede ser importante. Tanto las herramientas como los propios FPGA fueron diseñados para diseños síncronos. Ha habido mucha discusión (busque el diseño de FPGA asíncrono en Google si desea saber más) sobre la posibilidad de implementar sistemas asíncronos en FPGA estándar o en los diseñados específicamente, pero aún se encuentra fuera de la práctica de diseño aceptada.
Por supuesto, si sus requisitos de diseño son lo suficientemente lentos como para que muchos retrasos internos sigan siendo órdenes de magnitud más largos que los tiempos que le interesan, entonces no hay problema, y puede consultar el informe de tiempo para controlar esto, pero hay un límite para lo que puede hacer de manera útil sin información de estado interno. Si solo desea hacer algo como un multiplexor de 100 entradas, está bien, solo recuerde que cada entrada tendrá un retraso de propagación diferente. De hecho, puede obtener algunos efectos interesantes y caóticos con una gran cantidad de bucles de retroalimentación oscilantes con retraso impredecible; tal vez un sintetizador basado en FPGA totalmente asíncrono podría ser el próximo 'analógico'.
Sí tu puedes. Puede ignorar los flip-flops por completo y construirlo todo a partir de LUT. Y/o puede usar los elementos de estado de la mayoría de los FPGA de Xilinx como pestillos (activados por nivel) en lugar de flip-flops (activados por borde).
X=(someComplexFormula)
y Y=X & D
, y si el compilador sustituye esa fórmula por X y determina que X & D
es equivalente a A & D
, el compilador podría reemplazar el cálculo de Y en términos de A y D, en lugar de en términos de X, permitiendo así el cálculo de Y para proceder más rápido que el de X. Tales sustituciones son válidas con la lógica combinatoria, pero causan estragos en la lógica secuencial asíncrona.lpm_ff
puede implementar un flip flop tipo d o t con carga síncrona. Al usar este módulo, puedo estar seguro de que estas funciones se asignarán exactamente a las características de bajo nivel del dispositivo sin la posibilidad de que estén optimizadas.Como señaló @Andrey, no vale la pena su tiempo. Específicamente, las herramientas no hacen esto, por lo que estaría completamente solo. Además, dado que tienen registros incorporados, no ahorraría nada al no usarlos.
Sí. Si no tiene construcciones de tipo de proceso, entonces no debería hacer cosas como inferir registros. Habrá cosas como la memoria integrada que requieren relojes, aunque si realmente lo desea, probablemente podría generarlos de forma asíncrona.
FWIW Pensé que debería agregar que un objetivo obvio en las soluciones de lógica asíncrona sería la reducción global en el consumo de energía.
Esos relojes/PLL/búferes globales queman muchos julios.
A medida que las soluciones FPGA serpentean en arenas alimentadas por baterías (por ejemplo, Lattice Icestick), este aspecto adquirirá mucha más atención.
pjc50