Forum: FPGA, VHDL & Co. DDS (NCO) in VHDL realisieren


von Stefan (Gast)


Lesenswert?

Hallo Leute,

ich brauche Euren geschätzten Rat.

Ich bin gerade dabei einen DDS / NCO in VHDL zu schreiben. Ich will ihn 
nur intern im FPGA für Tests von Filtern oder für DDC verwenden.

Ich bin mir nicht wirklich im Klaren darüber, wie ich den Überlauf des 
Phasen-Accus behandeln soll.

Wird der Accu einfach vor einem drohenden Überlauf auf "0" gesetzt? Das 
Problem welches ich sehe ist, dass ja nur eine Ganzzahl an 
Phaseninkementen "delta_Phase" im Phasen-Accu Akkumuliert werden können 
ohne dass er überläuft. Es bleibt sehr oft ein, je nach Wert von 
"delta_Phase" abhängiger Rest bis zum Max. möglichen Wert des 
Phasen-Accus übrig. Dieser Rest ist im Bereich des Überlaufes nicht 
gleich dem "delta_Phase" der vorherigen Takte.
Dadurch enstehen Nichtlinearitäten bzw. Phasensprünge zw. zwei Zyklen 
die beim periodischen Abspielen zu einer Menge Spures führen würden.

Gibt es dafür ein Patentrezept oder wird der Accu wie im nachfolgenen 
Beispiel beschrieben realisiert?

process (clk, reset)
begin
if (reset = '0') then
  PhAccu <= (others => '0');
elsif (clk'event and clk = '1') then
  if (PhAccu + deltaPhase > MaxAccu) then
    PhAccu <= (others => '0');
  else
   PhAccu <= PhAccu + deltaPhase;
  end if;
end if;
end process;


Vielen Dank Stefan

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Dass der Akkumulator überläuft ist der Sinn der Sache. Nichtlinearitäten 
oder Phasensprünge entstehen dabei keine, allerdings sieht u.U. nicht 
jede Periode gleich aus (Jitter). Wenn du den Akkumulator bei einem 
Überlauf auf 0 zurücksetzt schneidest du immer ein Stückchen am Ende 
jeder Periode ab.

von Stefan (Gast)


Lesenswert?

Hallo Andreas,

ja du hast recht.

Bei all den allgemeinen Beispielen über NCOs/DDSs startet jeder Zyklus 
bei 0 und das hat mich doch etwas irritiert.

Ich habe da noch eine schöne Beschreibung gefunden.

Betrachtet wird ein 10Bit Akkumulator.
Angenommen der Wert 2Pi entspricht Binär 11-Bit: 100 0000 0000
Jeder Subtraktion von 2Pi ergibt wieder den gleichen Winkel im 
Einheitskreis. Das Abschneiden des 11. Bits ist das gleiche wie eine 
Subtraktion von 2Pi von der Phase.

Bsp:
Das PhasenInc beträgt: 01 0000 0000
Der Akku besitzt den aktuellen Wert: 11 1111 1111
Nach dem nächsten Takt wäre das Ergebniss: 100 1111 1111  ~2.5Pi

Wird das 11. Bit ignoriert (= 2Pi davon subtrahiert), beträgt das 
Ergebnis: 00 1111 1111  ~0.5Pi
was dem gleichen Winkel wie den von 2.5Pi im Einheitskreis entspricht.

Danke Stefan

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.