Il sincronizzatore a quattro fasi presentato è un'implementazione buona e corretta.
Ha solo uno svantaggio:
Ha una V
input, per notificare al sincronizzatore gli input modificati.
Questo può essere automatizzato da un registro di n bit nel dominio del clock sorgente e da un comparatore di n bit: se l'ingresso è cambiato, asserire V = 1
.
Input_d < = Input when rising_edge (Clock); V < = '1' when (Input_d / = Input) else '0'; - input modificato
L'implementazione di un sincronizzatore 2-FF - il nucleo di ogni sincronizzatore di livello superiore - con gli attributi e i vincoli richiesti può essere trovata come segue:
Cosa c'è di così speciale rispetto ai normali doppi flip flop?
- Disabilita l'estrazione del registro a scorrimento (
SHREG_EXTRACT = NO
) . Synthesis cerca di trovare catene di flip flop e inserirle in registri a scorrimento dedicati come Xilinx SRL32
. Questi traslatori dedicati non sono adatti per ingressi meta stabili. - Contrassegna i registri come registri asincroni (
ASYNC_REG = TRUE
). Ciò è necessario affinché le simulazioni post-sintesi sopprimano i valori meta stabili. - Posiziona i registri uno vicino all'altro (
RLOC = X0Y0
). Questo colloca il sincronizzatore 2-FF nella stessa slice. -
I flip flop hanno nomi univoci e vengono inseriti in uno speciale gruppo di temporizzazione chiamato METASTABILITY_FFS
. Vincoli Xilinx:
INST "* FF1_METASTABILITY_FFS" TNM = "METASTABILITY_FFS";
Tutti i percorsi di temporizzazione da un FF normale a un FF metastabile vengono ignorati, tramite il vincolo TIG
.
NET "* _async" TIG; INST "* _meta *" TNM = "METASTABILITY_FFS"; TIMESPEC "TS_MetaStability" = DA FFS A "METASTABILITY_FFS "TIG;
Fonti: sync_Bits_Xilinx.ucf, Metastability.ucf
Modifica: sincronizzatore 2-FF specifico di Altera:
Ho aggiunto una nuova istruzione generate nell'implementazione 2-FF generica, per scegliere un'implementazione specifica di Altera: sync_Bits_Altera.vhdl
Cosa c'è di così speciale in questa versione?
- Entrambi i flip flop sono contrassegnati con
PRESERVE codice> per ostacolare le ottimizzazioni.
-
Il primo / il flip flop meta stabile è annotato con:
attributo ALTERA_ATTRIBUTE di Data_meta: il segnale è "-name SYNCHRONIZER_IDENTIFICATION" "FORCED IF ASYNCHRONOUS" "";
per contrassegnare questo flip flop come un circuito di sincronizzazione.
-
Tutti i percorsi a questi registri sono impostati come false_path
:
attributo ALTERA_ATTRIBUTE di rtl: architecture is "-name SDC_STATEMENT" "set_false_path -to [get_registers {* | sync_Bits_Altera: * | \ gen: * : Data_meta}] "" ";
Questa è la sintassi di annotazione del vincolo SDC inline.
Sincronizzatori di livello superiore:
Naturalmente, la libreria PoC ha anche un sincronizzatore predefinito per i vettori di bit chiamato PoC.misc.sync.Vector, basato sul sincronizzatore 2-FF generico. Se i bit master cambiano, tutti i bit vengono trasferiti al dominio del clock del ricevitore.