Hallo,
Ich bin blutiger Anfänger was das programmieren mit vhdl und Verwendung
von FPGAs angeblangt und habe ein Problem bei dem ihr mir hoffentlich
helfen könnt.
Ich möchte mit dem DAC des Spartan 3e (LTC2624 DAC) ein konstantes
Signal ausgeben. Leider funktioniert das Ganze absolut nicht. Die
verwendete .vhdl und .ucf habe ich angehängt.
Habt ihr vielleicht eine einfaches Beispiel wie die Ausgabe an den DACs
funktioniert. Im Internet finde ich nur Programme bei denen noch viel
Zeug
drumherum gemacht wird. Da schaue ich irgendwie nicht durch.
Es wäre nett, wenn ihr mir helfen könntet.
Grüße
Tobi
Tobi schrieb:
> Leider funktioniert das Ganze absolut nicht.
Funktioniert die Simulation?
Welche Taktfrequenz clk hast du?
Kann der DAC-SPI überhaupt so schnell?
BTW:
Das mit dem Taster sehe ich kritisch.
1
ifrising_edge(clk)then
2
ifbtn='1'then
3
dacstate<=start;
4
else
5
casedacstateis
6
whenstart=>
7
dacstate<=sendbit;
8
:
9
whensendbit=>
10
SClk<='0';
11
:
Wenn der prellt, dann startest du bei aktiviertem CS blitzschnell z.B.
10 mal hintereinander eine Übertragung...
Wozu eigentlich ein Taster?
Du startest doch sowieso sofort nach dem Ende der Übertragung wieder von
vorn:
Hallo,
Ich habe den Taster mal entfernt.
Die Taktfrequenz vom Clock sind 50 MHz. Bin nicht sicher wie schnell der
DAC-SPI sein kann.
Bei der Simualtion passiert rein gar nichts. Also alle Signale bleiben
während der gesamten Simulation gleich. Ich weiß aber auch nicht wie man
ein
Testbench richtig anlegt. Habe sowas wie gesagt noch nie gemacht.
Tobi schrieb:
> Der sollte die 50 Mhz eigentlich schaffen.
Grenzwertig mit thi und tlo = min. 9ns.
Aber du hast bei 50MHz-FPGA-Takt sowieso jeweils 20ns.
> Bei der Simualtion passiert rein gar nichts.
Da würde ich mal ansetzen...
> Ich weiß aber auch nicht wie man ein> Testbench richtig anlegt. Habe sowas wie gesagt noch nie gemacht.
Du kannst bei Xilinx ISE mit Add New Source --> VHDL Testbench einfach
eine Testbench erzeugen. Dort müsstest du dann nur noch einen Takt
erzeugen, der Rest läuft (ohne den Start-Knopf) von alleine.
Hallo,
Ich verstehe eben nicht warum in der Simulation nichts passiert.
Ich hatte zeitweise in jedem "state" meines Programms auch eine LED,
welche
aufleuchten sollte, wenn das Programm an ihr vorbeikommt.
Und das haben alle Leds auch brav getan.
Wie baue ich denn die Clock richtig in mein Testbench ein?
(Sorry, wenn das hier wirklich ganz einfache Probleme sind, aber ich
wurde
von meinem Chef in der Uni wirklich ohne jede Vorkenntnis in
Programmieren oder Elektronik an diese Board gesetzt)
Grüße und Danke
Tobi
@supachris
Danke für den Code. Hast du noch deine User Constraints File.
Ich habe teils Probleme in der entity-liste zuzuordnen, was was auf
dem FPGA Board ist.
hallo,
ich steuere an grad auch den dac. Ich hab auch idee im forum gefunden
und bisschen verändern. Hier ist der code für 4-kanale nacheinander
gesteuert.
Es funktioniert super in Simulation, aber in hardware, starter kit
spartan 3a, scheint problem meiner meinung nach beim "rst"-signal.
clk = 80Mh aus DCM-clkfx, dann meine meinung nach ist SPI-CLK(also
SPI-SCK) = 80/2 = 40Mhz, also kleiner als maximal 50Mhz. Die 4
Data-Eingänge sind jede 10Khz aktualisiert.
Problem ist: Manchmal muss ich mehrmals den rst-Taster drücken, damit
die signals auf dem oszi sauber scheinen, sonst viel rausch. Wenn nur
ein Kanal umgesetzt wird, beeinflusst der rst-taster weniger, abwohl ich
NUR noch 1,2-mals den rst-taster drücken muss:D :-(
PS. Ich hab noch nicht Timing constraint ins projeckt reingebaut, weiss
nicht, ob das auch problem sein kann.
kann jemand vorschlag geben?
GastausHannover schrieb:
> beeinflusst der rst-taster weniger, abwohl ich> NUR noch 1,2-mals den rst-taster drücken muss:D :-(
Ein Dauerbrenner und immer der selbe :-/
Der Reset ist ein asynchrones Signal und muss einsynchronisiert
werden.
Guten Abend,
Ok habe jetzt raus wie ich ein Testbench schreiben kann.
Melde mich im Laufe der nächsten Woche evtl. nochmal, wenn ich
das Problem eingegrenzt habe.
Lothar Miller schrieb:
> Ein Dauerbrenner und immer der selbe :-/> Der Reset ist ein asynchrones Signal und muss einsynchronisiert> werden. if rst = '0' then -- Asynchrone Resets sind schlecht.> SPI_MOSI <= '0';> SPI_CS <= '1';> SPI_SCK <= '0';> dacState <= idle;> elsif rising_edge(clk) then> ...> Das ist klar, dass der dir die ganze State-Machine zerhagelt.> Als Hintergrund:> http://www.lothar-miller.de/s9y/categories/35-Eins...> Das Signal inp dort im Beispiel, ist in diesem Fall hier dein Reset,> der unterschiedliche Laufzeiten hat...
hallo Lothar, vielen dank:-)
deine seite ist echt cool:-) great job^^
ich hab grad ausprobiert nach deiner rezept und mit der
einsynchronisierung des rst-signals geht wie erwartet^^. Wobei ich hab
den rst vom DAC-Ansteuerung weggenommen, also der DAC läuft immer mit
80Mhz takt und den rst-signal von signalgenerator-block
einsynchonisiert.
Guten Abend,
ich habe bei den Xilinx Spartan 3A und E Boards von Xilinx / Digilent
die Erfahrung machen müssen, dass auf den Steurleitungen, die unter
anderem den VGA (Variable Gain Amplifier) per SPI konfigurieren direkt
beim Einschalten nach Start des FPGAs noch igendwelche Daten
herumgeistern. (Ich glaube vom Platform Flash)
Wenn dann eine FSM diesen Verstärker per SPI konfigurieren soll, kommt
das Steuerwort nicht korrekt an, da das FPGA schon läuft. Ich habe dann
einfach ein paar Wartezyklen eingebaut...
Ist das Problem bekannt / was tut man da "professionell" gegen.
mfg Maik
Hallo,
Ich habe jetzt einen Testbench geschrieben und das ganze simuliert. Ich
kann
aber auch dort keinen Fehler sehen. Bitte also nochmal um Hilfe.
Grüße
Tobi
Hej,
Ich habe grade meinen Fehler gefunden.
Das Xilinx-Handbuch verschweigt, dass ich auf einen Pin des DAC noch
ein Signal geben muss, damit der DAC-Output nicht sofort wieder auf 0
gesetzt wird.
Danke für eure Zeit
Tobi
Hallo!
Ich habe mal eine kurze Frage zu dem von Christian vorgestellten
DAC-Code, der ODDR2 nutzt:
Christian R. schrieb:> Für den DAC auf dem Spartan 3e Board hatte ich mal einen schnellen Test> zusammen geklöppelt damals:> ...> SR24 : Process(CLK)> Begin> if rising_edge(CLK)then> if Load = '1' then ShiftReg <= DAC_Value;> elsif ShiftEn = '1' then ShiftReg <= ShiftReg(22 downto 0) & '1';> end if;> end if;> End Process;> ...> SPI_ClockOut : ODDR2 Port map(Q => DAC_SCK, C0 => CLK, C1 => nCLK,> CE => '1', D0 => '0', D1 => '1', R => '0', S => '0');
Wenn ich das richtig verstehe, werden die Daten vom FPGA als SPI-Master
auf rising_edge(clk) gecaptured. Dann müsste doch der ODDR2 Ausgang
genau den Verlauf des CLK nachbilden. Warum ist dann das ODDR2 so
konfiguriert, dass D0 auf '0' und D1 auf '1' gesetzt sind. Wird dadurch
nicht der generierte SPI-Clock für den DAC verschoben? Müssten die Werte
für D0 und D1 nicht vertauscht werden?
Grüße,
Anguel