Domanda:
Primitive di sincronizzazione CDC per un FPGA Altera
Damien
2015-08-11 08:47:46 UTC
view on stackexchange narkive permalink

Sto lavorando al mio primo progetto FPGA non trival e finalmente ho bisogno di Clock Domain Crossing (CDC).

Ci sono più risorse ( tra altre) che trattano varie architetture per CDC e alcune correlate domande. La teoria va bene, ma almeno una di queste risorse elenca le trappole per gli incauti e almeno un progetto elenca più attributi VHDL richiesti per sintetizzare correttamente su un dispositivo Xilinx.

Sto prendendo di mira Altera MAX10 per questo progetto utilizzando VHDL. Ho codificato manualmente un sincronizzatore push-handshake, ma in qualche modo sospetto che ci sia di più.

Quindi:

  • Altera (o un'altra fonte ben considerata) fornire una libreria di primitive di sincronizzazione?
  • In caso negativo, quali passaggi è necessario eseguire per garantire che un blocco di sincronizzazione scritto a mano si sintetizzi correttamente, simuli correttamente e sia sottoposto correttamente all'analisi del tempo?

Una risposta con un esempio di un sincronizzatore di base (ad esempio 2-Flop) sarebbe ben considerata.

Che tipo di segnale vuoi sincronizzare?Uno strobo, una bandiera, un valore di contatore, un bit vettoriale o qualcosa di più complesso?
Un std_logic_vetor.Ho ingenuamente impiantato il sincronizzatore di handshaking a quattro fasi da [questo documento] (http://webee.technion.ac.il/~ran/papers/Sync_Errors_Feb03.pdf) che simula correttamente, ma non sono convinto di averlo"ha detto" all'FPGA tutto ciò che doveva sapere per sintetizzare correttamente.
Vedi [questa domanda] (http://electronics.stackexchange.com/questions/79821/vhdl-receive-module-randomly-fails-when-counting-bits) dove una risposta elenca diversi attributi altera per la sincronizzazione.
Ho aggiornato i moduli di sincronizzazione nella nostra PoC-Library e ho caricato le prime modifiche su GitHub.Grazie per il collegamento agli attributi di Altera .. Lo testerò in un progetto Stratix IV e aggiornerò il mio post se tutto funziona come previsto.Attualmente, il mio progetto va in crash Quartus, quindi è difficile trovare la riga di codice difettosa (Xilinx compila i miei file VHDL senza lamentele).
Ciao di nuovo.Ho aggiornato le sorgenti PoC e la mia risposta per indirizzare i sincronizzatori specifici Altera.Attualmente questi circuiti funzionano in un progetto StratixIV su una scheda DE4.
Una risposta:
Paebbels
2015-08-11 21:38:52 UTC
view on stackexchange narkive permalink

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?

  1. 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.
  2. Contrassegna i registri come registri asincroni ( ASYNC_REG = TRUE ). Ciò è necessario affinché le simulazioni post-sintesi sopprimano i valori meta stabili.
  3. Posiziona i registri uno vicino all'altro ( RLOC = X0Y0 ). Questo colloca il sincronizzatore 2-FF nella stessa slice.
  4. 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?

  1. Entrambi i flip flop sono contrassegnati con PRESERVE codice> per ostacolare le ottimizzazioni.
  2. 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.

  3. 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.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...