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
ifrising_edge(SPI_SCK)then
2
...
3
einzelnebitsempfangen
4
...
Habe auch ausprobiert SPI mit CLK zu synchroniseiren:
1
ifrising_edge(SCK50MHZ)then
2
...
3
SPI_SCKflankeerkennenundeinzelnebitsempfangen
4
...
Beide Methoden funktionieren gut.
Welche Methode ist schöner bzw. richtiger?
MfG
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
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
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!
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:
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.
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...
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.
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.
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...
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.