Restablecimientos asíncronos

Estoy diseñando un FPGA que incluirá máquinas de estado y contadores, los cuales deben reiniciarse. Escuché que siempre fue mejor usar reinicios sincrónicos, ¿es cierto?

No estoy seguro de que mi máquina de estado síncrona funcione: ¿Cuál será la diferencia si utilizo reinicios síncronos o asíncronos?ingrese la descripción de la imagen aquí

" i have heard that it was always better to use synchronous resets"... ¿Dónde escuchaste eso?
Utilice siempre la desactivación síncrona para los reinicios. No hay nada de malo con la aserción asincrónica si está reiniciando toda la lógica conectada durante la aserción.
Lo único que veo con el reinicio asíncrono es que podría introducir violaciones de configuración/tiempo de espera. Restableces tu flip-flop, pero tendrás circuitos usando la salida de tu flip-flop. Es posible que tenga un problema de sincronización allí. (chico analógico)
@the dude Es lamentable que la publicación de su código sea un gráfico, ya que ninguno de los ejemplos es correcto. A su reinicio síncrono le falta el reloj. Su reinicio asíncrono usa "else if" donde debería usar "elsif"

Respuestas (6)

El problema con los reinicios asíncronos es que debe evitar la metaestabilidad, que ocurre cuando se violan las restricciones de tiempo. En particular, debe asegurarse de que la señal de entrada sea estable durante el tiempo de configuración requerido antes de que ocurra el borde del reloj, ilustrado en el diagrama: metaestabilidaddonde C2 es su reloj y A es su entrada de flip-flop.

Una unidad lógica FPGA tiene una forma como esta: fpgacuando desactiva la señal de reinicio, la entrada al flip-flop cambia del valor de reinicio al valor siguiente. Si el borde del reloj ocurre antes del requisito de tiempo de configuración, obtendrá una infracción de tiempo. De manera similar, puede obtener una violación del tiempo de espera, si la anulación se produce justo después del borde del reloj.

Esta es la razón por la que debe asegurarse de que haya un intervalo suficiente entre el borde del reloj y la desactivación del restablecimiento. Una forma sencilla de hacer esto es usar una desactivación de restablecimiento síncrono o un restablecimiento completamente síncrono.

OP preguntó sobre el uso de reinicios sincrónicos frente a asincrónicos en su diseño. Tiene razón en su declaración de que internamente, el restablecimiento debe anularse sincrónicamente, pero no ha explicado de ninguna manera cómo se aplica esto a la pregunta del OP.
@JimLewis mis últimos dos párrafos explican exactamente esto.
> Cuando desactiva la señal de reinicio, la entrada al flip-flop cambia del valor de reinicio al valor siguiente. ¿Podrías aclarar eso? El código publicado reacciona en el borde positivo del reinicio, por lo tanto, el valor del flip flop cambiará cuando se confirme el reinicio, ¿no es así?
@Martel La lógica en el flip-flop evita que la entrada D cambie su estado mientras la señal de reinicio esté activa. Cuando desactiva la señal de reinicio demasiado cerca del borde del reloj, puede causar una violación de tiempo. En resumen, el flip-flop necesita una cierta cantidad de tiempo para recuperarse de un reinicio, es decir, tiempo de recuperación de reinicio. Un circuito de reinicio simple se ubicará entre la entrada del flip-flop y la entrada del pestillo interno en el flip-flop. Si desactiva demasiado cerca del borde del reloj, la entrada al pestillo interno no será estable durante el tiempo suficiente para satisfacer el tiempo de configuración.

Las celdas lógicas de FPGA suelen tener una entrada de reinicio asíncrono dedicada. En muchos casos, existe un restablecimiento asíncrono global que se puede usar para una gran cantidad de celdas sin recursos de enrutamiento adicionales. El software de síntesis generalmente agrupa las celdas en bloques de reinicio común y usa el reinicio global para el grupo más grande de celdas.

El reinicio síncrono requiere que el reinicio se incluya en las entradas lógicas de una celda, lo que reduce las entradas lógicas disponibles en 1 y también requiere recursos de enrutamiento para obtener el reinicio en cada celda.

Como se mencionó anteriormente, siempre que desactive sincrónicamente su restablecimiento "asincrónico", al impulsar el restablecimiento con la salida de un FF de sincronización, no tendrá ningún problema de tiempo. En el proceso, ahorrará recursos lógicos y de enrutamiento.

