Hallo, kann hier jemand einem Anfänger erklären, wie man einen Frequenzgenerator in VHDL realisiert mit folgenden Randbedingungen: * Einstellbare Frequenz im Bereich 0.05 Hz bis 1Mhz * Schrittweite/Auflösung: 0.01 Hz. Für Anregungen wäre ich schon einmal dankbar.
Fur das ct´lab hat der heise-Verlag eine FPGA-Platine entwickelt. Dafür gibt es unter anderem auch einen Frequenzgenerator, DDS genannt. Siehe http://www.heise.de/ct/projekte/machmit/ctlab/wiki/FPGAProjekte Die Sourcen findest Du unter http://www.heise.de/ct/projekte/machmit/ctlab/browser/FPGA_ISE, die Datei heisst ct-DDSFGEN.zip
Oh, danke. Das ist genau das was ich gesucht habe. Da war jemand beim Antworten schneller.
Ok, wenn ichs richtig verstehe, wird zum generieren der Frequenz das oberste Bit des "phase accumulators" genommen. Wenn man pro Clocktick zusätzlich eins mehr draufaddiert, so verdoppelt man die Ausgabefrequenz. Wie muss man ein DDS denn ansteuern, damit man die erzeugten Frequenzen in kleinen Schritten durchspringen kann? Also: 0.01Hz -> 0.02Hz -> 0.03Hz usw. und sich die Frequenz nicht immer verdoppelt?
-- Bestimmung von Takt und L<E4>nge des Phasenz<E4>hlers: -- -- Taktfrequenz: f_takt -- Phasenz<E4>hler: phase -- Bitbreite des Phasenz<E4>hlers : w_phase bit -- L<E4>nge des Phasenz<E4>hlers: l_phase = 2^w_phase -- Bei jedem Takt zum Phasenz<E4>hler addierter Wert: d_phase -- => Kleinste einzustellende Frequenz: f_min = f_takt / l_phase -- => Generierte Frequenz: f_gen = f_min * d_phase -- => oder d_phase = f_gen / f_min -- wobei f_takt und l_phase und damit f_min beim Design festzulegende Konstanten sind. -- Gibt man f_min und f_takt vor, so ergibt sich die L<E4>nge des Phasenz<E4>hlers zu -- => l_phase = f_min / f_takt -- Der Maximalwert d_phase_max von d_phase ergibt sich aus der maximal zu generierenden -- Frequenz f_gen_max zu -- => d_phase_max = f_gen_max / f_min -- -- Ganz einfaches Beispiel: -- w_phase = 8 bit -- => l_phase = 2^8 = 256 -- => phase = 0..255 -- f_takt = 128 Hz -- => f_min = 128 Hz / 256 = 0.5 Hz -- f_gen = 1 Hz soll eingestellt werden -- => d_phase = 1 Hz / 0.5 Hz = 2 -- -- Konkretes Beispiel: -- Forderungen: -- f_min = 0.01 Hz -- f_max = 10 MHz -- etwa 2-fach Oversampling bei 10 MHz, damit analoge Filterung einfacher wird -- => f_takt ca. 40 MHz -- -- => l_phase ca. 4e7 / 0.01 = 4e9 => w_phase = 32 bit => l_phase = 2^32 = 4294967296 -- => f_takt = l_phase * f_min = 42949672.96 Hz = 4194304 Hz * 32/10 * 32/10 -- => Quarz mit 2^22 Hz = 4194304 Hz und zwei nachgeschaltete DCM mit jeweils -- CLKFX_MULTIPLY = 32 und CLKFX_DIVIDE = 10 -- Achtung: Wird der DCM mit solch niedriger Eingangs-Frequenz betrieben, d<FC>rfen die -- PLL-Ausg<E4>nge nicht genutzt werden! -- Alternativ: 50 MHz Quarz 17 24 19 25 = 42947368 Hz -- => d_phase_max = 1e7 / 0.01 = 1e9 => w_d_phase = 30 bit -- => f_gen_max = 2^30 * 0.01 = 10737418.23 Hz (einstellbar) -- Ausgabe erfolgt mit x8000 Offset f<FC>r DAC -- Pegeleinstellung ebenfalls mit x8000 Offset, x8000= Null, xFFFF = Max., x0000 = Max. invertiert
Beispiel: Schalter stellen die Frequenz ein, auf den Leds sieht man den Counter hochzählen mit der aktuell eingestellten Frequenz.
Das ist aber suboptimal, weil Du so im Nullfall die clock ausgibts und zwar direkt. Das sollte über z.B. DDR-Zellen geschehen.
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.