FPGA: conto alla rovescia o conto alla rovescia?


11

Sto imparando ad usare un FPGA (scheda di sviluppo Papilio, che ha una xilinx spartan3e, usando vhdl).

Devo dividere un impulso in arrivo per un numero (hard coded).

Riesco a vedere 3 opzioni - approssimativamente, come pseudocodice (usando 10 conteggi come esempio):

  1. Inizializza su 0, all'aumentare il fronte di salita aumenta di 1, rispetto a 10; se sono uguali, reimpostare su 0 e attivare l'impulso di uscita
  2. Inizializza su 10, sul fronte di salita diminuisce di 1, confronta con 0; se sono uguali, resettare a 10 e attivare l'impulso di uscita
  3. Inizializza su 9, ma assicurati che ci sia almeno 1 bit "0" iniziale, che è il mio bit di uscita. Sul fronte di salita dell'ingresso diminuisce di 1. Sul fronte di salita del bit di uscita, resettare.

Il ciclo di lavoro non è importante.

Uno di questi è migliore degli altri? Esiste un metodo ancora migliore a cui non ho pensato?

C'è un modo "standard" che darà al compilatore le migliori possibilità di ottimizzazione?


3
Sono solo tre le opzioni :-) ... Ma sul serio, non ha molta importanza in un FPGA. I singoli elementi logici sono abbastanza generali da richiedere lo stesso numero di risorse e offrire le stesse prestazioni in qualunque modo. La decisione dipende dal fatto che sia utile altrove nel progetto avere i numeri contando su o giù o qualche altro modello.
Dave Tweed,

2
4a opzione: registro a scorrimento circolare a 10 bit caricato con "1000000000" e spostato su un fronte di salita. Utilizzare un bit del registro a scorrimento come abilitazione per ciò che si sta facendo.
Lincoln,

1
Come nota a margine: lo strumento GUI del compilatore / installatore, dopo aver terminato il lavoro, dovrebbe avere un'opzione che ti mostra il circuito reale creato a vari livelli di astrazione, fino alle porte, quindi dovresti essere in grado di vedere come lo strumento si è adattato al tuo circuito e quindi è possibile apportare le modifiche appropriate alla fonte.
Anonimo il

Risposte:


12

L'ottimizzazione a questo livello ti spezzerà il cuore. Il risultato potrebbe cambiare a causa della tecnologia dell'FPGA che stai utilizzando, di altri fattori nell'FPGA, ma anche a causa di fattori al di fuori del tuo controllo, tra cui il seme del numero casuale dell'installatore.

Detto questo, credo che l'opzione 3 sarà la migliore. Le opzioni 1 e 2 hanno un comparatore / porta OR che va tra i contatori in modo che possa segnalare che il numero di destinazione è stato raggiunto. L'opzione 2 potrebbe essere leggermente più veloce di 1, dal momento che tutto può essere dritto o fatto insieme senza inverter, ma di nuovo si verificano piccole differenze tecnologiche dove può essere più veloce su AND o XOR.

L'opzione 3 salta il confronto per il basso costo di un bit in più nel contatore. Questo dovrebbe valerne la pena, a meno che tu non sia severamente limitato nelle infradito.

Un fatto divertente riguardo ai contatori è che tendono ad essere raggruppati in una dimensione specifica del dispositivo all'interno di un blocco logico e vedrai che i tempi cambiano più del previsto se questo bit in più ti spinge fuori da quel gruppo.


+1, salvo le velocità di clock che spingono i limiti della tecnologia, si dovrebbe lasciare che il rapporto di temporizzazione guidi le loro ottimizzazioni di temporizzazione. Inseguire centinaia di picosecondi su uno Spartan 3e o qualsiasi FPGA per quella materia, senza causa è generalmente perdita di tempo.
jalalipop,

4

Un'altra opzione sarebbe quella di inizializzare il contatore su 6 (= 2 4 - 10), contare e poi resettare quando si attiva l'uscita carry (cioè, gli FF sono tutti uno).

Il vantaggio è che non richiede un FF aggiuntivo e molti FGPA hanno una logica ausiliaria dedicata per accelerare questo tipo di operazione di trasporto in un circuito contatore o sommatore.


3

Dipende. Ad esempio: il ritardo di propagazione del flip-flop per 0 → 1 e 1 → 0 può essere diverso, e quindi i ritardi di transizione di un contatore per 000 → 001 e 001 → 000 possono essere leggermente diversi. Può essere superiore o inferiore, a seconda della tecnologia cmos utilizzata in FPGA. Quindi devi sintetizzare e scoprire quale ha prestazioni di cronometraggio migliori.


3

Dal punto di vista dello scrittore di un compilatore: se si utilizza integer, la rappresentazione interna non è definita e il compilatore è libero di scegliere l'implementazione più efficiente.

Se imponi una particolare rappresentazione interna, l'ottimizzatore tenterà comunque di migliorarla, ma inizierà da un punto di vista leggermente peggiore.

N-1

A meno che non si conosca la struttura interna, le risorse allocate ad altra logica (molti FPGA hanno una logica di moltiplicazione aggiunta in virgola mobile dedicata che è possibile utilizzare anche per implementare un contatore se si dispone di unità rimanenti) e si è certi che non si cambierà a un modello diverso, la risposta è "non ci pensare".

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.