Forum: FPGA, VHDL & Co. SPI: Synchron oder abtasten


von Matthias (Gast)


Lesenswert?

Hallo zusammen,

in einem neuen FPGA-Design habe ich einen SPI-Slave zu realisieren. Der 
SPI-Takt liegt bei moderaten 5 MHz. Nun bin ich am überlegen, ob ich die 
SPI aus SPI-Bus-Sicht synchron umsetze oder aber SCK, MOSI und CS mit 
dem FPGA-Takt einsynchronisiere und abtaste.

Ein einfaches Schieberegister mit SCK getaktet ist sehr schnell. Daten 
sind schon synchron zum Takt, daher ist kein eintakten nötig und es 
kommt zu keiner weiteren Verzögerung an dieser Stelle. :-)
Hat aber zur Folge, dass ich mehrere Clockdomains benötige. :-(

Einsynchronisieren und Abtasten führt zu Verzögerungen. :-(
Dafür habe ich aber nur eine Clockdomain. :-)

Noch als kleine Zusatzinformation: Der FPGA ließt nicht nur Daten ein, 
sondern muss auch welche ausgeben. Der Datentransfer ist so aufgebaut, 
dass der angeschlossene Controller 4 Byte lange Frames schickt. Die 
ersten 16 Bit enthalten eine Adresse und die letzten 16 Bit sind die 
Daten die gelesen und/oder geschrieben werden. Daher muss der FPGA 
unmittelbar auf die Daten liefern die zuvor durch die adressiert worden 
sind. Die Daten (ca. 100 Byte) können aber nicht in einem Speicher 
liegen, da sie im FPGA alle gleichzeitig benötigt werden. Sonst wäre ein 
DPR die ideale Anbindung und Clockdomain-Trennung.

Wie würdet Ihr vorgehen? Vor- und Nachteile?
Danke

von Duke Scarring (Gast)


Lesenswert?

Wie schnell läuft denn der Rest in Deinem FPGA?
Wenn es sich vermeiden läßt, würde ich bei so wenig Taktdomänen wie 
möglich bleiben. Unter [1] findest Du auch eine schicke Implementierung.

Duke

[1] http://www.lothar-miller.de/s9y/categories/45-SPI-Master

von Matthias (Gast)


Lesenswert?

Duke Scarring schrieb:
> Wie schnell läuft denn der Rest in Deinem FPGA?

Da bin ich noch flexibel. An sich würden 15 bis 20 MHz reichen. Ich habe 
aber auch keine Probleme 40 oder 50 MHz zu verwenden. Je langsamer, 
desto entspannter wird das restliche Timing. Bis ca. 50 MHz wird es nach 
meiner Erfahrung keine Probleme geben.

Danke für den Implementierungshinweis. Ich benötige aber ein SPI Slave.

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


Lesenswert?

Matthias schrieb:
> Ich benötige aber ein SPI Slave.
Der ist noch einfacher:
Nimm einfach den SPI-CLK zum Weitertakten des Schieberegisters und den 
einsynchronisierten Slave-Select zur Datenübernahme aus dem 
SPI-Schieberegister ins FPGA.

von Sim (Gast)


Lesenswert?

Bei Lattice findest du ein kostenloses Refferenz Design eines SPI 
Slaves.

http://www.latticesemi.com/products/intellectualproperty/aboutreferencedesigns.cfm

Setzte ich auch ein und funktioniert. Der Code leigt in vhdl vor. Dieser 
Slave arbeitet schon mit 2 Takten. Also dem SCLK und einem internen Takt 
der restlichen Logik der schneller seien kann.

Gruß Sim

von berndl (Gast)


Lesenswert?

Matthias schrieb:
> Noch als kleine Zusatzinformation: Der FPGA ließt nicht nur Daten ein,
> sondern muss auch welche ausgeben. Der Datentransfer ist so aufgebaut,
> dass der angeschlossene Controller 4 Byte lange Frames schickt. Die
> ersten 16 Bit enthalten eine Adresse und die letzten 16 Bit sind die
> Daten die gelesen und/oder geschrieben werden. Daher muss der FPGA
> unmittelbar auf die Daten liefern die zuvor durch die adressiert worden
> sind.
moin,
aus genau diesem Grund wuerde ich nur mit dem FPGA-Takt arbeiten und den 
aus Latenzgruenden hoch genug waehlen (>=50MHz). Wuerdest du den SCK als 
clock nehmen haettest du einen unschoenen Counter fuer die ersten 16bit, 
der muesste mit 2 clock-domains klarkommen.

Einlesen mit FPGA-clock ist eh unkritisch, nur bei MISO/SOMI musst du 
schnell genug sein. Falls das Probleme macht, kannst du ja 'mit der 
falschen Flanke', d.h. frueher, die Daten rausgeben.

Ich mach' das seit Jahren so, mit 100MHz FPGA clock, 5MHz SPI, 2-1/2 
Meter SPI-Kabellaenge ueber externe LVDS-Umsetzer. Funzt zuverlaessig.

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


Lesenswert?

berndl schrieb:
> Daher muss der FPGA unmittelbar auf die Daten liefern die zuvor
> durch die adressiert worden sind.
Das ist im Grunde ein recht unschönes Konzept.
Weil bei SPI der Slave den Master nicht (wie z.B. beim I2C) kurz mal 
anhalten kann, hast du natürlich je nach Taktfrequenz bei Lesezugriffen 
nur kurze Turnaround-Zeiten.
Einfacher und üblicher ist in diesem Fall (z.B. bei AD-Wandlern) die 
Daten des im vorherigen SPI-Zyklus adressierten Kanals zurückzugeben.

von Matthias (Gast)


Lesenswert?

Lothar Miller schrieb:
> Einfacher und üblicher ist in diesem Fall (z.B. bei AD-Wandlern) die
> Daten des im vorherigen SPI-Zyklus adressierten Kanals zurückzugeben.

Das ist aber aus Sicht der Software nicht so schön. Die kurzen 
Turnaround-Zeiten sind schon ein Problem. Wir haben uns dahingehend 
verständigt, dass wir "nur" 12-Bit Adressen verwenden. Dadurch hat der 
FPGA 4 SPI-Takte Zeit um die Daten bereit zu stellen. Die Schnittstelle 
werde ich aber so programmieren, dass natürlich beides möglich ist.

Ich habe mir SPI-Slave Lösung von Lattice mal näher angeschaut und 
beschlossen mich an dieser zu orientieren. Einiges ist dort ganz gut 
gelöst. Anderes wiederum gefällt mir nicht.

Ich werden nun doch nicht mit dem FPGA-Takt arbeiten. Dadurch wird die 
SPI deutlich schneller. Vor allem die Laufzeiten zum MISO bleiben 
dadurch gering. Ein weiterer Vorteil ist in meinem Fall, dass ich dann 
mit niedrigerem FPGA-Takt arbeiten kann. Ich bin ausnahmsweise mal in 
der glücklichen Lage, dass schon 15 bis 20 MHz im Design ausreichen 
werden.

Vielen Dank für Eure Meinungen und Antworten.
Matthias

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.