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