Un progetto FPGA può essere per lo più (o completamente) asincrono?


39

Avevamo un corso FPGA / Verilog molto breve all'università (5 anni fa) e usavamo sempre orologi dappertutto.

Ora sto iniziando di nuovo con FPGA come hobby e non posso fare a meno di chiedermi quali siano questi orologi. Sono assolutamente necessari o un progetto basato su FPGA può essere completamente asincrono? Si può costruire una complessa serie di logiche e fare in modo che le cose si increspino il più velocemente possibile?

Mi rendo conto che ci sono molti gotcha con questo, come sapere quando il segnale si è propagato attraverso tutte le parti del circuito e l'uscita si è stabilizzata. Questo è il punto. Non è che io voglia costruire un progetto completamente asincrono, ma solo per migliorare la mia comprensione delle capacità.

A mio avviso per principianti, sembra che l'unico costrutto che richiede assolutamente un orologio sia un reg, e la mia comprensione è che un tipico FPGA (diciamo, un ciclone II) avrà i suoi infradito pre-cablati a specifici segnali di clock. È corretto? Ci sono altri orologi impliciti come questo e in genere possono essere guidati manualmente dal design?


3
So che Simon Moore all'università di Cambridge ha fatto molte ricerche sulla progettazione asincrona, inclusa la fabbricazione di un chip di prova. Richiede una serie completamente nuova di strumenti di progettazione e ha strani effetti collaterali: ad esempio la velocità di esecuzione inversamente proporzionale alla temperatura.
pjc50,

Risposte:


27

Una risposta breve sarebbe: sì; una risposta più lunga sarebbe: non vale la pena.

Un FPGA stesso può eseguire un progetto completamente asincrono senza problemi. Il risultato che si ottiene è il problema poiché il tempismo attraverso qualsiasi FPGA non è molto prevedibile. Il problema più grande è il fatto che i tempi e il design risultante varieranno quasi sicuramente tra le diverse sessioni di luogo e percorso. Puoi inserire vincoli su singoli percorsi asincroni assicurandoti che non impieghino troppo tempo, ma non sono del tutto sicuro che puoi specificare un ritardo minimo.

Alla fine significa che il tuo design sarà imprevedibile e potenzialmente completamente variabile con anche una leggera modifica del design. Dovresti esaminare l'intero rapporto sui tempi ogni volta che cambi qualcosa per assicurarti che funzioni ancora. D'altra parte, se il design è sincrono, cerchi semplicemente un passaggio o un errore alla fine del luogo e del percorso (supponendo che i tuoi vincoli siano impostati correttamente, il che non richiede molto tempo).

In pratica, le persone mirano a progetti completamente sincroni, ma se è necessario semplicemente bufferizzare o invertire un segnale, non è necessario passare attraverso un flip flop fintanto che lo si vincola correttamente.

Spero che questo chiarisca un po '.


3
Ho dovuto usare alcuni dispositivi con progetti FPGA asincroni. Sono stati difficili da lavorare. Si prega di utilizzare almeno i vincoli di temporizzazione
Tim Williscroft il

