PDA

View Full Version : [VHDL] seno e coseno in virgola mobile


BlackWinterDay
31-08-2004, 14:19
Devo realizzare un ALU floating-point in vhdl..
la cosa che mi da più problemi è come fare per il calcolo del seno e del coseno. Qualcuno mi saprebbe aiutare?

cionci
31-08-2004, 14:48
Interessante...me lo sono sempre chiesto... Come si realizzano seno e coseno in una FPU ?

ilsensine
31-08-2004, 15:43
Normalmente per interpolazione, eventualmente in congiunzione con uno sviluppo di Taylor locale, credo.
Non è un argomento facile, ti consiglio di rivolgerti presso www.opencores.org per vedere se possono aiutarti. Hanno realizzato delle fpu e dei processor core "open source", forse puoi trovare qualche spunto.
Però ti ripeto che _non_ è facile.

cionci
31-08-2004, 15:47
Ci sta che sia generati in aniera tabellare...e poi per interpolazione fra i due punti della tabella più vicini ?

ilsensine
31-08-2004, 15:50
E' un modo. Poi se al posto della semplice interpolazione usi uno sviluppo in serie locale, dovrebbe essere un _buon_ modo.
Farlo in vhdl però non è la cosa più divertente del mondo.

BlackWinterDay
31-08-2004, 15:52
Originariamente inviato da ilsensine
Normalmente per interpolazione, eventualmente in congiunzione con uno sviluppo di Taylor locale, credo.
Non è un argomento facile, ti consiglio di rivolgerti presso www.opencores.org per vedere se possono aiutarti. Hanno realizzato delle fpu e dei processor core "open source", forse puoi trovare qualche spunto.
Però ti ripeto che _non_ è facile.

Anche io pensavo a Taylor.. ho già guardato la fpu di opencores ma non ha seno e coseno.

Ho appena scoperto che esiste un algoritmo chiamato CORDIC (COrdinate Rotation DIgital Computer). Qualcuno lo conosce?

ilsensine
31-08-2004, 16:02
Originariamente inviato da BlackWinterDay
Anche io pensavo a Taylor.. ho già guardato la fpu di opencores ma non ha seno e coseno.
Hanno anche diversi core di cpu, ma non so se hanno sin/cos. Dovresti spulciarti i sorgenti.

Sono tanti anni che non vedo il vhdl, bei ricordi...:cry:

BlackWinterDay
31-08-2004, 16:06
Originariamente inviato da ilsensine

Sono tanti anni che non vedo il vhdl, bei ricordi...:cry:

Io non vedo l'ora di accantonarlo :rolleyes:

CORDIC sembra promettente.. cerco di capirci qualche cosa.

cionci
31-08-2004, 16:13
Io conosco solo Verilog...sorry :(

lombardp
01-09-2004, 07:15
Originariamente inviato da BlackWinterDay
Io non vedo l'ora di accantonarlo :rolleyes:

CORDIC sembra promettente.. cerco di capirci qualche cosa.

Il CORDIC è la formula ricorsiva per il calcolo di sin(x) e cos(x) attraverso rotazioni in un sistema polare.

Su www.opencores.org ci sono core verilog/VHDL free, per esempio quello del CORDIC è:

http://www.opencores.org/projects.cgi/web/cordic/overview

repne scasb
01-09-2004, 10:59

cionci
01-09-2004, 15:07
Bello ;)

BlackWinterDay
01-09-2004, 16:52
Originariamente inviato da repne scasb
Questo e' l'algoritmo base con cui un Intel i80486DX esegue l'istruzione assembly float FSIN:

1) Sia X l'argomento della funzione Seno.
2) Viene calcolata la quantita' intera A=X/(Pi/2). NOTA: Pi=Pgreco, la divisione e' float.
3) Viene calcolata la quantita' float B=(X/(Pi/2)-Q)*(Pi/2).
4) Vengono salvati i bit 0 e 1 di A, il resto viene ignorato.
5) Se il bit 0 di A e' 0 allora B=B; se il bit 0 di A=1 allora B=(Pi/2)-B.
6) B viene "normalizzato" mediante trasformazione da float a intero.
7) L'operazione di normalizzazione genera un indice e un sub-indice interi.
8) L'indice viene utilizzato come puntatore ad una tabella in cui risiedono i valori precalcolati di SIN(X).
9) Il sub-indice viene utilizzato come puntatore ad una sotto-sotto-tabelle contenente il valore di correzione.
10) Sia C il valore trovato al punto 8) e D il valore trovato al punto 9).Y=SIN(X)=C+D.
11) Se il bit 1 di A e' 0 allora Y=Y; se il bit 1 di A=1 allora Y=-Y.

Mediamente vengono utilizzati 241 cicli di clock.

NOTA(1): i punti 2) e 3) vengono eseguiti contemporaneamente.
NOTA(2): il punto 7) e' molto piu' complessa di quello che sembra.
NOTA(3): i punti 8) e 9) vengono eseguti contemporaneamente.


Devo però ricorrere comunque a una tabella con dei valori precalcolati del seno.,

BlackWinterDay
01-09-2004, 16:54
Originariamente inviato da lombardp
Il CORDIC è la formula ricorsiva per il calcolo di sin(x) e cos(x) attraverso rotazioni in un sistema polare.

Su www.opencores.org ci sono core verilog/VHDL free, per esempio quello del CORDIC è:

http://www.opencores.org/projects.cgi/web/cordic/overview

Pensi che possa servirmi di Cordic?

lombardp
02-09-2004, 07:08
Originariamente inviato da BlackWinterDay
Pensi che possa servirmi di Cordic?

Questo non so dirtelo con certezza, però praticamente TUTTI i core verilog/VHDL usano il CORDIC per fare le operazioni trigonometriche.

Ti invito nuovamente a dare un'occhiata al core su www.opencores.org, almeno per capire come hanno affrontato il problema.