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


von Vietlong D. (Firma: ial) (e_series)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Vietlong D. (Firma: ial) (e_series)


Lesenswert?

Es funktioniert super.
Vielen Dank für deine Hilfe

Schöner Gruß,
Long

von Matthias (Gast)


Lesenswert?

@Vietlong Do

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

von Vietlong D. (Firma: ial) (e_series)


Angehängte Dateien:

Lesenswert?

@Matthias,

Hier ist mein Code

Gruss,Long

von Vietlong D. (Firma: ial) (e_series)


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

von Vietlong D. (Firma: ial) (e_series)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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;

von Vietlong D. (Firma: ial) (e_series)


Lesenswert?

Vielen Dank für deine Antwort.
Gruß, Long

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.