1
Mentre è vero che è possibile implementare progetti asincroni con un FPGA, la maggior parte degli FPGA sono costruiti per supportare progetti specificamente sincroni. Hanno un sacco di risorse (PLL, circuiti di distribuzione di clock e un'enorme quantità di infradito) che saranno sprecate in un design asincrono.
Dmitry Grigoryev il

2
Questa risposta non fornisce consigli particolarmente validi. È possibile creare un FPGA senza clock e in realtà semplifica il posizionamento e il percorso, elimina una tonnellata di problemi relativi ai requisiti di temporizzazione e, grazie alla pipeline a grana fine, può avere un rendimento misurabile più elevato. Il vero problema si presenta quando si tenta di mappare un circuito con clock su un FPGA senza clock perché hanno caratteristiche di temporizzazione molto diverse. Può essere fatto, richiede solo un po 'più di elaborazione front-end per fare la conversione. vlsi.cornell.edu/~rajit/ps/rc_overview.pdf
Ned Bingham

20

"Si può costruire una complessa serie di logiche e fare in modo che le cose si propaghino il più velocemente possibile?" Sì. Sono state costruite intere CPU completamente asincrone: almeno una di esse era la CPU più veloce al mondo. http://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU

Mi irrita il fatto che le persone rifiutino le tecniche di progettazione asincrona, anche se teoricamente presentano numerosi vantaggi rispetto alle tecniche di progettazione sincrona, semplicemente perché (come altri hanno già detto) i progetti asincroni non sono altrettanto supportati dagli strumenti disponibili.

Per me, è come raccomandare che tutti i ponti siano fatti di legno, perché più persone hanno strumenti di lavorazione del legno che strumenti di lavorazione dell'acciaio.

Fortunatamente, alcuni dei vantaggi della progettazione asincrona possono essere ottenuti mentre si utilizzano ancora tecniche di progettazione principalmente sincrone utilizzando una progettazione globale sincrona locale sincrona (GALS) .


Mi sento esattamente allo stesso modo riguardo alla tendenza moderna di instradare i PCB su una griglia quadrata , sebbene i vantaggi della migrazione siano molto meno significativi.
Roman Starkov,

@romkyns - Ciò è dovuto al fatto che scrivere software PCB che utilizza griglie non rettilinee è difficile .
Connor Wolf,

1
@supercat: sospetto che alludi alla logica a quattro fasi . È uno dei segnali di orologio multifase che sembra essere dimenticato.
David

1
@davidcary: sorta di, tranne entrambe le "fasi" su un filo: una fase è controllata dal fronte di salita e una dal fronte di discesa. Fondamentalmente, dividerei gli orologi a scrocco in quattro categorie: clean rise, clean falling, late rise, late late. I fermi con clock (L / CB) di un fronte di salita o di discesa pulito potrebbero acquisire dati da qualsiasi fronte di salita o di discesa. L / CB un fronte di salita in ritardo potrebbe prendere i dati dal fronte di salita pulito di L / CB da qualsiasi fronte di discesa. L / CB dal fronte di discesa tardivo potrebbe prendere i dati dalla caduta libera L / CB o da qualsiasi aumento.
supercat

1
@davidcary: a condizione che il tempo di propagazione più veloce per qualsiasi latch superi il tempo di attesa più lungo e a condizione che il percorso del segnale più lungo da un fronte di orologio, attraverso la logica di clock clock e i latch "in ritardo" attivati ​​da quel bordo, a qualsiasi latch attivato dal seguendo il bordo, non supera il tempo minimo tra i bordi dell'orologio, penso che un tale progetto dovrebbe essere completamente affidabile e privo di metastabilità generata internamente in qualsiasi combinazione di ritardi di propagazione.
supercat,

5

Un fattore non ancora menzionato è la metastabilità. Se un circuito di aggancio viene colpito con una sequenza di input / transizioni tale che lo stato risultante dipenderebbe da ritardi di propagazione o altri fattori imprevedibili, non vi è alcuna garanzia che lo stato risultante sarà pulito "alto" o "basso". Si consideri, ad esempio, un flip flop innescato dal fronte che attualmente sta producendo un "basso", e che ha il suo cambiamento di input da basso ad alto quasi nello stesso momento in cui arriva un fronte di clock. Se il fronte del clock si verifica abbastanza a lungo prima della modifica dell'ingresso, l'uscita rimarrà semplicemente bassa fino al successivo limite del clock. Se il fronte dell'orologio si verifica abbastanza a lungo dopo la modifica dell'ingresso, l'uscita passerà rapidamente una volta da basso ad alto e rimarrà lì fino al bordo dell'orologio successivo. Se nessuna di queste condizioni si applica,. Potrebbe rimanere basso o passare rapidamente una volta e rimanere alto, ma potrebbe rimanere basso per un po 'e quindi passare, o passare e poi qualche tempo dopo tornare indietro o passare avanti e indietro alcune volte, ecc.

Se un progetto è completamente sincrono e tutti gli ingressi sono doppiamente sincronizzati, è molto improbabile che un impulso di temporizzazione colpisca il primo fermo di un sincronizzatore in modo tale da farlo commutare al momento perfetto per confondere il secondo fermo. In generale, è sicuro considerare cose come "semplicemente non accadrà". In un progetto asincrono, tuttavia, è spesso molto più difficile ragionare su tali cose. Se un vincolo di temporizzazione su un circuito di latch (non solo flip flop, ma qualsiasi combinazione di logica che fungerebbe da latch) viene violato, non si può dire cosa farà l'output fino alla prossima volta che esiste una condizione di input valida che forza il latch a uno stato noto. È del tutto possibile che uscite ritardate provochino la violazione dei vincoli di temporizzazione degli ingressi a valle, portando a situazioni impreviste,

Il modo più sicuro per modellare un circuito asincrono sarebbe quello di fare in modo che quasi tutti i circuiti di uscita producano un output "X" per un po 'ogni volta che passa da "0" a "1". Sfortunatamente, questo approccio si traduce spesso in quasi tutti i nodi che mostrano "X", anche in casi che in realtà avrebbero quasi sicuramente comportato un comportamento stabile. Se un sistema può funzionare quando simulato in quanto tutte le uscite diventano "X" immediatamente dopo la modifica di un ingresso e rimangono "X" fino a quando gli ingressi non sono stabili, è un buon segno che il circuito funzionerà, ma facendo funzionare i circuiti asincroni sotto tali vincoli è spesso difficile.


4

Naturalmente se i tuoi requisiti di progettazione sono abbastanza lenti da far sì che molti ritardi interni siano ancora ordini di grandezza più lunghi delle volte che ti interessano, allora non è un problema e puoi guardare il rapporto sui tempi per tenerlo d'occhio, ma c'è un limite a ciò che puoi utilmente fare senza informazioni sullo stato interno. Se vuoi solo fare qualcosa come un multiplexer a 100 input, va bene, ricorda che ogni input avrà un ritardo di propagazione diverso. In effetti potresti ottenere effetti interessanti e caotici con un gran numero di loop di feedback oscillanti con ritardo imprevedibile - forse un sintetizzatore completamente asincrono basato su FPGA potrebbe essere il prossimo 'analogo'.


4

Si, puoi. Puoi ignorare completamente le infradito e costruirlo tutto da LUT. E / o è possibile utilizzare gli elementi di stato della maggior parte degli FPGA Xilinx come fermi (a livello innescato) invece di infradito (a margine).


3
Un pericolo è che, a meno che uno non limiti il ​​compilatore logico, potrebbe produrre una logica che ha un tempo di propagazione negativo per alcune porte. Ad esempio, se si specifica X=(someComplexFormula)e Y=X & D, e se il compilatore sostituisce quella formula per X e determina che X & Dè equivalente a A & D, il compilatore potrebbe sostituire il calcolo Y in termini di A e D, piuttosto che in termini di X, consentendo così il calcolo di Y procedere più velocemente di quello di X. Tali sostituzioni sono valide con la logica combinatoria, ma causano il caos sulla logica sequenziale asincrona.
supercat

@supercat - Non ho mai lavorato con gli strumenti di Xilinx, ma quando ho lavorato con FPGA Altera, hai sempre avuto la possibilità di specificare eventuali percorsi critici come moduli gate collegati piuttosto che in RTL, a quel punto tali ottimizzazioni sono Disabilitato.
Jules,

@Jules: Tutti i miei progetti di logica programmabile hanno usato Abel, che è un linguaggio un po 'sciocco, ma rende possibile specificare le cose in modi che alcuni CPLD possono implementare, ma che potrebbero creare difficoltà per uno strumento di sintesi VHDL o Verilog. Ad esempio, in uno dei miei progetti, ho sfruttato il fatto che le parti Xilinx hanno clock, set asincrono e reset asincrono, per implementare un registro a scorrimento caricabile asincrono. Se devo fare queste cose in un FPGA, non avendo mai usato Verilog o VHDL, come dovrei imparare cosa è necessario per farlo? A proposito, se la memoria serve, ho usato T flop per il cambio, e ...
supercat

... il tempismo era tale che la scrittura asincrona poteva avvenire solo in momenti in cui l'ingresso T sarebbe stato basso, supponendo che se si fosse verificato un clock negativo vicino all'inizio di un impulso di scrittura, la scrittura asincrona si sarebbe estesa abbastanza oltre per garantire un valore stabile, e se l'orologio non si fosse verificato verso la fine, si sarebbe semplicemente bloccato un valore ancora stabile. Non sono sicuro di come si possano gestire efficacemente casi del genere in VHDL o Verilog.
supercat

@supercat - prendendo un problema simile, guardando il Manuale del dispositivo Cyclone IV Vedo che l'approccio migliore allo stesso problema sarebbe usare l'opzione "Carico sincrono a livello di LAB" (un "LAB" è un gruppo di 16 elementi logici , quindi se la dimensione di un tale registro non finisce per un multiplo di 16 bit, alcuni bit verranno sprecati, ma questa sembra comunque l'opzione più utile). Ora ho due opzioni: posso scrivere verilog funzionali che richiederanno allo strumento di sintesi di scegliere un modo per implementare il registro richiesto (che di solito sarebbe l'opzione migliore), o, se ho un tempismo rigoroso ...
Jules

3

Come ha sottolineato @Andrey, non vale la pena. In particolare gli strumenti non lo fanno, quindi saresti completamente da solo. Inoltre, poiché dispongono di registri integrati, non si risparmia nulla non utilizzandoli.


3

Davvero ci sono TRE tipi di design.

  1. Combinatoria. Non ci sono orologi né percorsi di feedback e il sistema non ha "memoria". Quando uno o più input cambiano le modifiche si increspano attraverso la logica. Dopo qualche tempo l'uscita si imposta su un nuovo stato dove rimane fino a quando gli ingressi cambiano di nuovo.
  2. Sequenziale sincrona. Un sistema è costituito da registri e blocchi di logica combinatoria, i registri sono sincronizzati da un piccolo numero (spesso 1) di orologi. Se sono presenti più clock, potrebbero essere necessarie speciali precauzioni sui segnali che passano da un dominio di clock a un altro.
  3. Sequenziale asincrono. Esistono percorsi di feedback, chiavistelli, registri o altri elementi che danno la memoria di progettazione degli eventi passati e che non sono sincronizzati da linee di orologio facilmente analizzate.

In generale, quando si sintetizzano / ottimizzano la logica combinatoria, gli strumenti presumono che tutto ciò che conta sia il risultato finale e il tempo massimo necessario per stabilirsi su quel risultato.

Puoi costruire un design puramente combinatorio e otterrà il giusto risultato. Le uscite possono cambiare in qualsiasi ordine e possono cambiare più volte prima di raggiungere i loro valori finali. Tali progetti sono molto dispendiosi di risorse logiche. La maggior parte degli elementi logici trascorrerà la maggior parte del loro tempo seduti inattivi, mentre in un sistema sequenziale avresti potuto riutilizzare quegli elementi per elaborare più elementi di dati.

In un sistema sincrono sequenziale tutto ciò che conta è che le uscite del blocco combinatorio si siano stabilizzate al loro stato corretto quando sono sincronizzate con il successivo flip flop. Non importa in quale ordine cambiano o se sono difetti lungo la strada. Anche in questo caso gli strumenti possono facilmente trasformarlo in una logica che, purché l'orologio sia abbastanza lento, dia la risposta giusta (e possono dirti se l'orologio che vuoi usare è abbastanza lento).

