Hallo! Eine kurze Frage: Ich habe zur Ansteuerung eines DACs auf einem FPGA Board das mit 25MHz läuft eine SPI FSM geschrieben, die auch gut funktioniert. Jetzt muss ich aber mit dem SPI Takt hoch auf ebenfalls 25MHz. Meine FSM erzeugt den SPI Takt aber aus dem Prozess heraus - und teilt damit den eingehenden Takt durch 2. Um die Sache zur Funktion zu bringen habe ich einfach einen DCM eingesetzt, der den FPGA Takt verdoppelt und den an die FSM gelegt. Die Frage ist - "macht man das so?" Mir ist bis jetzt kein Weg eingefallen, eine FSM so zu schreiben, dass sie den SPI Takt direkt aus den FPGA Takt erzeugt. Oder geht das vielleicht doch? Viele Grüße und ein schönes Wochenende! Matthias
Ok... muss sich dämlich anhören aber, ja, wenn ich drüber nachdenke und die FSM umstricke vereinfacht sie sich sogar. Ein ähnliches Problem hab ich aber noch bei einer AD Wandler Ansteuerung, auch SPI. Die erzeugt auch den Takt indem sie den FPGA Takt durch 2 teilt, allerdings damit bei der fallenden Flanke des SPI Takts der SDA vom ADC ausgelesen werden kann. Ein Prozess darf nicht auf die positive und negative Flanke reagieren, oder?
oehm, also wenn du einen ADC betreibst, dann bist du ja wohl SPI Master. Und damit 'machst' du die SCK. Wenn du also ein FPGA hast, das intern wohl deutlich schneller als SCK laeuft, wo ist dann dein Problem? Mit positiven und negativen Flanken musst du dich doch dann gar nicht rumschlagen. Oder liege ich da komplett falsch?
nochmal oehm, sehe gerade, du verwendest einen DCM um eine SPI clock zu generieren? Noe, das macht man nun wirklich nicht so! Du nimmst deine FPGA clock, teilst die mit einem counter (n ... 0), bei 0 toggelst du die SCK und laedst den counter neu. Vorteil: Du bist synchron zu deinem FPGA Takt und kannst Register lesen und schreiben wie du willst, du wirst nie ein clock-Problem bekommen.
@berndl So viel schneller als der ADC läuft der FPGA ja nicht. Der Wandler bekommt mit etwa 1MHz seinen CS (CONV). Das Datenwort vom Wandler ist 18 Bit lang. Deswegen muss der Takt des Wandlers 25MHz schnell sein. Mit der steigenden Flanke schiebt der ADC das nächste Bit an den Ausgang, mit der fallenden Flanke wird eingelesen. Im moment macht die FSM das, indem ein Prozess aus dem verdoppelten FPGA Takt gestartet wird. Die Frage ist, ob das auch mit dem "einfachen" geht.
> Deswegen muss der Takt des Wandlers 25MHz schnell sein. Was ist denn dein eigentlicher FPGA-Takt? > 1MHz seinen CS (CONV). Das Datenwort vom Wandler ist 18 > Bit lang. Deswegen muss der Takt des Wandlers 25MHz schnell sein. Ich komme da auf weniger... wofür sind die überzähligen 7 MHz?
@Lothar Miller Der FPGA Takt selbst ist 25MHz. Daher kommen die überzähligen 7MHz, ich wüsste nicht wie ich 25 MHz auf 18MHz teile könnte. Wenn ich ihn durch 2 teilen würde, wär's zu langsam.
> Der FPGA Takt selbst ist 25MHz. Ja, dann ist die Taktverdopplung mit einem DCM die sinnvollste Möglichkeit. > Mir ist bis jetzt kein Weg eingefallen, eine FSM so zu schreiben, > dass sie den SPI Takt direkt aus den FPGA Takt erzeugt. Oder geht das > vielleicht doch? Da gibt es noch den einen bösen Trick, den Takt nebenher über einen Multiplexer auszugeben, und in der SM nur ein "Clock-Gate" zu erzeugen. So etwa:
1 | signal gated_clock : STD_LOGIC; |
2 | |
3 | :
|
4 | case SPI_State |
5 | when shift => gated_clock <= '1'; |
6 | :
|
7 | end process; |
8 | |
9 | spiclk <= gated_clock and clk25; |
Aber sowas macht man nur in allerhöchster Verzweiflung. > Der FPGA Takt selbst ist 25MHz. > ...ich wüsste nicht wie ich 25 MHz auf 18MHz teile könnte. Einen DCM kannst du so einstellen (Betriebsart DFS), dass er mit 18 mutlipliziert und durch 25 teilt. Dann hast du 18 MHz. Aber auch ich würde in deinem Fall einfach den Takt verdoppeln.
Wenn es nur um den SPI-Takt geht, würde ich hier keine PLL verwenden sondern einfach ein DDR-FF am Ausgang benutzen. Dessen Dateneingang kann man mit einem statischen "01" füttern, dann ist automatisch die fallende Flanke des SPI-Taktes synchron zu Daten, die aus einem FF mit dem normalen 25 MHz Takt kommen.
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.