He estado trabajando con fpgas durante años y siempre usé reinicios sincrónicos para todas las partes (que lo necesitan) de mis circuitos. Ayuda a que el circuito se reinicie globalmente en un ciclo de reloj dado.
Sin embargo, me dijeron que en los circuitos ASIC, la gente tiende a usar el reinicio asíncrono en todas partes. Me pregunto por qué, y si también es el caso en algunos diseños de fpga. Me encantaría escuchar opiniones profesionales.
Gracias
Parece que hay muchas opiniones sobre este.
Se dice que la aserción asíncrona, la desafirmación sincrónica es una buena práctica. Esto evita el problema de que el reloj no funcione (o funcione demasiado lento para capturar la señal de reinicio) en la aserción síncrona y la posible metaestabilidad en la desafirmación asíncrona.
Usaría un sincronizador de restablecimiento (dos FF) con la salida vinculada al resto de los restablecimientos de diseños:
Un par de discusiones:
asíncrono y restablecimiento de sincronización
Cartas en sincronización vs. restablecimientos asíncronos
Favorecería un reinicio asíncrono sobre un reinicio síncrono por algunas razones (sin ningún orden en particular):
En última instancia, no creo que ninguno de estos problemas sea un impedimento, pero definitivamente contribuirían a una fuerte preferencia por el reinicio asíncrono en los ASIC.
El restablecimiento asincrónico con anulación sincrónica funciona muy bien. Como se mencionó anteriormente, los fracasos de restablecimiento asíncrono son más pequeños y no requieren un reloj activo para garantizar el restablecimiento, por lo que puede forzar el restablecimiento de una parte (generalmente un estado conocido de bajo consumo) con solo alimentación y un solo pin cableado o fuente de alimentación. en reinicio
Si realmente quiere profundizar en esto, puede leer los artículos de Cumming sobre esto, en particular:
http://www.sunburst-design.com/papers/CummingsSNUG2003Boston_Resets.pdf
Salud.
Otro enfoque, que parecería incluso más seguro que el enfoque de 'afirmación asincrónica/liberación sincronizada', sería tener un detector de reinicio asincrónico (como se describe en otra parte, con 'afirmación' asincrónica y 'liberación' sincrónica), pero tener la salida de que bloquean cualquier dispositivo de E/S orientado hacia el exterior sin restablecer nada de forma asíncrona (aparte del pestillo en el detector mismo). Si se utilizan dos detectores de reinicio asíncronos, uno para las líneas de E/S y otro para alimentar el detector de reinicio síncrono, y si se diseña uno para las líneas de E/S de modo que solo se dispare mediante pulsos de reinicio que sean lo suficientemente fuertes para disparar el detector principal, uno puede evitar incluso que las salidas fallen en los casos en que no se va a reiniciar la CPU. Tenga en cuenta que si hace esto, un pulso de restablecimiento de longitud legítima restablecerá las salidas de forma asíncrona,
Otra cosa a considerar es que los sistemas a menudo tienen algunos registros que no deberían verse afectados por un reinicio. Si un reinicio asincrónico pudiera afectar a los circuitos que escriben en esos registros, sería posible que un pulso de reinicio que llega en el momento equivocado golpee esos registros, incluso si es un pulso limpio (que no se ejecuta). Por ejemplo, si el código intenta escribir en la dirección 1111 y un restablecimiento asíncrono llega justo antes de que un pulso de reloj fuerce uno de los pestillos de dirección a cero justo cuando llega el pulso de reloj, eso podría causar una escritura errónea en la dirección 1110. Mientras uno podría usar múltiples líneas de reinicio interno con retrasos combinatorios para garantizar que las escrituras de registro se deshabilitaran antes de que la dirección fuera golpeada, el uso de la lógica de reinicio interno síncrono evita el problema por completo.
Por cierto, aquí hay un circuito que ilustra el concepto. Cerca de la esquina inferior izquierda hay dos entradas lógicas para restablecer. Uno generará un pulso de reinicio "limpio" y el otro generará uno realmente desagradable. El LED amarillo indica reinicio del sistema principal; el LED cian indica la activación de E/S. Pulsar un reinicio limpio provocará un "reinicio" inmediato de las salidas; presionar un reinicio repulsivo provocará un reinicio retrasado de las salidas o no las afectará (en el simulador, no hay forma de causar el caso de 'no afectarlas').
Como ingeniero experimentado ( 3 años con diseño de FPGA y sistemas integrados ), le digo que debe consultar la hoja de datos y la guía del usuario de FPGA. No es una respuesta simple.
Debe hacer que su diseño SE AJUSTE al tipo de FPGA que eligió. Algunos FPGA tienen FlipFlops que fueron diseñados para el reinicio Async, algunos están diseñados para el reinicio Sync.
Debe consultar la guía del usuario de FPGA para saber qué tipo de FlipFlops tiene.
El Implementador/Mapeador elegirá rutas dedicadas para su restablecimiento ( el código puede ejecutarse a mayor frecuencia y ocupa menos espacio ) si hace coincidir su código con el tipo de primitivas FPGA.
Su diseño funcionará en CUALQUIER caso , pero a veces el implementador de FPGA hará todo lo posible para que su lógica funcione ( agrega más lógica ), pero eso causará una frecuencia máxima más baja y/o más recursos de FPGA.
Ejemplo: probado con ZYNQ de Xilinx ( FPGA está diseñado para reinicio sincronizado; consulte la guía de usuario de primitivas ). Al cambiar el reinicio de asíncrono a sincronizado , la frecuencia máxima estable pasó de 220 MHz a 258 MHz , por lo que pasé mi margen de frecuencia.
También podría agregar que el Implementador no sabe qué es un reloj y una señal de reinicio. Asigna pines flip-flop a las señales por ORDEN, no por nombre. Entonces, en algunos FPGA, el implementador elige la primera señal después del "inicio del proceso ()" en VHDL como el reloj, en algunos como el reinicio, dependiendo de en qué FPGA esté configurado el implementador.
Super gato
Oli Glaser
Super gato
Super gato
Oli Glaser
señal_mixta_antigua