Perfecto, crj11.
¿Es el código de la izquierda una anulación síncrona del reinicio asíncrono?
Me parece que el código de la izquierda simplemente pasaría por INIT, RESETASSERT, ERSETDEASSERT, INIT... siempre que no se afirme rst_gen. Además, no hay nada para establecer el estado inicial de la máquina de estado. En realidad, no hay "rising_edge(clk_sys)" allí, así que no estoy seguro de lo que haría. Ciertamente no es sincrónico sin alguna transición relacionada con el borde.

Aquí es en pocas palabras.

Aserción asincrónica (del restablecimiento) y desafirmación síncrona (o liberación) del restablecimiento.

Aquí hay una aplicación típica. Dos regiones de reloj diferentes (33 MHz y 50 MHz, asíncronas entre sí).

ingrese la descripción de la imagen aquí

Mi trabajo, o una representación del mismo de un diseño de FPGA que hice.

Los reinicios asíncronos vs síncronos son como un tema debatible. En términos generales, los reinicios asíncronos son más rápidos que los reinicios sincronizados debido a la independencia del reloj. Pero los reinicios asíncronos son propensos a problemas de metaestabilidad, como lo señala otra respuesta en la publicación, por lo que la anulación debe ser sincrónica. Esto se hace mediante un circuito sincronizador basado en flip-flop.

Los restablecimientos de sincronización no son propensos a fallas a diferencia de los restablecimientos asíncronos. También usan chanclas más pequeñas y ahorra espacio. A diferencia de los restablecimientos asíncronos, las líneas de restablecimientos de sincronización se tratan como líneas de datos y, por lo tanto, el enrutamiento se vuelve complejo y la sincronización se vuelve más estricta. Además, en los circuitos controlados por reloj, los restablecimientos de sincronización no pueden poner el sistema en un estado inicial, sin sincronizarlo. Pero hay excepciones con respecto al rendimiento y la utilización del área.

Digamos, por ejemplo, en los FPGA de xilinx, según sus pautas de codificación HDL, si tiene bloques dedicados como rams de bloques o multiplicadores, se debe usar el restablecimiento de sincronización para obtener el mejor rendimiento y la utilización óptima del área. Usando reinicios asíncronos, deteriore el rendimiento en un 50% en tales casos. En casos generales, a menudo los reinicios asíncronos también inhiben el rendimiento y la optimización del área.

Consulte: https://www.xilinx.com/support/documentation/white_papers/wp231.pdf

WRT RAM, sospecho que dice, no use el reinicio en el núcleo de la RAM, ya que entonces tendrá que implementarse como registros. Del mismo modo, para los multiplicadores de canalización: es probable que restablecer en los registros en los que desea volver a sincronizar / canalizar impida esa operación.

El OP parece estar preguntando si debo usar un reinicio síncrono o asíncrono. Primero, estoy de acuerdo con la discusión de que para cada dominio de reloj, debe haber un circuito que haga que el restablecimiento distribuido a los flip-flops se anule sincrónicamente.

Cuando está utilizando una parte cargada dinámicamente, como Xilinx o Intel (anteriormente Altera), hay pocos beneficios para el reinicio asincrónico; puede ser nominalmente más rápido, pero estamos hablando de fracciones de un período de reloj, por lo que es más que probable Reinicio sincrónico se prefiere para estas tecnologías.

OTOH, para una parte que tiene su personalidad en el encendido (ASIC, fuselink, basado en flash) como muchas de las partes Microsemi (anteriormente Actel) y ASIC, entonces puede obtener un beneficio usando el reinicio asíncrono porque en el encendido en el tablero algunos osciladores de reloj no se ejecutan durante un largo período de tiempo y, por lo tanto, se puede usar el reinicio asíncrono para poner las salidas en un estado seguro. Si esto es necesario o no depende de lo que controlen esas salidas.

El problema con el reinicio asíncrono es que tiene que lidiar con problemas de inmunidad al ruido: los problemas técnicos son un gran problema. El restablecimiento síncrono puede agregar fácilmente filtros de falla en la lógica que hace que el restablecimiento se deshabilite de forma síncrona. El reinicio asíncrono no puede, ya que perderá la aserción asíncrona si lo hace, por lo que los filtros para el reinicio asíncrono deberán ser analógicos.

En general, es más seguro usar una versión sincronizada de la señal de reinicio que asegure que el borde posterior del reinicio esté sincronizado con el reloj, pero use un reinicio asíncrono dentro del bloque mismo (como muestra en su primer ejemplo de VHDL).

Esto asegura que:

  • el bloque se reinicia incluso en ausencia de un reloj
  • no hay problema de tiempo de ruta asíncrona

El último problema es que la síntesis marcará un reinicio asíncrono que va a un bloque de sincronización a menos que la señal de reinicio esté configurada como una ruta falsa.