Forum: FPGA, VHDL & Co. 6fach SPI-Slave in CPLD oder FPGA?


von Dirk S. (Gast)


Lesenswert?

Hallo,

ich habe die letzten Jahre nichts mehr mit programmierbarer Logic zu tun 
gehabt. Nun habe ich eine sinnvolle Aufgabe für so etwas, habe aber 
keinen Überblick über die heutigen Möglichkeiten.

Meine Anforderungen in Stichpunkten:
1. 16Bit Datenbus, einige Adress- und Steuerleitungen zu einem µC (@ 
3,3V)
2. 6 unabhängige SPI-Slaves mit Datenrate um 8 .. 16MHz (SPI-Master @ 
5V)
3. SPI-Frame besteht aus 32Bits
4. niedrige Verlusstleistung (Abwärme)
5. Möglichst kein BGA
6. Preisgünstig und beschaffbar

Welche Möglichkeiten habe ich da?
Geht das mehr in Richtung FPGA oder ist das noch mit CPLDs zu machen?
Welche Hersteller empfeht ihr mir?
Komme ich um separate Pegelumsetzer herum?

Schon mal Danke,
Dirk

von Christian R. (supachris)


Lesenswert?

Sollte locker in einem CPLD machbar sein, allerdings sind das schon paar 
Makrozellen dann. Ein 95er von XILINX mit 256 Makrozellen reicht sicher 
aus. Musst ma durchrechnen. 6 x 32 plus nochma welche zum Takt-Teilen. 
Die 95er Reihe hat meines Wissens 5V-tolerante I/Os.

von Dirk S. (Gast)


Lesenswert?

Waren in einer Macrozelle 2 FF?
Wenn ich das vom Timing so gestalte, dass während dem lesen und 
schreiben der Shiftregister keine SPI-Übertragung stattfindet komme ich 
wahrscheinlich um eine Pufferung der Shiftregister herrum. Wie vielen 
Macrozellen braucht so ein Design? Wie viel braucht die Busankopplung?

von Valerij M. (fpga-dev)


Lesenswert?

Also gehen wir davon aus, daß ein SPI Frame komplett gespeichert werden 
muss. Das sind dann 6*32=192 Bits. Da vermutlich die Daten nicht sofort 
abgeholt werden, müssen die erstmal zwischengespeichert werden. Also im 
ungünstigen Fall nochmal 192 Bits. Und das ganze sowohl in der Empfangs- 
und Senderichtung. Das sprengt jeden CPLD.

Nimm einfach einen kleinen Spartan 2E, der sollte bei effizienter 
Nutzung der Ressourcen (guter Programmierstil vorausgesetzt) reichen.

Gruß,
fpga-dev

von Schlumpf (Gast)


Lesenswert?

Denke auch, dass das NICHT in ein CPLD passt, da du, wie Valerij sagte, 
deine SPI-Daten ja noch zwischenspeichern musst.
die Lattice XP-FPGAs sind auch in recht kleinen Großen erhältlich. 
Ausserdem sparst du dir bei denen das Boot-Device.
Den LFXP3 gibt es sogar im TQFP-100 Package.

http://www.latticesemi.com/products/fpga/xp/index.cfm?source=topnav&jsessionid=ba30e47d3dbcW$9D$23$

von Dirk S. (Gast)


Lesenswert?

Danke für die Antworten.
Ich denke ich kommen ohne Zwischenspeicherung der Daten aus.
Folgenden Ablauf habe ich mir vorgestellt.

1. µC schreibt die zu sendenden Daten in die 6 Shiftregister.
2. µC gibt die Takteingänge der Shiftregister frei.
3. µC triggert die SPI-Master, die darauf hin den Sendetakt liefern und 
die Sendedaten (Daten zum CPLD) raustakten und die Empfangsdaten (Daten 
vom CPLD) eintakten.
4. Nach Ablauf der Übertragung (32 Schiebetakte) werden die Takteingänge 
im CPLD wieder verriegelt.
5. µC wird benachrichtigt und liest in aller Ruhe die Empfangsdaten aus 
den Shiftregistern aus.
6. zurück zu 1.

Das Shiftregister ist dabei als Ringregister ausgeführt und enthält nach 
dem austakten der Sendedaten die eingetakteten Empfangsdaten.
Mache ich bei meinem gedachten Ablauf einen Denkfehler?
Geht das in ein CPLD?

