In che modo il sincronizzatore 2-ff garantisce una corretta sincronizzazione?


9

L'uso dei sincronizzatori 2-ff è stato uno standard per un segnale che attraversa i limiti del clock. E ci sono un sacco di carta / figure che illustrano il meccanismo, come questo:inserisci qui la descrizione dell'immagine

Sembra che bclk possa campionare l'impulso di adat solo una volta (al secondo fronte di salita di bclk ), il che provoca metastabilità dell'output su bq1_dat . Come si può campionare "alto" bq1_dat sul successivo fronte di orologio attivo?


Oltre alla mia domanda, vorrei aggiungere ciò che penso affinché un segnale passi in modo sicuro a un altro dominio di clock (supponiamo che 2-FF sia sufficiente per soddisfare i requisiti MTBF). Per favore, correggimi in caso di errori.

inserisci qui la descrizione dell'immagine

ps: lo stato metastabile non mostra la forma d'onda "errante", ma un livello che non è né "1" né "0". La figura seguente mostra un esempio di output metastabile.inserisci qui la descrizione dell'immagine

La figura originale proveniva dalle note della lezione per EE108A, lezione 13: fallimento della metastabilità e della sincronizzazione (come quando le buone infradito vanno male) di WJ Dally.


4
Voglio solo dire che i diagrammi che mostrano l'output metastabile "girovagando" sono estremamente fuorvianti. Questo non è affatto l'aspetto della metastabilità. Quando un FF diventa metastabile, la sua uscita passa a una singola, specifica tensione intermedia (il valore dipende dalla tecnologia di implementazione) e rimane lì. Dopo un po 'di tempo imprevedibile, la tensione oscillerà in alto o in basso e anche il modo in cui procede sarà imprevedibile.
Dave Tweed,

@Dave Tweed ♦ Grazie per il commento. In quasi tutti i documenti che ho letto sulla metastabilità, ho visto le forme d'onda "girovagare". Ho cercato e trovato un post ( se un infradito ha una violazione di installazione e diventa metastabile, è garantito che si accontenta del valore di input quando termina l'oscillazione? ) Contenente uno scatto da o-scope con stato metastabile acquisito. Un link al riferimento originale della figura è incluso in quel post.
Fiedel,

Sì, ciò illustra perfettamente il mio punto e la presentazione di Powerpoint da cui proviene contiene molte buone informazioni.
Dave Tweed,

Risposte:


8

La semplice risposta è che non lo fanno da soli. Il sincronizzatore non è lì per garantire che i dati vengano trasmessi, ma per garantire che non si ottengano segnali metastabili che alimentano molti altri segnali e causano problemi. La seconda FF come mostra il diagramma cattura la prima uscita metastabile FF e impedisce che si propaghi ulteriormente attraverso il design.