In un sistema sequenziale asincrono tali ipotesi escono dalla finestra. I glitch possono importare, l'ordine delle modifiche di output può avere importanza. Sia gli strumenti che gli stessi FPGA sono stati progettati per progetti sincroni. Ci sono state molte discussioni (progettazione FPGA asincrona di Google se si desidera saperne di più) sulla possibilità di implementare sistemi asincroni su FPGA standard o su progetti progettati in modo speculare, ma non rientra ancora nella pratica di progettazione accettata dal mainstream


2

Sì. Se non hai costrutti di tipo processo, non dovrebbe fare cose come inferire i registri. Ci saranno cose come la memoria integrata che richiedono orologi, anche se se lo desideri puoi probabilmente generarli in modo asincrono.


1
Intendevi rendere questa una sola risposta?
Kevin Vermeer,

1

FWIW Ho pensato di aggiungere che un ovvio obiettivo nelle soluzioni logiche asincrone sarebbe la riduzione globale del consumo di energia.

Quei clock globali / PLL / buffer bruciano molti Joule.

Poiché le soluzioni FPGA si snodano in arene alimentate a batteria (ad es. Lattice Icestick), questo aspetto acquisirà molta più attenzione.


Questo è un buon punto, anche se vale la pena considerare che un circuito combinatorio mal progettato che esegue la stessa operazione di un circuito sequenziale potrebbe in alcuni casi effettuare molte transizioni transitorie poiché vengono calcolati i risultati parziali e l'output finale viene aggiornato per tenerne conto, e nei circuiti CMOS (come la maggior parte degli FPGA) il consumo energetico è approssimativamente proporzionale al numero di transizioni. Gli orologi possono causare transizioni non necessarie, ma puoi anche fare molte riduzioni di potenza disabilitando gli orologi in parti del circuito che al momento non sono necessari.
Jules,
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.