Forum: FPGA, VHDL & Co. SPI Takt aus FSM


von Matthias (Gast)


Lesenswert?

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

von mac4ever (Gast)


Lesenswert?

Eingangstakt einfach auf den SPI-Taktausgang routen?

von Matthias (Gast)


Lesenswert?

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?

von berndl (Gast)


Lesenswert?

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?

von berndl (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

Vielen Dank! :o)

Wünsche noch einen schönen Sonntag,

Matthias

von Jan M. (mueschel)


Lesenswert?

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