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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.