Amplitude von Sinus ändern in FPGA

OP (Firma: ial) #1599055
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?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
Moderator (Firma: Titel) Persönliche Seite #1599308
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:
1
sinusplusoffset <= std_logic_vector(unsigned((sinus*Amplitude)/(128*5))+to_unsigned(128,8));
hier z.B. mit Amplitude von 0..128.
Moderator (Firma: Titel) Persönliche Seite #1599427
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  ;-)
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.
Moderator (Firma: Titel) Persönliche Seite #1607671
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.
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;

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.