Un "pestillo" es diferente de un "Flip-Flop" en que un FF solo cambia su salida en respuesta a un borde del reloj. Un pestillo puede cambiar su salida en respuesta a algo que no sea un reloj. Por ejemplo, un SR-Latch tiene un conjunto y una entrada de restablecimiento y si alguno de ellos está activo, la salida puede cambiar. Donde, como SR-FF, solo responde a un conjunto o se reinicia cuando también hay un margen de reloj.
En un FPGA, desea que su lógica sea completamente sincrónica. Lo que significa que todos los elementos de almacenamiento (como los FF) están sincronizados desde una única fuente de reloj. Cualquier cosa que sea asíncrona a ese reloj debe ser tratada con mucho cuidado, de lo contrario se producirán errores de sincronización.
Un pestillo es básicamente un elemento de almacenamiento asíncrono. No tiene entrada de reloj y, por lo tanto, no se puede sincronizar con ningún reloj. Debo tener en cuenta que hay FF con entradas de reinicio y reinicio asíncronas, y estas deben tratarse con el mismo cuidado que los cierres normales.
Ir a todos los problemas de tiempo que pueden provocar los cierres es mucho más allá de lo que se puede cubrir aquí, pero permítame darle un ejemplo:
Supongamos que tiene un SR-Latch y desea que se configure cada vez que un contador de 8 bits alcance un determinado valor. No estoy seguro de cuál sería el código de Verilog, pero en VHDL el código es: establecer < = '1' cuando count="11010010" else '0'; Esa señal establecida va a la entrada establecida en nuestro SR-Latch.
La lógica que se genera es puramente combinatoria; una mezcla de y-gates, o-gates, y los inversores (O LUTs). Pero las rutas de señal a través de esa lógica combinatoria no siempre son perfectas y la señal de "conjunto" podría tener fallas en ella. La ruta de la señal a través de un grupo particular de puertas puede tomar más tiempo que otro grupo, lo que hace que la salida establecida se active por un breve momento antes de que la salida se establezca en el estado final.
Este fallo de salida puede hacer que se establezca nuestro SR-Latch, aunque no se suponía. Si cambiamos de un SR-Latch a un SR-FF, desactivamos el mismo reloj que el contador, entonces el SR-FF esperará un ciclo de reloj completo antes de cambiar de estado. En esencia, esperará a que la señal establecida se estabilice antes de mirarla.
Si las rutas a través de la lógica combinatoria para la señal establecida se enrutan de manera diferente (causando diferentes retrasos), el comportamiento de falla también cambiará. La lógica podría funcionar bien, pero luego, debido a que cambió algo totalmente no relacionado, esta lógica se enruta de manera diferente y así aparece el error. La temperatura y el voltaje también cambiarán la temporización de la señal y, por lo tanto, pueden cambiar el comportamiento de la falla.
Esta incertidumbre en el tiempo es la razón por la que debes evitar trabas en tu lógica. Los FF son mucho más seguros de usar. Esta es la razón por la que su compilador le advierte acerca de los cierres, ya que es fácil hacer un cierre por error y probablemente no lo quiere allí de todas formas.
Por supuesto, a veces se requieren cierres. Solo tiene que usarlos muy raramente, solo cuando sea absolutamente necesario, y luego debe diseñar la lógica correcta para que no haya problemas técnicos posibles.