Forum: FPGA, VHDL & Co. Frequenzgenerator in VHDL


von Gast (Gast)


Lesenswert?

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.

von Antti Lukats (Gast)


Lesenswert?

phase accumulator
NCO/DDS

Antti

von Al Bundee (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Ja, schon. Aber wie realisiert man so etwas in VHDL?

von Gast (Gast)


Lesenswert?

Oh, danke. Das ist genau das was ich gesucht habe. Da war jemand beim 
Antworten schneller.

von Gerd (Gast)


Lesenswert?

ISt ja der Hammer: Eine 6502 Architektur auf dem FPGA - coole Seite!

von Gast (Gast)


Lesenswert?

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?

von Gast (Gast)


Lesenswert?

-- 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

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Beispiel: Schalter stellen die Frequenz ein, auf den Leds sieht man den 
Counter hochzählen mit der aktuell eingestellten Frequenz.

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Hier das dds-Modul vom ct-Lab Projekt.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

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