Amplitude von Sinus ändern in FPGA

(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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren