www.mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mac4ever (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eingangstakt einfach auf den SPI-Taktausgang routen?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
signal  gated_clock  : STD_LOGIC;

   :
      case SPI_State
         when shift => gated_clock <= '1';
   :
   end process;

   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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank! :o)

Wünsche noch einen schönen Sonntag,

Matthias

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.