Forum: FPGA, VHDL & Co. Verständnisfragen zur Sinusausgabe mit PWM von Lothar Miller


von Stefan M. (stefan88)


Lesenswert?

http://www.lothar-miller.de/s9y/archives/57-Sinusausgabe-mit-PWM.html

Hallo.
Ich probiere gerade die Sinusausgabe mit PWM von Lotahr Miller aus 
(s.o.).
Als FPGA / VHDL Neuling habe ich dazu 2 Fragen:

Im PWM Modul werden die Eingangswerte folgendermaßen definiert:
    Generic ( width: natural := 8;        -- Breite
              fclk : integer := 50000000; -- Taktfrequenz
              fpwm : integer := 1000      -- PWM-Frequenz

FRAGE 1: Kann ich die bordeigene Taktfrequenz von 50 MHz an dieser 
Stelle manuell verändern?

--------------------------------------------------------

Im Quelltext von SinusPWM steht:
begin
   I_ddfs : DDFS
   port map( CLK => clk,
             Freq_Data  => x"cc",
             Dout => sinus);

FRAGE 2: Was bedeutet "x"cc" ?  Wie und wo kann ich die Frequenz vom 
Sinus verändern?

von Lars (Gast)


Lesenswert?

0xcc sind 252, wenn ich richtig rechne und das dürfte die Frequenz sein.

Die Taktfrequenz sollte der Deines boards entsprechen, weil sonst die 
rechung nicht stimmt = frequenz nicht stimmt.

was du anpassen muss, ist die pwm frequenz, die ist mit 1000 sehr 
niedrig

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


Lesenswert?

Stefan Marxsen schrieb:
> FRAGE 1: Kann ich die bordeigene Taktfrequenz von 50 MHz an dieser
> Stelle manuell verändern?
Wie meinst du das? Willst du per Konstante die Frequenz eines 
50MHz-Quarzoszillators umstellen?
Kurz: diese Stelle hat wie shcon gesagt nichts mit "können" zu tun, 
sondern mit "müssen": hier muss der Takt eingetragen werden, mit dem die 
DDFS getaktet wird.

> FRAGE 2: Was bedeutet "x"cc" ?
Da ist ein Anführungszeichen zuviel drin...
Mit X" beginnt in VHDL eine hexadezimale Zahl. Die kann also auch so 
aussehen:
x"1"  oder X"aa" oder  x"1a2b3c4d"  oder  X"BADC0FFEE"  oder 
x"BADCAB1E"  oder  X"deadbeef"

> Wie und wo kann ich die Frequenz vom Sinus verändern?
Du übergibst statt x"cc" einfach x"55" oder sonstwas. Siehe dort auch 
den Link auf http://www.lothar-miller.de/s9y/categories/31-DDFS

Lars schrieb:
> was du anpassen muss, ist die pwm frequenz, die ist mit 1000 sehr
> niedrig
Richtig. das hatte ich nur gemacht, dass man die Änderung der PWM in der 
Wveform auch hübsch sieht. In der Praxis sollte ein Sinus schon deutlich 
besser aufgelöst werden. Sonst ruckelts...

von Stefan M. (stefan88)


Lesenswert?

Ok, sehr gut. Danke.

Das bedeutet, dass ich hexadezimal maximal Freq_Data= x"FF" angeben 
kann. Somit hätte der Sinus eine maximale Frequenz von 23.8Hz * 255 = 
6080Hz.
Kann ich den Sinus irgendwie noch schneller machen? Min. 10 KHz wären 
schon klasse...

Mein Ausgangssignal auf dem Oszilloskop sieht noch sehr verrauscht aus. 
Ich möchte die Darstellung durch triggern verbessern. Wie kann ich an 
den vorgeteilten FPGA-Takt rankommen? Es reicht sicherlich nicht, "pre" 
auf einen Ausgang zu legen, oder?

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


Lesenswert?

Stefan Marxsen schrieb:
> Kann ich den Sinus irgendwie noch schneller machen?
Ja. Problemlos.

> Min. 10 KHz wären schon klasse...
Lies das, was im Link im 
Beitrag "Re: Verständnisfragen zur Sinusausgabe mit PWM von Lothar Miller" steht. Verstehe es, 
und du erkennst, dass die Frequenz deines Signals gleich der 
Überlauffrequenz des Akkumulators ist. Wenn dir das klar ist, dann mach 
den Akku kürzer oder summiere statt 8 Bit einfach 9 Bit drauf. Der Weg 
bis zum Kapieren ist mit Ausprobieren verbunden und nennt sich 
"Lernen"...

> Mein Ausgangssignal auf dem Oszilloskop sieht noch sehr verrauscht aus.
Warum?
Welches Signal und welcher Ausgang?

> Ich möchte die Darstellung durch triggern verbessern. Wie kann ich an
> den vorgeteilten FPGA-Takt rankommen?
Der bringt dir nichts, denn du must eigentlich mit dem MSB des 
Akkumulators triggern. Und ja, das kannst du einfach auf einen Pin 
legen...

> Es reicht sicherlich nicht, "pre" auf einen Ausgang zu legen, oder?
Ich habe sowas nie gefragt, sondern einfach mal probiert...

von Stefan M. (stefan88)


Lesenswert?

Danke für die Hilfe. Habe die Links gewälzt und das Prizip kapiert. Auch 
einige Probeläufe mit verschiedenen Frequenzen liefen erfolgreich.

Einziges Problem für mich als VHDL-Newbie ist noch die Verkürzung des 
Akkus in der Praxis.
Ziel ist ein Sinus mit 10.013 Hz. Den erreiche ich bei 50 MHz 
Taktfrequenz und einer verkürzten Akku auf insgesamt 20 Bits (inkl. 
Vorteiler) mit Freq_Data  => x"D2". Also fout= (50*10^6/2^20)*210 = 
10.013 Hz

Ich habe vermutlich den Akku falsch verkürzt, denn am Oszi messe ich 
immer noch ca. 5 kHz :-(

Habe statt 20 downto0 Accum auf 19downto 0 , also auf 20 Bits 
beschränkt:

Architecture RTL of DDFS is
  signal Accum   : unsigned (19 downto 0) := (others=>'0');


Ist meine Verkürzung falsch? Wenn ja, wie muss ich die Verkürzung 
richtigerweise programmieren?

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.