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?
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.
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.
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
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.