Esistono vari tipi di segnali e il modo in cui includi i sincronizzatori dipende dal segnale di cui stai parlando. Ma diamo un'occhiata a un paio di tipi comuni:

  1. Segnali di trigger - o qualsiasi segnale che è fondamentalmente un impulso che deve avviare qualcos'altro in esecuzione. Questi generalmente non portano dati, e tutto ciò che ti interessa è che c'è, diciamo, un fronte di salita per iniziare qualcosa che va in un altro dominio di clock. Per farli incrociare, avresti bisogno di un sincronizzatore (essenzialmente facendo ciò che è mostrato nel tuo diagramma), ma hai bisogno di un po 'di più.

    L'opzione più semplice è quella di estendere l'impulso - in sostanza si assicura che l'impulso di ingresso sia più di 1 periodo di clock dell'orologio di destinazione (dovrebbe essere più lungo di 1 ciclo di almeno il più grande dell'impostazione e tempi di attesa per il registro di destinazione) . Ad esempio, se si passa da un clock da 20 MHz a un clock da 15 MHz, si dovrebbe assicurarsi che il proprio impulso sia composto da due cicli di clock all'ingresso, il che garantirebbe che venga presentato al clock di destinazione e non venga perso. Questo risponde anche alla tua domanda su come il segnale è garantito per attraversare. Se l'impulso è più ampio di un periodo di clock di destinazione, significa che se diventa metastabile sul primo fronte di orologio e finisce per essere visto come uno 0, allora sul secondo fronte di orologio sicuramente prenderà l'impulso.

    Perché con questo tipo di segnale sei interessato solo al superamento dell'impulso, non importa se il segnale di uscita finisce con due cicli di clock alti per un po 'del tempo e un solo ciclo per il resto. Se è necessario assicurarsi che sia un impulso a ciclo singolo, è possibile creare un'istanza di un semplice circuito rivelatore di bordi.

  2. Bus di controllo - o eventualmente tipi di bus dati. Questi sono probabilmente più difficili perché se si dispone di un flusso di dati multi-bit che deve rimanere sincronizzato. In questo caso, ciò che faresti è implementare qualcosa chiamato "handshaking". Fondamentalmente carichi i tuoi dati sull'orologio sorgente e li tieni. Quindi si invia un segnale di richiesta (come in 1) attraverso un sincronizzatore. Una volta che il segnale di richiesta è passato, sai che anche il bus dati sarà stabilizzato nel dominio di destinazione. È quindi possibile sincronizzarlo in una banca del registro nella destinazione. La destinazione quindi invia nuovamente un impulso di conferma per informare l'origine che può caricare la parola successiva.

    Utilizzeresti questo tipo di bus se avessi bisogno di inviare una parola di controllo all'orologio di destinazione per il quale devi sapere che è arrivato prima di inviarne un altro (ad esempio se stai inviando un comando per fare qualcosa).

  3. Bus dati : per i dati in cui si dispone di un'origine che sputa dati in modo continuo o esplosivo, è probabilmente meglio utilizzare un FIFO rispetto ai sincronizzatori. La FIFO utilizza una memoria a doppio clock per contenere i dati, insieme ai contatori per tenere traccia di quanti dati sono presenti nella FIFO. Si scrivono i dati in FIFO quando c'è spazio e quindi si incrementa l'indirizzo di scrittura. Questo indirizzo viene quindi tipicamente codificato in uno schema "Gray Coding" che garantisce che ogni incremento di indirizzo ne causi solo unobit nel bus degli indirizzi da modificare (ciò significa che non è necessario sincronizzare più bit). Questo indirizzo viene quindi trasferito al dominio di destinazione (tramite una delle catene del sincronizzatore), dove viene confrontato con l'indirizzo di lettura. Se ci sono dati in FIFO, possono essere letti dalla memoria usando la porta dell'orologio di destinazione. L'indirizzo di lettura è similmente codificato in Gray e inviato alla fonte tramite un altro sincronizzatore in modo che la porta di scrittura possa calcolare se c'è spazio nel FIFO.

  4. Reimposta segnali : in genere utilizzano una versione modificata del sincronizzatore in quello che è noto come "Assert asincrono, Deassert sincrono". In questa versione modificata, l'input di dati al primo flip flop è legato a GND, e invece il segnale di reset in entrata è collegato a segnali preimpostati asincroni di ciascun flip-flop nel sincronizzatore. Ciò si traduce in un segnale di uscita che è completamente asincrono quando sale, ma la catena del sincronizzatore assicura che si abbassi in modo sincrono con l'orologio di destinazione eseguendo il clock attraverso gli zeri nella catena di registro.

    Questo tipo di sincronizzatore è terribile per dati e controllo, ma perfettamente adatto per resettare i segnali. Se tutta la logica di destinazione alimenta l'output di questa catena negli input di ripristino asincrono di qualsiasi registro nel dominio, allora c'è poco timore della metastabilità sull'asserzione (anche se è asincrona) poiché tutti i registri sono forzati a uno stato noto. Quindi, quando il segnale di reset viene dichiarato nel dominio di origine, si disinserisce in modo sincrono nel dominio di destinazione, il che significa che tutti i registri escono dal reset nello stesso ciclo di clock (anziché +/- 1 ciclo se era di tipo asincrono).


Come puoi vedere da quanto sopra, è molto più complesso eseguire un attraversamento del dominio di clock piuttosto che attaccare un sincronizzatore a 2 flip-flop sul segnale. Il metodo esatto utilizzato dipende dall'applicazione.


Oltre alla risposta di Tom, mi piace aggiungere un riferimento a PoC , che ha implementazioni per questi casi. I documenti del sincronizzatore sono disponibili su RTD. Oltre alla teoria del concatenamento di 2 infradito per un sincronizzatore di base 2-FF, PoC fornisce implementazioni dedicate ( sync_Bits) per FPGA Xilinx e Altera per migliorare il comportamento della metastabilità. Il sincronizzatore 2-FF viene utilizzato ad esempio sync_Strobeper creare sincronizzatori più complessi per gli impulsi.
Paebbels,

Grazie per l'introduzione elaborata alle strategie di sincronizzazione. Questa immagine proviene da "Tecniche di progettazione e verifica di attraversamento del dominio dell'orologio (CDC) usando systemverilog" di Clifford E. Cummings. Capisco che per un segnale a un bit, la larghezza deve essere di almeno 1 ciclo di clock + tempo di impostazione + tempo di attesa del lato ricevente affinché possa passare in sicurezza. In questa immagine, questo criterio non è soddisfatto poiché l'impulso di adat viene campionato dai campioni di bclk solo una volta sul suo fronte discendente, il che rende metastabile bq1_dat.
Fiedel,

... Di conseguenza, la lettura di bq1_dat sul successivo fronte di salita di bclk potrebbe essere '0' o '1'. Quindi la sincronizzazione nella foto sembra non avere successo. Ho ragione?
Fiedel,

@Paebbels Grazie per il riferimento.
Darà

Dovresti modificarlo nella tua domanda, non pubblicarlo come una risposta, ma essenzialmente, sì, potresti ottenere o meno un 1 nell'output in quell'esempio.
Tom Carpenter,

1

1) Usando il tuo disegno come esempio, aclk e bclk sono asincroni tra loro. In altre parole, hanno diverse sorgenti di clock. Stanno mostrando adat come dati validi ma sincronizzati solo con aclk. È qui che entra in gioco il sincronizzatore bclk.