@Schlumpf
Die Lattice XP-FPGAs werde ich mir mal genauer anschauen.
Wo liegen die etwa im Preis?

Gruß,
Dirk

von Klaus F. (kfalser)


Lesenswert?

Ein CPLD hat für das SPI Schieben vom Prinzip keine Probleme, ich würde 
Dir aber empfehlen zuerst das Programm in VHDL zu schreiben und zu 
testen, bevor Du den Baustein wählst.

Der Teufel steckt wohl eher im Detail, z.B. im Interface uC und FPGA.
Wenn die Busbreite z.B. 8 Bit ist, dann siehst Du vom uC aus mindesten 6 
x 4 = 24 verschiedene 8 Bit Register welche Du schreiben und Lesen mußt.
Schreiben ist vielleicht weniger das Problem, aber das Lesen erfordert 
mindesten einen 24-fach Multiplexer. Damit könnte ein CPLD 
möglicherweise überfordert sein.

Das andere ist die Benachrichtigung des uC, über z.B. Interrupt. Wenn 
die 6 SPI-Master z.B. unterschiedlich schnell schieben, also 1 Kanal 
fertig ist und der andere noch nicht, dann muß dies verwaltet werden und 
dies könnte komplizierter sein als es im ersten Moment scheint.

Klaus

von Dirk S. (Gast)


Lesenswert?

Ich habe mir jetzt mal folgende zwei CPLDs ausgesucht:

EPM570T100C5N von Altera
XC95288XL-10TQG144C von Xilinx

die liegen mit ca. 11 Euro gerade so an der Schmerzgrenze.
Ist schon seltsam was die Hersteller in diesem Bereich unter Low Cost 
verstehen. Wo kauft ihr das Zeugs un 100er Stückzahlen?

Nochmal zur Technik:
Ich habe in meiner Anwendung einzelne 6 Schiebetakte die von den 
einzelnen SPI-Mastern erzeugt werden. Gibt das Probleme mit den 
Taktresourcen der CPLDs?

Dirk

von Rick Dangerus (Gast)


Lesenswert?

Wie schnell sind denn Deine 6 Schiebetakte? Wenn sie langsam genung sind 
kannst Du sie einsynchronisieren. Der CPLD läuft dann mit einem höheren 
Takt.

Bevor Du die Chips kaufst, würde ich erstmal das Verhalten beschreiben 
und simulieren. Bei CPLDs ist die Pinauswahl auch nicht so flexibel wie 
bei FPGAs.

Rick

von Dirk S. (Gast)


Lesenswert?

@Rick

Schiebetakt liegt bei bis zu 20MHz.
Dann müsste ich im CPLD vielleicht mit 60MHz abtasten. Ist das (zu) 
schnell? Was heisst das für die Stromaufnahme?

Ich habe vor vielen Jahren mal Zuverlässigkeitsprobleme mit zu vielen 
unterschiedlichen Taktdomänen gehabt (ispLSI1032 von Lattice). Kann mir 
das mit den heutigen Halbleitern auch noch passieren.

In was Modelliert man so etwas heute? VHDL?

Dirk

von Rick Dangerus (Gast)


Lesenswert?

60MHz sollte der CPLD können. Die Werte müßten sich aus dem Datenblatt 
ermitteln lassen. Aber auch die Synthesetools (Xilinx ISE) sollten die 
maximale Geschwindigkeit anzeigen können.

Anderseits wenn Du kannst Du auch einen CPLD mit ausreichend 
Clock-Eingängen nehemn. Dann sind die Ausgänge aber immer noch nicht 
synchron zueinander.

Und ja, Modellierung in VHDL, da findest Du hier am ehesten 
Unterstützung.

Rick

von Dirk S. (Gast)


Lesenswert?

@Rick

Was meinst du mit den Ausgängen, die Datenleitungen müssen halt sicher 
zur fallenden Flanke der Schiebetakte anliegen. Die SPI-Master erzeugen 
jeweils ihren Schiebetakt. Nanosekundengenaue Synchronisation der Master 
ist nicht möglich.
Wie es aussieht brauche ich für jeden Kanal einen separaten 6Bit Counter 
damit ich die 32 Takte mitzählen kann um damit das Ende der 
Datenübertragung zu erkennen.

Dirk

von Rick Dangerus (Gast)


Lesenswert?

Ich hab alles nochmal durchgelesen.

