www.mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.