Forum: FPGA, VHDL & Co. Generation einer SIN-COS LUT unter Altera Megawizzard


von Karl Pirinha (Gast)


Lesenswert?

Lässt sich mit dem Altera Megawizzard irgendwie eine LUT für SIN/COS 
oder ein Berechung dafür generieren? Xilinx hat sowas drin.

Gibt es das überhaupt ? gfs als käuflicher Core?

... oder muss ich mir ein ROM bauen und die Werte selber erzeugen?

von Falk B. (falk)


Lesenswert?

Also ehe ich das kaufe, mach ich es in 10 Minuten lieber selber mit 
Excel.

MFg
Falk

von Mark (Gast)


Lesenswert?

hm, das wäre doch mal interessant, ob sich ein generischer VHDL-Code 
dafür schreiben lässt, der vom Synthesetool in ein Block-RAM umgesetzt 
wird.
Dann brauch ich mir auch kein Excel kaufen ;-)

von thomas (Gast)


Lesenswert?

Man nehme einen C-Compiler, schreibt ein wenig Quelltext und schon 
bekommt man einen Sin/Cos-LUT mit "beliebig" vielen Stellen.
30 Zeilen C-Code ^^

von Rick Dangerus (Gast)


Lesenswert?

Oder python. Da kann man den Code später auch noch lesen und ggf. 
weiterverwenden.

Rick

von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

>>30 Zeilen C-Code

3 Zeilen Matlab, zu C also 20dB einfacher !

c=cos(2*pi*(0:9999)/10000);
s=sin(2*pi*(0:9999)/10000);
save t.txt s c  /ascii

File habe ich angehängt, das is unter GPL, have fun !

Cheers
Detlef

von thomas (Gast)


Lesenswert?

Jo, das ist sicherlich weniger Schreibarbeit, allerdings hätte ich keine 
Lust 10000 Werte in einen BRAM per Hand zu schreiben. In meinen 
zusätzlichen Zeilen ist gleich noch die Initialisierung für den BRAM 
drin. Also nur einige wenige Copy&Paste anstatt 10000 x in Hex umwandlen 
und jedesmal C&P ;)

Werde morgen mal den Code posten, falls das erwünscht ist. Hab ihn 
gerade nicht zur Hand.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

c=cos(2*pi*(0:999)/1000);
sprintf('%i, \n', round(c*255))

...und das dann einfach in die Arrayinitialisierung reinkopieren.

Es hat schon einen Sinn warum Skriptsprachen wie Matlab erfunden wurden.

von Mike (Gast)


Lesenswert?

Nun falls dich überhaupt nichts erschickt, dann kannst du das auch mit 
der eingebauten TCL-Shell probieren:

1
for {set i 0} {$i <= 90} {incr i} {puts [format "%X" [expr {int(sin($i/90.*acos(0))*255)}]]}

Zu finden unter View->Utility Windows->TCL Console.

von Falk B. (falk)


Lesenswert?

@ Detlef _a (detlef_a)

>3 Zeilen Matlab, zu C also 20dB einfacher !

>c=cos(2*pi*(0:9999)/10000);
>s=sin(2*pi*(0:9999)/10000);
>save t.txt s c  /ascii

>File habe ich angehängt, das is unter GPL, have fun !

Vollkommen unbrauchbar! So ne Tabelle hat a) Integerwerte und b) braucht 
man noch das VHDL-Konstrukt.

Also nachbessern!

MFg
Falk

von Igor (Gast)


Lesenswert?

Wahrscheinlich, das ist mehr einfach:
Quartus II 7.1 --> MegaWizard --> DSP --> Signal Generation --> NCO 7.1
Tschuess!

von Karl Pirinha (Gast)


Lesenswert?

Den Megawizzard kenne ich, doch der macht nicht, was er soll. Er 
generiert entweder dynamishc über Algorithmik oder produziert gewaltigen 
Registerverbrauch. Die Funktion ist oversized für meine Ansprüche.
Ich habe Excelgenommen, was jederzeit leicht modifizierbar ist.

von Jonas Berger (Gast)


Lesenswert?

Hallo,
habe einen FIR Filter in Verliog implementiert und bin nun dabei diesen 
zu testen. Wie würde ich den eine Sinus LUT erzeuegn mit einem 8bit 
Amplitudenbereich von +1...-1.
Also das MSB representiert das Vorzeichen und die restlichen bits 
stellen den Nachkomma anteil der Zahl dar. Nachdem ich mit Excel 
gescheitert bin, versuch ich  das gerade mit Matlab, bekomme es aber 
irgendwie auch nicht auf die Reihe. Ein Lösungsvorschlag mit Excel wäre 
spitze.
Gruss,
Jonas

von Christian (Guest) (Gast)


Lesenswert?

Tipp:

StarOffice / Calc:
GANZZAHL ( 128 * SIN( winkel) ))

winkel in einer Spalte, dann obige Formel

von Jonas Berger (Gast)


Lesenswert?

Hey super,
das haut schin fast hin. Habe mir eine Tabelle wie Christian oben 
beschrieben hat erzeugt. Das Problem was ich nun habe ist die Wandlung 
der vorzeichenbehafteten Ganzzahl in ein Binärwort. Mit 
dezinbin(Zelle,8) hauts hin mit positiven Zahlen. Negative besitzen 
insgesamt 10Stellen und liegen im 2'S complement vor. Hat hier jemand 
einen Kniff auf Lager wie ich diese Geschichte vereinheitlichen könnte. 
Benötige zuviel Werte, da macht die perHandUmrechnung des 
Zweierkomplements für die einzelnen Werte nicht soviel Spass. Würde 
gerne direkt die Werte zur Initialiserung eines 8bit breiten FPGA onchip 
Speichers nutzen.
Danke und Gruss,
Jonas

von Igor (Gast)


Angehängte Dateien:

Lesenswert?

Probieren Sie es.
mfg.
Igor

von Jonas Berger (Gast)


Lesenswert?

Hallo,
ich habe mich nochmal in Matlab probiert und bin nun auch zu einem 
Ergebnis gekommen.
Sollte die Fixed-Point Toolbox vorhanden sein geht es so recht nett:

Ein Sinussignal im Q1,7 Format:

a=fi(sin(2*pi*(0:100)'*0.05),true,8,7);
a.bin

Danke für dein Post Igor; schaue mir gleich auch nochmal deinen Code an.
Gruss,
Jonas

von Gast (Gast)


Lesenswert?

"im Q1,7 Format:"

Was ist das ???

von Jonas Berger (Gast)


Lesenswert?

Das Q1,7 Format beschreibt eine sogenannte signed fractional fixed-point 
zahl.
Hierbei handelt es sich um eine 8bit Zahl mit einem Ganzzahlanteil von 1 
und sieben Nachkommastellen.

 S | . | X |   X  |  X  | X  | X  | X  |  X |
-1 | . |0.5| 0.25 | ... | ...| ...| ...| ...|

Der abgedeckte Zahlenbereich erstreckt sich somit von -1 bis (1- 1/128).
P.S Hat jemand schon mal einen FFT core in signed fractional 
implementiert ?
So etwas möchte ich mal als nächstes angehen. Der core sollte recht 
einfach gehalten werden: 8point, radix-2, kein inplace.
Über allgemeine Hinweise zum Vorgehen (overflow-Problematik, 
Zahlenbereichsauslegung etc.)
bin ich dankbar. Schönes WE,
Jonas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.