Hi Leute, ich muss ein Sinus Signal in FPGA erzeugen. In meiner Arbeit benutze ich einen 8 bit DA Wandler AD5300 und einen Opamp AD820. Mit den Code von Lothar-Miller(http://www.lothar-miller.de/s9y/index.php?serendipity[action]=search&serendipity[searchTerm]=sinus&serendipity[searchButton]=%3E) kann ich schon die Sinus Signal von -5V bis 5V mit 50Hz erzeugen. Jetzt möchte ich sowohl die Amplitude (-1V bis 1V) und die Frequenz ändern. Hat jemand eine Idee, wie soll ich es machen. schöner Gruß, Long
> Hat jemand eine Idee, Ja. > wie soll ich es machen. Die hardwareorientierte Lösung: Spannung: Nimm ein Poti und schließ das an den Ausgang des DA-Wandlers. Frequenz: Schließ als Taktquelle einen Frequenzgenerator an. In VHDL: Frequenz: ändere den Wert von Freq_Data Amplitude:
1 | sinusplusoffset <= std_logic_vector(unsigned((sinus*Amplitude)/(128*5))+to_unsigned(128,8)); |
hier z.B. mit Amplitude von 0..128.
Da war ich etwas zu schnell, das Teilen durch 5 geht nicht so ohne weiteres. Aber wenn du hier die Amplitude auf 0..25 (weil 25 = 128/5) einschränkst, dann geht das wieder ;-)
1 | sinusplusoffset <= std_logic_vector(unsigned((sinus*Amplitude)/128)+to_unsigned(128,8)); |
Du wirst ganz einfach an diesen beiden Stellen ein wenig herumspielen müssen, um zu sehen, welche Änderung was bewirkt.
Es funktioniert super. Vielen Dank für deine Hilfe Schöner Gruß, Long
@Vietlong Do Hi Vietlong, könntest du deinen Code mal posten, würde mich auch mal interresieren. Gruss, Matthias
Hallo zusammen, ich versuch mal in mein Code die For-Schleife als While-Schleife zu ersetzen. Es geht aber nicht. Kann jemand mich dieses Problem auszulösen. Gruss,Long
Hi all, also die range von for-schleife muss in integer sein. Aber möchte ich jetzt die range(Amplitude) als Eingangsignal definieren, dann läuft die Schleife nicht mehr. Kann jemand mir einen Rat geben ? Gruß,Long.
> also die range von for-schleife muss in integer sein. Viel schlimmer: die Werte der For-Schleife müssen konstant sein. Nur dann kann das Design synthetisiert werden. > Aber möchte ich jetzt die range(Amplitude) als Eingangsignal definieren, > dann läuft die Schleife nicht mehr. Die Amplitude wird nicht in der For-Schleife geändert, sondern der Wert einfach vor der Ausgabe skaliert.
1 | if (Sign1='1') |
2 | then
|
3 | for Amplitude in 0 to 25 |
4 | loop D_out1 <= std_logic_vector(to_unsigned(127,8)+ unsigned(Result1)*Amplitude/128); end loop; |
5 | else
|
6 | for Amplitude in 0 to 25 |
7 | loop D_out1 <= std_logic_vector (to_unsigned(127,8)- unsigned(Result1)*Amplitude/128); end loop; |
8 | end if; |
Die Schleife hier ist völlig unnötig, ich habe keine Ahnung, was die soll... Wenn du das hast:
1 | Result1 <= Sinus_Rom (to_integer(Address1)); |
2 | Result2 <= Sinus_Rom (to_integer(Address2)); |
3 | Result3 <= Sinus_Rom (to_integer(Address3)); |
Dann reicht das aus:
1 | port ( amplitude : std_logic_vector(6 downto 0); |
2 | :
|
3 | Result1 <= Sinus_Rom (to_integer(Address1)); |
4 | :
|
5 | if (Sign1='1') then |
6 | D_out1 <= std_logic_vector(to_unsigned(127,8) + (unsigned(Result1)*unsigned(Amplitude))/128); |
7 | else
|
8 | D_out1 <= std_logic_vector(to_unsigned(127,8) - (unsigned(Result1)*unsigned(Amplitude))/128); |
9 | end if; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.