Hallo, ich bin leider nur Informatiker und habe von echter Hardware nur wenig Ahnung, daher hier meine Frage: Für mein Studium muss ich mehrere FPGAs miteinander verbinden, um ein Busprotokoll zu testen. Zur Verfügung stehen mir mehrere AVNET Spartan 3 Development Boards: http://www.em.avnet.com/ctf_shared/evk/df2df2usa/Spartan-3_Dev_Brief.pdf Ich habe im Internet schon einiges gefunden: Von der gehelfsmäßigen Umfunktionierung des RS232 Interfaces für mehr als 2 Geräte, der optischen Übertragung mittels LEDs und Sensoren, bis zu in den FPGAs integrierten PULLUPs mit Open Drain Anschlüssen, ... Ein ähnliches Problem (I2C) ist hier im Forum auch schon des öfteren beschrieben, allerdings auf einem für mich noch zu hohem Level. Das ganze sollte möglichst sicher zu bauen sein, so dass selbst bei einer falschen Konfiguration der Businterface kein Schaden an den Boards entsteht. Ausserdem so störsicher, dass keine Fehlerkorrektur im Protokoll notwendig wird. Um 3-4 Boards zu verbinden wird eine Gesamtlänge von min. 0,5m benötigt. Und nochmals kurz: Wie sieht die Realisierung der Hardware eines Busses zwischen mehreren FPGA Boards aus?
> Und nochmals kurz: Wie sieht die Realisierung der Hardware eines Busses > zwischen mehreren FPGA Boards aus? Wie schnell sollen die Daten übertragen werden?
Das Businterface läuft veraussichtlich mit max. 16,5MHz, aber die Daten werden für das Oversampling auf der anderen Seite jeweils 8 Takte gehalten, sprich sie werden effektiv mit ca. 2MHz versendet. Aber diese Werte kann ich ja nach belieben wählen, sollten nur nicht zu langsam werden.
@ Erik E. (ikendes) >Das Businterface läuft veraussichtlich mit max. 16,5MHz, aber die Daten >werden für das Oversampling auf der anderen Seite jeweils 8 Takte >gehalten, sprich sie werden effektiv mit ca. 2MHz versendet. So ein Unsinn. >Aber diese Werte kann ich ja nach belieben wählen, sollten nur nicht zu >langsam werden. Unsinn die 2. Mach mal ne ordentliche Aussage zu Takten, Datendurchsatz, Busbreite, Maste/Slave etc. oder vergiss es und bleib bei deiner Software. MFG Falk
Also: Das gesamte Design wird mit einer 66 MHz Clock betrieben. Allerdings ist dies würd den von mir geschriebenen Prozessorkern etwas zu schnell, daher wird dieser per DCM mit clk/4 betrieben, was nach meiner Rechnung zu einem Takt von 16,5 MHz führt. Dieses Takt schafft das Businterface auch, daher hatte ich geschrieben: Max. 16,5 MHz. Das Busprotokoll hält allerdings jedes Bit 8 Takte lang auf dem Bus. Daher werden die Daten effektiv mit max. 16,5 / 8 = 2,0625 MHz auf den Bus gelegt. Daraus ergibt sich eine ungefähre Datenrate von MAXIMAL 2MBit/s. Dies ist allerdings ein Maximalwert, der durch den Prozessorkern vorgegeben wird. Sollte dies absolut zu schnell sein, kann ich das System auch mit jedem beliebigen Takt betreiben. Leider hilft mir der Hinweis "Unsinn" nicht wirklich weiter. Der Grund warum dies Unsinn ist, hätte mir deutlich mehr geholfen. Busbreite: Ganz klar mein Fehler hatte ich oben vergessen: Es handelt sich um einen seriellen Bus. Sprich: eine einzige Leitung. An dieser Stelle taucht dann natürlich auch die Fragen auf: In wie weit muss ich eine GND Leitung dazulegen? Bei der optischen Übertragung natürlich nicht, bei der Beschaltung als Wired-And vermutlich schon. Das ist aber wieder ein Punkt an dem ich auf Hilfe hoffe. Abgschirmtes Kabel? Wie schon gesagt: Bin leider nur Informatiker und habe von Elektronik leidlich wenig Ahnung. Master/Slave gibt es nicht, da es sich um eine synchrone zeitgesteuerte Übertragung handelt. Sprich: Die unterschiedlichen Geräte synchronisieren sich miteinander und bekommen jeweils ein festes Zeitfenster, in dem sie Daten übertragen dürfen. Lediglich für diese Synchronisierung dient ein Chip als Zeitgeber, auf den sich die anderen synchronisieren. Und nein, ich mache Informatik, aber schreibe keine Software. Ich schreibe einen eigenen Prozessorkern, Businterface,... Bei Testen bekomme ich dann allerdings ein Problem. Kann ich bei 2 FPGA Boards noch locker den vorhandenen RS232 Anschluss mit einem Nullmodemkabeln nutzen, geht dies bei der Verbindung von mehr als 2 Board nur noch regelwidrig, da dazu die logische Null nicht mehr durch -5V sondern durch 0V dargestellt wird. Dies ist für einen Testaufbau leider nicht akzeptabel. Um es nochmals deutlich zu machen, hatte ich hier eher auf einen Tip wie: Beschalte einen 1. Pin als PULL UP. Beschalte einen 2. Pin als Open Drain. Führe nun ein Kabel mit der Impedanz ???? (????) von Pin 1 zu Pin 2 und zu den weiteren Boards und deren Pin 2. Betreibe dies mit maximal ????? KBit/s. ODER Das geht nicht so einfach, leg einfach an jedem Board einen Pin als Ausgang und 2 als Eingang für die Signale der beiden anderen Boards an und verschalte diese intern. Das ist einfach sicherer. Das sind zwei meiner NAIVEN ANSÄTZE. Da ich (nochmals) keine Ahnung habe.
> An dieser Stelle taucht dann natürlich auch die Fragen auf: In wie weit > muss ich eine GND Leitung dazulegen? Ja nun, ein Bezugspotential brauchst du schon... :-o Du hast IMHO 2 Freiheitsgrade: 1. das Medium (elektrisch, optisch...) 2. das Protokoll (Handshake, Start, Ende, Busarbitrierung...) wobei Punkt 2 schon irgendwie (wenigstens teilweise) festzuliegen scheint. 2 MHz kannst du über einen "normalen" Draht ohne weiters über 50cm bekommen. Am einfachsten ist eine eine Punkt zu Punkt-Verbindung. Mit Multimaster-Bussen ( CAN, RS485 & Co) ist immer auch ein Verwaltungsaufwand verbunden: wer bekommt wann von wem den Bus zugeteilt. Hast du dir schon mal irgendwelche seriellen Datenprotokolle angesehen? Es gibt viele davon. In deinem Fall liegt SPI auf der Hand...
ALso wenn du es ganz einfach haben willst, verschalte alle FPGAs als Ring z.B. mit RS232 bzw. da du eh gleiche Spannungspegel hast kannst du die Transiver auch rauslassen, gib jedem Datenpaket die Addresse des Ziel FPGAs mit und den Quell FPGAs. Wenn QuellID = Eigene ID: -> Paket verwerfen sonst: wenn ZielID = EIgene ID -> Paket auswerten sonst -> weiterleiten an nächsten FPGA Als Kabel nimmst du dann einfaches Nullmodemkabel. Wenn du es ganz edel haben willst kannst du natürlich die Signale auch differientiell übertragen falls dein Spartan3 Board hat zumindes LVDS Treiber nach dem PDF...
Danke für diese Hilfe schonmal. > Du hast IMHO 2 Freiheitsgrade: > 1. das Medium (elektrisch, optisch...) > 2. das Protokoll (Handshake, Start, Ende, Busarbitrierung...) > wobei Punkt 2 schon irgendwie (wenigstens teilweise) festzuliegen > scheint. Das Protokoll liegt absolut fest und existiert bereits als Verilogmodul. D.h. mein Ansatzpunkt ist ein Verilogmodul mit einem Sendeausgang und Empfangseingang (jeweils 1 Bit). Dann habe ich noch mehrere FPGA Developmentboards (siehe obigen Link). Und mein Problem besteht mal ganz grob gesagt nur noch aus dem Stück Draht, das ich zwischen die FPGA Boards klemmen muss. Also dem 1. Freiheitsgrad. >> An dieser Stelle taucht dann natürlich auch die Fragen auf: In wie weit >> muss ich eine GND Leitung dazulegen? > Ja nun, ein Bezugspotential brauchst du schon... :-o Ist mir klar, deshalb habe ich ja auch nicht einfach versucht und Stück Draht an einen Pin des FPGA-Boards zu stecken, sondern hier nach Hilfe gesucht. :-) Ausgangspunkt sind hierbei wieder mehrer FPGA-Boards mit jeweils einem eigenen Trafo... und schon fangen wieder meine Probleme an: Muss ich bereits diese Trafos durch Zusammenschalten eines Pols der Sekundärseite... oder kann ich einfach GND von FPGA1 an GND von FPGA2 hängen ohne dass es kracht? > 2 MHz kannst du über einen "normalen" Draht ohne weiters über 50cm > bekommen. Am einfachsten ist eine eine Punkt zu Punkt-Verbindung. Mit > Multimaster-Bussen ( CAN, RS485 & Co) ist immer auch ein > Verwaltungsaufwand verbunden: wer bekommt wann von wem den Bus > zugeteilt. Also war die Angabe von 2 MHz kein totaler Unsinn? > Hast du dir schon mal irgendwelche seriellen Datenprotokolle angesehen? > Es gibt viele davon. In deinem Fall liegt SPI auf der Hand... Ja, habe ich. Aber wie schon gesagt, das Protokoll ist vorgegeben. Solangsam verstehe ich aber, warum mich zuerst keiner Verstanden hat. Hier etwas genauer mein Problem: Ich habe 3 FPGA-Board mit jeweils einem Sendeausgang für mein Bussignal. Wie bekomme ich diese 3 Signale so auf eine einzige Leitung, dass selbst bei einem Fehler des Busprotokolls keine Schäden entstehen? Mir sind bisher folgende Möglichkeiten bekannt: Wired-AND Optische Übertragung aber vermutlich gibt es noch weitere Möglichkeiten. Das Prinzip der beiden obigen Systeme ist mir klar. Ich habe nur (typisch Student) keine Ahnung von der konkreten Realisierung.
> oder kann ich einfach GND von FPGA1 an GND von FPGA2 hängen ohne dass es > kracht? Das würde ich erwarten. Genaues kann dir nur der Schaltplan verraten... > Ich habe 3 FPGA-Board mit jeweils einem Sendeausgang für mein Bussignal. > Wie bekomme ich diese 3 Signale so auf eine einzige Leitung, dass selbst > bei einem Fehler des Busprotokolls keine Schäden entstehen? Schalte einfach einen 100 Ohm Widerstand an den Sender-Ausgang, dann geht nichts kaputt. Interessant dürfte allerdings werden, wie du die zusammengewürfelten Daten wieder auseinanderbekommst... :-/ > Mir sind bisher folgende Möglichkeiten bekannt: > Wired-AND Üblicherweise ist es so, dass der sendende Teilnehmer den Bus bekommt. die anderen (potentiellen) Sender schalten ihren Ausgang hochohmig.
>> Mir sind bisher folgende Möglichkeiten bekannt: >> Wired-AND > Üblicherweise ist es so, dass der sendende Teilnehmer den Bus bekommt. > die anderen (potentiellen) Sender schalten ihren Ausgang hochohmig. Das wäre noch kein Wired-AND: Die einfachste Realisierung erreicht man mit einer Busleitung, die über einen PULLUP Widerstand auf das hohe Potential (logische Eins) gesetzt wird. Die Datenleitungen werden dann als OPEN DRAIN daran angeschlossen, die die Busleitung dann aktiv auf das niedrige Potential (logische Null) ziehen. Beim Spartan 3 kann ich Ausgangspins sowohl als PULLUP, als auch als OPEN DRAIN Treiber schalten, also dies durchaus möglich sein. Im Schaltplan nachsehen geht dabei leider nicht, da ich ja genau diesen Teil noch realisieren muss. @ Läubi LVDS Treiber wären ein Lösung für mein Problem mit dem Potentialausgleich, lösen aber nicht das Problem der Buscontention bei einem Protokollfehler.
Ich wollte nicht ein Wired-And beschreiben, sondern sagen: Du wirst mit einem richtigen Wired-And (also Pullup zum inaktiven Pegel und Transistoren zum aktiven Pegel) nicht zuverlässig auf deine Baudrate kommen. Nimm die "übliche" Vorgehensweise, dass einer der Busteilnehmer aktiv den Bus treibt, und die anderen solange still sind. Damit bei einer Buskollision nichts kaputtgeht, schaltest du Serienwiderstände in die Ausgangsleitungen. > LVDS Treiber wären ein Lösung für mein Problem mit dem Potentialausgleich Nein. Denn der Gleichtakt-eingangsbereich von LVDS-Eingänge reicht nur maximal bis zu der jeweiligen Versorgungsspannung. Auch hier ist eine GND-Verbindung zwingend nötig. > lösen aber nicht das Problem der Buscontention bei einem Protokollfehler. Du machst es dir gern unwahrscheinlich schwer, oder? Ein kurzer und guter Tipp aus der Praxis: Schließ die Dinger einfach zusammen, da geht nichts kaputt.
Deswegen sage ich ja du sollst dir nen Ring aufbauen... dann kann es keine Kollisionen geben, und deine Pakete sind (bei geeigenter Steuerung) maximal n/2 lang unterweges wobei n die Anzahl Busteilnehmer sind. also in deinem Fall von 3 Boards also immer in einem "Zyklus".
> Deswegen sage ich ja du sollst dir nen Ring aufbauen... Geht leider nicht, da ich keine Pakete habe sondern die Daten immer bei allen anderen FPGA ankommen müssen. Ein Ring ist auch ansonsten problematisch, da das ganze Protokoll zeitgesteuert ist. D.h. jedes FPGA hat sein festes Zeitintervall in dem es senden darf. Daher kann ich auch keine weitere Logik hinzufügen.
Nagut dann halt einfach die Zieladresse rausnehmen und schon kommt es bei allen an ;) Wenn es festgelegte Intervalle gibt/geben soll wäre vieleicht sowas wie Token Ring ne Überlegung wert.
Ach ich Trottel!
Klar geht ein Ring. O Mann, man muss sich nur Tage lang unnötige
Gedanken machen...
Wie Lothar schon geschrieben hat:
> Du machst es dir gern unwahrscheinlich schwer, oder?
Danke für den Gedankenanstoß.
Ich schalten die einfach über RS232 als Ring hintereinander.
Ein Ring bei 3 Teilnehmern ist für mich ein vollständig besetzter Graph :>
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.