2) Questo disegno presuppone uno scenario peggiore, in cui bq1_dat è un output disordinato perché l'FF bq1 ha catturato solo una parte della fine dei dati, creando uno stato metastabile su cui l'output è generalmente spazzatura. Ecco il trucco. Bq2 ha lo stesso bclk di bq1, ma sono necessari 2 cicli di clock di bclk affinché i dati passino e compaiano in bq2_dat.

3) Il primo bclk ha catturato parte dei dati, risultando in un output disordinato, ma il secondo bclk è un ciclo di clock più tardi, abbastanza tempo perché i dati ambigui da bq1_dat si stabilizzino in uno stato alto o basso. L'impulso disordinato bq1_dat è durato abbastanza a lungo da consentire a bq2 di acquisire una logica valida '1' (logica alta) e passarla a bq2_dat come dati validi e ora sincronizzati (logica alta).

4) A valle, qualsiasi orologio che utilizza bclk avrà dati sincronizzati con cui lavorare. Si noti che solo il primo FF bclk ha dovuto fare i conti con uno stato metastabile . L'output avrebbe potuto essere logico se Adat fosse stato in ritardo di pico o nano secondi. Ricorda che questi infradito campionano l'immissione dei dati solo sul fronte di salita dell'orologio. Ciò che accade prima o dopo il fronte di salita viene ignorato.


Si noti, tuttavia, che il ritardo bclk fornisce solo una misura probabilistica di sicurezza e che l'importo esatto dipende sia dalla tecnologia FF sia dal periodo bclk. In alcuni casi hi-rel potrebbero essere necessari 3 o anche più stadi per riportare il tasso di errore a livelli accettabili.
WhatRoughBeast

@WhatRoughBeast. So che nel peggiore dei casi sono necessari molti stadi di sincronizzazione, oltre al filtro digitale. Ovviamente la mia risposta era troppo semplice.
Sparky256,

@ Sparky256 Quello che mi puzzle è 3) nel tuo commento. In che modo bq2 può catturare un '1' quando bq1_dat è in stato metastabile?
Fiedel,

@fiedel, due cose contribuiscono a far sì che bq2 sia in grado di catturare un input pulito (almeno). Innanzitutto lo stato metastabile deve persistere per un ciclo di clock completo. In secondo luogo, il valore metastabile (pseudo-mid-rail) di bq1 potrebbe essere improbabile (o ottimizzato per evitare) di essere nella finestra che causerebbe anche la metastabilità di bq2, ma è principalmente il primo di questi. Supponiamo che la tecnologia abbia una probabilità del 5% di persistenza della metastabilità abbastanza a lungo. uno stadio di sincronizzazione 3-FF lo ridurrebbe allo 0,25% perché entrambe le celle devono fallire. Il disordine è in pratica una deviazione esponenziale ben definita dallo stato quasi stabile.
Sean Houlihane,

@SeanHoulihane. Grazie per la spiegazione. Il termine "fronte di salita" confonde alcuni perché la finestra di accettazione dei dati (metastabile o stabile) si trova a metà strada del fronte di salita e dura solo pochi pico o nano secondi. Solo in quell'istante i dati di input in corrispondenza di una logica '1' o '0', siano essi metastabili o stabili, a seconda del suo livello di tensione rispetto alla soglia dell'IC per la logica 1 o 0.
Sparky256
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.