mikrocontroller.net

Forum: FPGA, VHDL & Co. FPGA <-> PIC24 über SPI


Autor: FPGA'ner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in meinem werden Spartan 3 und PIC24 über SPI kommuniziert.
Es klapp eigentlich ganz gut. Ich hätte trptzdem eine Frage.
Im FPGA habe ich SPI Slave so realisiert:
if rising_edge(SPI_SCK) then
...
einzelne bits empfangen
...

Habe auch ausprobiert SPI mit CLK zu synchroniseiren:
if rising_edge(SCK50MHZ) then
...
SPI_SCK flanke erkennen und einzelne bits empfangen
...

Beide Methoden funktionieren gut.
Welche Methode ist schöner bzw. richtiger?

MfG

Autor: user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beim ersten fall hast du 2 clock domains -> musst du synchronisieren 
beim ubergang von der einen in die andere domain

beim 2ten fall, hast du nur eine clock domain

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

Bewertung
0 lesenswert
nicht lesenswert
FPGA'ner schrieb im Beitrag #1855688:
> Welche Methode ist schöner bzw. richtiger?
Das schenkt sich nicht so sehr viel.
Ich würde die erste Version mit dem lokalen SPI-Takt nehmen, und dann 
das eingetaktete Byte über den einsynchronisierten Slave-Select 
validieren und in das FPGA übernehmen.
Ausgehend z.B. vom SPI-Slave 
http://www.lothar-miller.de/s9y/categories/26-SPI-Slave
Dazu eine Flankenerkennung auf die steigende Flanke des SS zur 
synchronen Übernahme der dann stabilen Daten auf den SCK50MHZ.

Bei der Variante 2 muss dein SPI-Takt deutlich niedriger sein als die 
SCK50MHZ. Und durch die Einsynchronisierung des SPI_SCK wirst du am MISO 
u.U. in zeitliche Bedrängung kommen... :-/

EDIT:
> beim 2ten fall, hast du nur eine clock domain
Oh, nein. Es sind immer 2 Taktdomänen: SPI_SCK und SCK50MHZ.
Es muss also immer irgendwie einsynchronisiert werden.
Nur ist es im 2. Fall ein wenig mehr versteckt...  :-o

Autor: Harald Flügel (hfl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar schrieb:

EDIT:
> beim 2ten fall, hast du nur eine clock domain
Oh, nein. Es sind immer 2 Taktdomänen: SPI_SCK und SCK50MHZ.

Tatsächlich? Hilf bitte mal einem alten Mann auf die Sprünge. In meiner 
Vorstellung ist das nur eine Taktdomäne. Es gibt doch gar kein Flopflop, 
das mit SPI_SCK getaktet wird!?

Aber ansonsten stimme ich voll zu: lokalen SPI_SCK verwenden zum 
Einsammeln der Bits und dann das Wort umsynchronisieren auf den 
Arbeitstakt. ... Halt, wenn ich's mir richtig überlegen, dann ist das 
nicht nur zu bevorzugen, sondern die einzig richtige Methode. Im anderen 
Fall (SPI_SCK flanke erkennen und einzelne bits empfangen) hat man ein 
ungünstiges Timing am MOSI. Der Abtastzeitpunkt des MOSI ist dann mehr 
oder weniger unbekannt!

Autor: FPGA'ner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> das eingetaktete Byte über den einsynchronisierten Slave-Select
> validieren und in das FPGA übernehmen.

einsynchronisierten Slave-Select?

ich habe es so gemacht:
if rising_edge(CLK50MHZ) then
...
steigende flanke von SPI_SS erkennen und Byte übernehmen
...

oder ist was anderes gemeint?

MfG

Autor: FPGA'ner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald Flügel schrieb:
> Im anderen
>
> Fall (SPI_SCK flanke erkennen und einzelne bits empfangen) hat man ein
>
> ungünstiges Timing am MOSI. Der Abtastzeitpunkt des MOSI ist dann mehr
>
> oder weniger unbekannt!

SPI Clock ist nur 8MHz. Deswegen hat es geklappt.

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

Bewertung
0 lesenswert
nicht lesenswert
Harald Flügel schrieb:
> Tatsächlich? Hilf bitte mal einem alten Mann auf die Sprünge.
Du hast deinen internen Takt im FPGA. Hier sind das SCK50MHZ.
Das ist die Taktdomäne Nummer 1.

Und es gibt den SPI_SCK, der auf jeden Fall asynchron ist.
Das ist die Taktdomäne 2.

Und irgendwie müssen die beiden zueinander synchronisiert werden.

Schon ein x-beliebiger Taster hat für mich eine eigene Taktdomäne, die 
nur zu sich selber (bzw. zum Tastenbetätiger) synchron ist. Denn keiner 
kann verlangen, dass ich den Taster garantiert synchron zum FPGA-Takt 
drücke... ;-)

EDIT:
FPGA'ner schrieb im Beitrag #1855813:
> ich habe es so gemacht: ...
Richtig, so wars gemeint. Aber eben mit einem einsynchronisierten SS: 
erst 2 FFs und dann das 3. zur Flankenerkennung...

Autor: FPGA'ner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Eure Tipps!

Autor: FPGA'ner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> erst 2 FFs und dann das 3. zur Flankenerkennung...

:) ich verstehe nicht was gemeint ist

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

Bewertung
0 lesenswert
nicht lesenswert
FPGA'ner schrieb im Beitrag #1855834:
> :) ich verstehe nicht was gemeint ist
Sieh dir das mal an:
http://www.lothar-miller.de/s9y/categories/18-Flan...
Die ersten beiden FF sind das Allheilmittel gegen Metastabilität, das 
dritte FF dient der Flankenerkennung.

Autor: Harald Flügel (hfl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar schrieb:

Schon ein x-beliebiger Taster hat für mich eine eigene Taktdomäne, die
nur zu sich selber (bzw. zum Tastenbetätiger) synchron ist.

Harald meint: Eine interessante Sichtweise, der ich mich leider nicht 
anschließen kann. Eine Taktdomäne ist gemeinhin die Gesamtheit aller 
Flipflops, die mit dem gleichen Taktsignal getaktet werden. Kein 
Flipflop, keine Domäne. Natürlich ist jedes externe Signal asynchron und 
muss vor der Verarbeitung im FPGA einsynchronisiert werden, aber 
deswegen von einer Taktdomäne zu sprechen, halte ich für etwas verwegen. 
Aber ok, bei der Betrachtung, wie man den SPI-Takt handhabt, sind wir ja 
einer Meinung.

Autor: FPGA'ner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Die ersten beiden FF
variable sr : std_logic_vector (3 downto 0) := "0000";
werden dafür nicht 4 FFs benötigt?

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

Bewertung
0 lesenswert
nicht lesenswert
Harald Flügel schrieb:
> Eine interessante Sichtweise, der ich mich leider nicht
> anschließen kann.
Zur Kenntnis genommen... ;-)

> Eine Taktdomäne ist gemeinhin die Gesamtheit aller Flipflops,
> die mit dem gleichen Taktsignal getaktet werden.
> Kein Flipflop, keine Domäne.
Der SPI-Takt kommt von einem uC, der in sich eine Herde von FFs birgt. 
Diese FF schalten alle mit dem uC-Takt, mithin also auch der SPI_CLK. 
Ist das jetzt eine 2. Taktdomäne?
Oder müssen sich diese FFs unbedingt im selben Baustein befinden?
Wie wäre es dann bei einem FPGA-Design, das in einem FPGA 2 Takte hat? 
Und jetzt aus Platzgründen in 2 getrennte FPGAs aufgeteilt wird?

Es gibt bei der Definition einer Taktdomäne offenbar eine Grauzone, und 
ich bin mit meiner extremen Ansicht bisher recht gut gefahren... ;-)

EDIT:
> werden dafür nicht 4 FFs benötigt?
Das ja, es sind aber in der brutalen Realitiät nur 3 wirklich nötig...

Autor: Harald Flügel (hfl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar schrieb:

Der SPI-Takt kommt von einem uC, der in sich eine Herde von FFs birgt.
Diese FF schalten alle mit dem uC-Takt, mithin also auch der SPI_CLK.
Ist das jetzt eine 2. Taktdomäne?

Ja, ist es. Dieser Argumentation schließe ich mich gerne an. Auf 
Systemebene ist die Sichtweise sicher korrekt. Nur den einzelnen Taster, 
den fand ich, mit Verlaub, etwas weit hergeholt.

Ich bin in Sachen Taktdomänen im übrigen auch gnadenlos kompromislos. 
Ich lasse mich auch nicht darauf ein, manchmal nur ein Flipflop zur 
Synchronisierung zu verwenden, nur weil die Frequenz niedrig ist. Wer 
weiß, am Ende kopiert jemand einen Schaltungsteil in eine schnelle Logik 
hinein, und schon ist's passiert.

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.