FPGA <-> PIC24 über SPI

Gast #1855688
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
Moderator (Firma: Titel) Persönliche Seite #1855737
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
#1855794
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!
Moderator (Firma: Titel) Persönliche Seite #1855820
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...
#1855852
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.
Moderator (Firma: Titel) Persönliche Seite #1855869
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...
#1856060
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

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