SPI Takt aus FSM

Gast #1330348
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
Gast #1330400
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?
Gast #1330408
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?
Gast #1330415
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.
Gast #1330417
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.
Moderator (Firma: Titel) Persönliche Seite #1330912
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.
#1331211
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren