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


von FPGA'ner (Gast)


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:
1
if rising_edge(SPI_SCK) then
2
...
3
einzelne bits empfangen
4
...

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

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

MfG

von user (Gast)


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

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


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

von Harald F. (hfl)


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!

von FPGA'ner (Gast)


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:
1
if rising_edge(CLK50MHZ) then
2
...
3
steigende flanke von SPI_SS erkennen und Byte übernehmen
4
...

oder ist was anderes gemeint?

MfG

von FPGA'ner (Gast)


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.

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


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

von FPGA'ner (Gast)


Lesenswert?

Vielen Dank für Eure Tipps!

von FPGA'ner (Gast)


Lesenswert?

Lothar Miller schrieb:
> erst 2 FFs und dann das 3. zur Flankenerkennung...

:) ich verstehe nicht was gemeint ist

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


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-Flankenerkennung
Die ersten beiden FF sind das Allheilmittel gegen Metastabilität, das 
dritte FF dient der Flankenerkennung.

von Harald F. (hfl)


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.

von FPGA'ner (Gast)


Lesenswert?

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

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


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

von Harald F. (hfl)


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.

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.