www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Amplitude von Sinus ändern in FPGA


Autor: Vietlong Do (Firma: ial) (e_series)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?serendip...) 
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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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:
sinusplusoffset <= std_logic_vector(unsigned((sinus*Amplitude)/(128*5))+to_unsigned(128,8));
hier z.B. mit Amplitude von 0..128.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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  ;-)
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.

Autor: Vietlong Do (Firma: ial) (e_series)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert super.
Vielen Dank für deine Hilfe

Schöner Gruß,
Long

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Vietlong Do

Hi Vietlong,
könntest du deinen Code mal posten, würde mich auch mal interresieren. 
Gruss, Matthias

Autor: Vietlong Do (Firma: ial) (e_series)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias,

Hier ist mein Code

Gruss,Long

Autor: Vietlong Do (Firma: ial) (e_series)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Vietlong Do (Firma: ial) (e_series)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.
    if (Sign1='1') 
    then   
    for Amplitude in 0 to 25
    loop D_out1 <= std_logic_vector(to_unsigned(127,8)+ unsigned(Result1)*Amplitude/128);  end loop;      
    else   
    for Amplitude in 0 to 25
    loop D_out1 <= std_logic_vector (to_unsigned(127,8)- unsigned(Result1)*Amplitude/128); end loop;
    end if;
Die Schleife hier ist völlig unnötig, ich habe keine Ahnung, was die 
soll...

Wenn du das hast:
     Result1 <= Sinus_Rom (to_integer(Address1));
     Result2 <= Sinus_Rom (to_integer(Address2));
     Result3 <= Sinus_Rom (to_integer(Address3));
Dann reicht das aus:
  port ( amplitude : std_logic_vector(6 downto 0);
  :
  Result1 <= Sinus_Rom (to_integer(Address1));
  :
  if (Sign1='1') then   
    D_out1 <= std_logic_vector(to_unsigned(127,8) + (unsigned(Result1)*unsigned(Amplitude))/128);  
  else   
    D_out1 <= std_logic_vector(to_unsigned(127,8) - (unsigned(Result1)*unsigned(Amplitude))/128);  
  end if;

Autor: Vietlong Do (Firma: ial) (e_series)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für deine Antwort.
Gruß, Long

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.