Un "latch" è diverso da un "Flip-Flop" in quanto un FF cambia il suo output solo in risposta a un fronte di clock. Un latch può modificare il suo output in risposta a qualcosa di diverso da un clock. Ad esempio, un SR-Latch ha un ingresso set e reset e se uno di essi è attivo, l'uscita può cambiare. Dove come SR-FF risponde solo a un set o reset quando c'è anche un fronte di clock.
In un FPGA, vuoi che la tua logica sia completamente sincrona. Ciò significa che tutti gli elementi di archiviazione (come gli FF) sono tutti sincronizzati da una singola sorgente di clock. Tutto ciò che è asincrono a quell'orologio deve essere trattato con molta attenzione, altrimenti si verificheranno errori di temporizzazione.
Un latch è fondamentalmente un elemento di archiviazione asincrono. Non ha input di clock, quindi non può essere sincronizzato con nessun clock. Dovrei notare che ci sono FF con ingressi di reset e reset asincroni, e questi dovrebbero essere trattati con la stessa cura dei normali latch.
Analizzare tutti i problemi di temporizzazione che i latch possono causare è molto al di là di ciò che può essere trattato qui, ma lasciatemi fare un esempio:
Diciamo che hai un SR-Latch e vuoi che sia impostato ogni volta che un contatore a 8 bit raggiunge un certo valore. Non sono sicuro di quale sarebbe il codice Verilog, ma in VHDL il codice è: set <= '1' quando count = "11010010" else '0'; Quel segnale impostato va all'ingresso impostato sul nostro SR-Latch.
La logica che si genera è puramente combinatoria; un mix di and-gate, or-gate e inverter (o LUT). Ma i percorsi del segnale attraverso quella logica combinatoria non sono sempre perfetti e il segnale "set" potrebbe avere dei difetti. Il percorso del segnale attraverso un determinato gruppo di gate potrebbe richiedere più tempo di un altro gruppo, facendo sì che l'uscita impostata diventi attiva per un breve momento prima che l'uscita si stabilizzi nello stato finale.
Questo glitch di uscita potrebbe causare l'impostazione del nostro SR-Latch, anche se non era previsto. Se passiamo da un SR-Latch a un SR-FF, con lo stesso clock del contatore, l'orologio SR-FF attenderà un intero ciclo di clock prima di cambiare stato. In sostanza attenderà che il segnale impostato si stabilizzi prima di guardarlo.
Se i percorsi attraverso la logica combinatoria per il segnale impostato vengono semplicemente instradati in modo diverso (causando ritardi diversi), anche il comportamento del glitch cambierà. La logica potrebbe funzionare bene, ma poi, poiché hai cambiato qualcosa di completamente indipendente, questa logica viene instradata in modo diverso e quindi il bug si apre. La temperatura e la tensione cambieranno anche la temporizzazione del segnale e quindi il comportamento del glitch.
Questo incerto nei tempi è il motivo per cui dovresti evitare i fermi nella tua logica. Gli FF sono molto più sicuri da usare. Questo è il motivo per cui il tuo compilatore ti avverte dei latch, dal momento che è facile fare un latch errato e probabilmente non lo vuoi comunque.
Certo, a volte sono necessari i fermi. Devi solo usarli molto raramente, solo quando assolutamente necessario, e quindi devi progettare la logica giusta in modo che non ci siano problemi.