Ich habe mittels des Core Generators von Xilinx ISE 10.1 einen DDS Core
erzeugt. Mit folgenden Einstellungen: Frequency Resolution 10 kHz,
Spurious Suppression 72dB bzw. 12bit Ausgangsbreite, Clock 300 MHz,
Phase Increment Fixed, Phase Offset None.
Die 300 MHz sollen auf dem Spartan 3 AN Starter Kit mittels eines DCM
Cores erzeugt werden. Maximal sind 330 MHz möglich.
Wie bestimmt sich der Wert für den Phasen Increment bei der Festlegung
Fixed ? Im Menü des DDS Compilers wird der Wert 8000 Hex angegeben. Die
automatisch erzeugt vdl-Datei (Wrapper) beinhaltet auch diesen Wert. Die
Festlegung des Phasen Increments muß anscheinend durch nachträgliche
Änderung in der Wrapper-Datei erfolgen.
Für eine Ausgabefrequenz von 1 MHz ergibt sich ein Phasen Increment von
13,653. Lässt sich dieses nur ganzzahlig festlegen also 13 oder 14 ?
Wenn ja, ergäbe sich eine grosse Abweichung gegenüber der gewünschten
Frequenz.
In der Beschreibung des DDS Cores findet sich folgender Satz:
"Based on the Core customization parameters, the DDS core will
automatically employ quarter-wave symmetry when appropriate1."
Unter welchen Umständen wird die Symmetrie ausgenutzt ?
Auch die Programmierung des Phase Increments und des Phase Offsets ist
mir noch nicht klar. Werde die Beschreibung weiter durchforsten.
Der D/A-Wandler läuft?
Dann hast du sicherlich einen Sample-Takt von 1 bis 2 MHz.
Folgende DDS-Konfiguration wird fürs erste funktionieren:
System Clock 1 MHz (bzw. dein Sample-Takt)
SFDR 70 dB --> 12 Bit
Frq. Resolution 0.4 Hz
Phase Inkrement fixed
Phase Offset none
Output Frequency Ch 1 0.1 MHz
Auf Seite 4 brauchst du ein Clock Enable und das RDY
Das wars.
Nun hast du zwei Eingänge CLK und CE. An CLK legst du 50 MHz oder 100
MHz oder was du auch immer für einen Systemtakt hast (300 MHz sind nicht
sinnvoll). An CE legst du den Sampletakt (s.o.), der aber immer nur für
eine einzige Systemtaktperiode aktiv sein darf.
Als Ausgang bekommst du 12 Bit die zur State-Machine des D/A-Wandlers
als Daten hingehen. Das RDY benutzt du, um den Zustandsautomaten zu
triggern, damit ein neuer Ausgabezyklus beginnt, es ist auch immer nur
für eine Systemtaktperiode aktiv. Wenn alles klappt, bekommst du dann
einen 100 kHz Sinus aus dem D/A-Wandler.
Viel Erfolg!
Hallo Kurt,
vielen Dank für die schnelle Antwort.
>> System Clock 1 MHz (bzw. dein Sample-Takt)
Warum 1 Mhz ? Hatte gedacht das je schneller die Clockfrequenz, desto
höher die Ausgangsfrequenz. Je schneller, desto besser.
>> Frq. Resolution 0.4 Hz
Warum das ? Ist glaube ist der niedrigste Wert den man angeben kann.
>> Phase Inkrement fixed
Programmierbar wäre doch schöner. Laut Beschreibung A MSB = 0 für Phasen
Increment und A MSB = 1 für Phasen Offset. Und die niedrigsten vier Bit
für den Kanal. Wert über Data.
>Warum 1 Mhz ?
Die 1 MHz deswegen, weil du nicht mehr Werte erzeugen musst, als du
ausgeben kannst, ich spiele auf deinen D/A-Wandler an.
Die Frequenzauflösung bestimmt die Bitbreite des Phasenakkumulators.
Angenommen du hättest ein FTW von 0x66666, dann würde 0x66667 eine um
nicht mehr als 0,4 Hz höhere Frequenz erzeugen, also fein aufgelöst. Bei
10 kHz Auflösung kannst du die Frequenz nur sehr grob einstellen.
>Programmierbar wäre doch schöner.
Das wäre die nächste Baustelle auf der anderen Seite des DDS-Cores, dazu
brauchst du etwas, das dir die Frequenztuningworte generiert bzw.
ausrechnet (Mikrocontroller).
>Warum 1 Mhz ?
Die 1 MHz deswegen, weil du nicht mehr Werte erzeugen musst, als du
ausgeben kannst, ich spiele auf deinen D/A-Wandler an.
Ich denke der DA-Wandler kann, laut Datenblatt, 50 MHz verkraften.
Soweit verstanden bezieht sich das auf die einzelnen Bits des 24 Bit
bzw. 32 Bit Datenwortes an den DA-Wandler. Wie schnell jeweils die 24
Bits mit dem 12 Bit DA-Wert angelegt werden können, habe ich noch nicht
herausgefunden.
>Programmierbar wäre doch schöner.
Das wäre die nächste Baustelle auf der anderen Seite des DDS-Cores, dazu
brauchst du etwas, das dir die Frequenztuningworte generiert bzw.
ausrechnet (Mikrocontroller).
Also allein mit dem FPGA kann ich nur einen fixen Phasen Offset und ein
fixes Phasen Increment angeben ? Das lässt sich nicht mittels VHDL
verändern ? Das bedeutet ich bin an eine feste Ausgangsfrequenz
gebunden. Was muß dann da gerechnet werden ? Beispielsweise a*b/c ?
Die Frequenzauflösung bestimmt die Bitbreite des Phasenakkumulators.
Angenommen du hättest ein FTW von 0x66666, dann würde 0x66667 eine um
nicht mehr als 0,4 Hz höhere Frequenz erzeugen, also fein aufgelöst.
FTW ???
Bei 10 kHz Auflösung kannst du die Frequenz nur sehr grob einstellen.
Die Frequenz ergibt sich doch aus dem Phasen Increment. Wie du zuvor
erklärt hast lässt das Phasen Increment nicht verändern, also wie kann
ich diese dann einstellen ? Ich verstehe das als Widerspruch oder was
ist hier mit "einstellen" gemeint ?
Und zu guter letzt. Wie verwende ich jetzt die vom Core Generator
erzeugte Sinuscore.vhd Datei für die Synthese ? Simulieren funktioniert.
VHDL Text in eine eigene Datei kopieren oder irgendwie anders einbinden
? Der Wrapper wird unter Implementation nicht angezeigt. Beim Versuch
die Datei zum Projekt hinzuzufügen erhalte ich die Fehlermeldung das
diese schon im Projekt enthalten ist. Da die Datei nicht aufgeführt
wird, kann ich doch auch nicht die Synthese durchführen.
Schon mal im voraus: Vielen Dank für Deine Hilfe
Hans-Werner, der Grundgedanke meines Vorschlags war, den DDS-Core und
den D/A-Wandler erstmal in einfachster Konfiguration und mit wenigen,
überschaubaren Problemen (mit einer festen Frequenz) zum laufen zu
bringen. Das Verständnis für die Funktion und wie man das dann
erweitert, kommt dann fast von selbst.
>Wie schnell jeweils die 24 Bits mit dem 12 Bit DA-Wert angelegt>werden können, habe ich noch nicht herausgefunden.
Das ist der springende Punkt: 50 MHz / 24 ist rund 2 MHz.
>Also allein mit dem FPGA kann ich nur einen fixen Phasen Offset und ein>fixes Phasen Increment angeben ? Das lässt sich nicht mittels VHDL>verändern ? Das bedeutet ich bin an eine feste Ausgangsfrequenz>gebunden. Was muß dann da gerechnet werden ? Beispielsweise a*b/c ?
Da musst du nochmal lesen, wie DDS geht, aber s.o.
>FTW ???
FTW heisst Frequency Tuning Word, ich glaube nur ein anderer Ausdruck
für das Phasen-Inkrement.
>Die Frequenz ergibt sich doch aus dem Phasen Increment. Wie du zuvor>erklärt hast lässt das Phasen Increment nicht verändern, also wie kann>ich diese dann einstellen ? Ich verstehe das als Widerspruch oder was>ist hier mit "einstellen" gemeint ?
Einstellen vorerst mit dem Core-Generator durch Angabe der festen
Frequenz.
>Und zu guter letzt. Wie verwende ich jetzt die vom Core Generator>erzeugte Sinuscore.vhd Datei für die Synthese ?
Gar nicht. Nimm die XCO-Datei.
Rechte Maustaste in dein Projekt, "Add Source" und die vom
Core-Generator erzeugte XCO-Datei wählen.
Deine oberste VHD-Datei sollte folgendes in ähnlicher Form enthalten,
schau dir dazu auch die VHO-Datei an:
1
componentdds_test1
2
port(ce:INstd_logic;
3
clk:INstd_logic;
4
rdy:OUTstd_logic;
5
sine:OUTstd_logic_vector(11downto0));
6
endcomponent;
7
8
dds_block:dds_test1
9
portmap(
10
ce=>sample_clk,
11
clk=>system_clk,
12
rdy=>da_new_data_trig,
13
sine=>da_data);
Vorschlag für den nächsten Schritt: Erzeuge einen Takt von 1 MHz und gib
mit diesem Takt abwechselnd 000h und fffh an den Zustandsautomaten des
D/A-Wandlers aus. Erst wenn das klappt, ist die Einbindung des DDS-Cores
sinnvoll.
Als Ausgang bekommst du 12 Bit die zur State-Machine des D/A-Wandlers
als Daten hingehen. Das RDY benutzt du, um den Zustandsautomaten zu
triggern, damit ein neuer Ausgabezyklus beginnt, es ist auch immer nur
für eine Systemtaktperiode aktiv. Wenn alles klappt, bekommst du dann
einen 100 kHz Sinus aus dem D/A-Wandler.
Ein etwas verschliffener Rechteck lässt sich erzeugen.
Also das RDY in die Sensitivitätsliste des Prozesses mit dem
Zustandsautomaten für die DA-Konvertierung ?
An CE legst du den Sampletakt (s.o.), der aber immer nur für
eine einzige Systemtaktperiode aktiv sein darf.
Also einen eigenen Prozess für den Sampletakt parallel zum
Zustandsautomaten der DA-Konvertierung ? Der Sampletakt kann also
unabhängig von dem Takt des Zustandsautomaten gewählt werden ?
Setze teiler vorerst auf 50 und generiere den DDS-Core für eine Frequenz
von nicht mehr als 100 kHz mit Sampletakt von 1 MHz. Nähere dich der
maximal möglichen Frequenz von unten und nicht von oben, das ist
übersichtlicher.
Das ready gehört m.E. nicht in die Sensitivitätsliste (getakteter
Prozess).
Experimentiere etwas mit dem Wert für teiler, der Wert 50 setzt voraus,
der Zustandsautomat für den D/A-Wandler in 50 Takten abgelaufen ist.