Erst schreibst Du was von 6 Slaves und dann was von 6 Master.

Wenn ich es richtig verstanden habe willst Du von Deinem uC aus 6 
SPI-Master abfragen. Und das soll offfenbar zwingend gleichzeitig 
geschehen, so eine Art digitales sample & hold. Wenn Gleichzeitigkeit 
nicht das Kriterium ist, könntest Du einen Multiplexer verwenden.

Kannst Du nicht aus den 6 Mastern Slaves machen? Und dann den FPGA/CPLD 
als Master/Taktquelle laufen lassen?
Das würde einiges vereinfachen.

Ansonsten wäre sampeln die sauberste Lösung, da im CPLD nur ein Takt 
nötig ist und alles synchron läuft.

Rick

von Falk (Gast)


Lesenswert?

@ Dirk S. (Gast)

>Schiebetakt liegt bei bis zu 20MHz.
>Dann müsste ich im CPLD vielleicht mit 60MHz abtasten. Ist das (zu)

Schafft der CPLD, würde ich aber nicht machen. Wozu auch? Dein FPGA/CPLD 
ist der Master und kann problemlos die 6 SPI-Takte generieren.

>>schnell? Was heisst das für die Stromaufnahme?

Sie wird höher, bis zu dreimal höher.

>Ich habe vor vielen Jahren mal Zuverlässigkeitsprobleme mit zu vielen
>unterschiedlichen Taktdomänen gehabt (ispLSI1032 von Lattice). Kann mir

Das waren Designfehler, die der Anwender zu verantworten hat, nicht der 
IC Hersteller!

>das mit den heutigen Halbleitern auch noch passieren.

Ja, wenn man es falsch macht. Viele Leute haben eine ungesunde Portion 
Halbwissen, vor allem was den Umgang mit asynchronen Taktdomänen angeht. 
Wenns dann knallt ist immer der IC schuld . . . :-(

>In was Modelliert man so etwas heute? VHDL?

Oder Verilog, wobei das eher in Amerika verbreitet ist. Europa ist 
VHDL-Gebiet ;-)

>1. µC schreibt die zu sendenden Daten in die 6 Shiftregister.
>2. µC gibt die Takteingänge der Shiftregister frei.
>3. µC triggert die SPI-Master, die darauf hin den Sendetakt liefern und
>die Sendedaten (Daten zum CPLD) raustakten und die Empfangsdaten (Daten
>vom CPLD) eintakten.
>4. Nach Ablauf der Übertragung (32 Schiebetakte) werden die Takteingänge
>im CPLD wieder verriegelt.
>5. µC wird benachrichtigt und liest in aller Ruhe die Empfangsdaten aus
>den Shiftregistern aus.
>6. zurück zu 1.

>Das Shiftregister ist dabei als Ringregister ausgeführt und enthält nach
>dem austakten der Sendedaten die eingetakteten Empfangsdaten.
>Mache ich bei meinem gedachten Ablauf einen Denkfehler?

Nein.

>Geht das in ein CPLD?

Könnte passen, aber da brauchst du schon einen mit 256 oder gar 512 
Macrozellen. Die kosten mehr als ein kleines FPGA, welches ein 
Vielfaches der Logikressourcen hat. Hmmm.

>Nochmal zur Technik:
>Ich habe in meiner Anwendung einzelne 6 Schiebetakte die von den
>einzelnen SPI-Mastern erzeugt werden. Gibt das Probleme mit den
>Taktresourcen der CPLDs?

Deine 6 Master sind doch im CPLD/FPGA, oder? Da ist es kein Problem den 
ersten 1kHz erzeugen zu lassen und den zweiten 10 MHz. Wenn deine 
höchste Frequenz 20 MHz ist, würde ich das CPLD mit 40 MHz betreiben. 
Der "Trick" dabei ist, dass die einzelnen SPI-Takte als normale Signale 
generiert und gehandhabt werden. Damit braucht man nur 1 Taktnetz und 
das ganze Design is vollkommen synchron.

MfG
Falk

von Dirk S. (Gast)


Angehängte Dateien:

Lesenswert?

Danke für die vielen Antworten.
Angehängt eine Skizze damit die Sache klarer wird.
Die Slaves sind im PLD.

@Falk
Ich bin natürlich auch ein Fan von synchronen Designs.
Die CPLDs bieten aber auch mehrere verschiedene Taktnetze, und 
vermitteln mir daduch den Eindruck dass man damit auch mehrere 
unabhängige Subsysteme asynchron voneinander Takten können sollte.

Vor den FPGAs schrecke ich ein wenig zurück, da dort häufig noch ein 
Konfigurations-EEPROM benötigt wird.
Ich habe mir bei Lattice msl die FPGAs angeschaut und finde die Teile 
recht überteuert. Der kleinste in 100er Stückzahlen um $16.

Irgendwie verstehe ich den Architektur-Unterschied zwischen FPGA und 
CPLD noch nicht so recht. FPGA haben anscheinend eine größere Anzahl an 
Logikblöcken geringerer Komplexität. Die "Logik" ist offensichtlich in 
kleinen Look-Up-Tables (mit 4 Eingängen) abgelegt. War's das?

Auch fehlt mir irgendwie die Vergleichsmöglichkeit der 
Kapazitätsangaben.
3.1K LUTS hört sich nach viel an, aber was kann man damit anstellen?

Dirk

von Falk (Gast)


Lesenswert?

@ Dirk S.

>Ich bin natürlich auch ein Fan von synchronen Designs.
>Die CPLDs bieten aber auch mehrere verschiedene Taktnetze, und
>vermitteln mir daduch den Eindruck dass man damit auch mehrere
>unabhängige Subsysteme asynchron voneinander Takten können sollte.

Kann man auch, wenn man eine Dinge beachtet. Aber wieso soll man sich 
den Stress machen, wenn es nicht wirklich notwendig ist?

Ohhh, ich sehe gerade, ich hab da wohl was übersehen. Du willst 6 Slaves 
in den CPLD/FPGA bauen. Hmmm. Das ist dann schon was anderes.

>Vor den FPGAs schrecke ich ein wenig zurück, da dort häufig noch ein
>Konfigurations-EEPROM benötigt wird.

Ja, ausser du nimmst

-Actel, die sind FLASH basierend, keine Ahnung ob die 5V tolerieren
-Spartan3AN, die neuen haben FLASH on chip, allerdings NICHT direkt 5V 
tolerant
-?

>Ich habe mir bei Lattice msl die FPGAs angeschaut und finde die Teile
>recht überteuert. Der kleinste in 100er Stückzahlen um $16.

Hmm, den XC2S15 gibts bei www.nuhorizons.com ab 8$. Die Firma ist 
mittlerweile auch in Deutschland auf dem Markt.

OK, dann brauchst du immer noch einen EEPROM zur Konfiguration. Die 
originalen Xilinx FLASH sind schweineteuer, weiss der Geier warum. Hier 
ist es sicher besser, einen kleinen 16 Pin uC + serielles EEPROM zu 
verwenden, das ist wesentlich billiger. OK, kostet natürlich ein wenig 
Entwicklungszeit :-(

>Irgendwie verstehe ich den Architektur-Unterschied zwischen FPGA und
>CPLD noch nicht so recht. FPGA haben anscheinend eine größere Anzahl an
>Logikblöcken geringerer Komplexität. Die "Logik" ist offensichtlich in

Ja, die Granularität ist feiner.

>kleinen Look-Up-Tables (mit 4 Eingängen) abgelegt. War's das?

Nein. FPGAs haben noch RAMs, PLLs, DLLs, Multiplizierer, 
Gigabit-tranceiver etc. Ausserdem ist die Routingstruktur vollkommen 
anders.

>Auch fehlt mir irgendwie die Vergleichsmöglichkeit der
>Kapazitätsangaben.
>3.1K LUTS hört sich nach viel an, aber was kann man damit anstellen?

3.1k LUTs heisst in etwa, dass 3.1K LUTs a 4 Eingänge (16 Bit ROM) + 
FlipFlop vorhanden sind. Damit kannst du 3.1K Bit speichern. Die 
Produkttereme der CPLDs sind natürlich viel grösser als LUTs, Pi mal 
Daumen kann man sagen, dass ca 10..50 LUTs einen Produktterm eines CPLDs 
ergeben. Allerdings werden in den meisten Schaltungen die Produktterme 
gar nicht gross ausgereizt, sodass ein grössere Anzahl kleiner LUTs 
wesentlich günstiger ist. In deinem Fall ist ein FPGA mit 3.1K LUTs 
wesentlich besser als ein CPLD mit 512 Macrozellen.

MfG
Falk

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.