mikrocontroller.net

Forum: FPGA, VHDL & Co. Frequenzgenerator in VHDL


Autor: Gast (Gast)
Datum:

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

Autor: Antti Lukats (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
phase accumulator
NCO/DDS

Antti

Autor: Al Bundee (Gast)
Datum:

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

Die Sourcen findest Du unter 
http://www.heise.de/ct/projekte/machmit/ctlab/brow..., die 
Datei heisst ct-DDSFGEN.zip

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, schon. Aber wie realisiert man so etwas in VHDL?

Autor: Gast (Gast)
Datum:

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

Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISt ja der Hammer: Eine 6502 Architektur auf dem FPGA - coole Seite!

Autor: Gast (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:
Angehängte Dateien:

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

Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier das dds-Modul vom ct-Lab Projekt.

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist aber suboptimal, weil Du so im Nullfall die clock ausgibts und 
zwar direkt. Das sollte über z.B. DDR-Zellen geschehen.

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.