ich habe folgendes Problem: ich möchte zwei IO-Ports des CPLD's miteinander verbinden. Ich habe das in Verilog folgendermaßen gelöst: module IO(port1, port2, data_dir); inout io_port1; inout io_port2; input data_dir; assign io_port1 = (data_dir) ? io_port2 : 1'bz; assign io_port2 = (data_dir) ? 1'bz : io_port1; endmodule Leider erhalte ich bei der Timing-Analyse statt der Hi-Signale am Output-Port nur "unknown" (in beiden Richtungen). Hat jemand eine Idee, wo das Problem liegt?
gute Frage ich lege noch einen oben drauf: Kann man mit CPLD's und/oder FPGA's reale, ich meine echte Bidirektionale Pin's miteinander verbinden ? Also nicht solche BiDir's die sequentiell Daten ein- oder auslesen können. Gruß Hagen
@ Sthembiso ... Was ist das denn für ein Beitrag? und der Anhang ist ja auch klasse... Bin ich noch zu verschlafen, oder ist das alles völliger unsinn von dir?
Vielleicht soll das ja die Frage beantworten. nach dem Motto: dumme Frage -> dumme Antwort ? Gruß Hagen
Naja... den witz habe ich dann wohl nicht verstanden. Aber danke für den Tipp...
@ Hagen Was meinst Du mit "echten" bidirektionalen Pins und mit "nicht" sequentiell Daten ein oder aulesen? Meines wissens geht nur eine Richtung, wenn man nur einen Draht hat. Willst Du hier auf Open-Kollektor-Geschichten hinaus, wie beim I2C-Bus? Bei einem FPGA/CPLD sind die I/O-Pins immer bidirektional ausgelegt, da man diese sonst nicht frei als Eingang oder Ausgang definieren könnte. Kann man die nicht mit inout ansteuern? Habe es noch nicht praktisch gemacht, war aber immer der Meinung, dass es damit auch für die Pins ginge. MfG Micha
@Michael: meine Frage ist eine Provokation die ersichtlich macht wie die korrekte Antwort lautet. Die Frage zielte darauf hin ob man in einem CPLD/FPGA zwei Pins so verbinden kann das sie in BEIDE Richtungen wie ein einfacher Draht funktionieren und DENOCH auf beiden Seiten auch High-Z sein können. Die Antwort ist einfach: es geht nicht. Zumindestens nach meinem Verständnis geht das nicht. (sag niemals nie ;) Gruß Hagen
>> Willst Du hier auf Open-Kollektor-Geschichten hinaus, >> wie beim I2C-Bus? Im Grunde ja, sinnvoll ist sowas wenn man einen CPLD/FPGA als Level-Shifter benutzen will, sprich ein 5V IOBmit einem 3.3V IOB direkt verknüpfen, ohne zusätzliche Intelligenz im Chip um zb. auch einen I2C Bus zu shiften. Meiner meinung geht das nur wenn man zb. die Clock Leitung des I2C Busses an zwei Pins als Eingang und zwei Pins als Ausgang parallel schaltet. Man hat intern also 2 Leitungen die antiparallel als Ein->Ausgang geschaltet sind und beide als I2C Clock fungieren. Aber ob das nun real funktionieren würde weiß ich auch nicht ;( Gruß hagen
Nö, aber aus dem Osten. FHL? Fachhochschule Leipzig ? Auch nö, mit 36 ist man zwar noch nicht zu alt zum studieren, aber auch das mache ich nicht. VHDL/AVR's usw. sind nur eine gute Entspannungsaufgabe im harten Alltag eines freiberuflichen Programmierers ;) Gruß Hagen
... uuups, so war es wohl doch ein anderer Hagen :-) ... Sorry FPGAs/CPLDs mit Open-Kollektor-Pins täten das natürlich erleichtern. Suche schon länger nach einer Lösung, nen I2C mit nem CPLD zu verbinden, ohne Einschränkungen am Bus-Protokoll zu machen. Man muss halt definitiv ausschließen, das zwei Master gleichzeitig senden. Bezüglich Pegelanpassung war in der letzten Elektor was drin. Musst mal schauen ... wenn ich mich recht erinnere, war sogar ne Verknüpfung von 2V mit 10V möglich. MfG Michael
also mit Richtungsumschaltung sollte die Verbindung schon funktionieren: VHDL-Vorschlag: port1 <= port2 when data_dir = '1' else 'Z'; port2 <= port1 when data_dir = '0' else 'Z';
@FPGA-User die Bidirektionalität ist nicht das Problem, sondern die Tatsache, dass es keine Open-Kollektor-Ausgänge sind. Sollten zufällig zwei Master gleichzeitig senden, gibts elektrische Probleme da man zwei Eingänge auf einander legt (ich glaub ein Kurzschluss ist die Folge). Bei Open-Kollektor-Ausgängen jedoch macht das nichts, da es sich im Grunde nur um eine UND-Verknüpfung handelt. Sollte ich falsch liegen, bitte ich um Korrektur. Vielleicht lebe ich die ganze Zeit mit einem falschen Weltbild. MfG Michael
@Michael man kann aber Open-Drain-Ausgänge draus machen ! Schließlich hat man ja Tristate-Ausgänge und wenn man nur 0 oder Z ausgibt, dann ist das wie Open-Drain bzw. Open-Collector. Zwingt Dich ja keiner, eine 1 auszugeben.
Hm, und für die andere Richtung also SDA_Out <= '0' when SDA_In = '0' else 'Z'; SDA_In <= '0' when SDA_Out = '0' else 'Z'; Nur glaube ich nicht das das funktionert, oder doch ? Ich muß das mal simulieren, denn nach so einem Level-Shifter suche ich schon die ganze Zeit. Man hat ja öfters noch einige Pins am CPLD/FPGA frei zur Verfügung, neben dem eigentlichen Design, und ich möchte diese dann gleich als Level-Shifter/Multiplexer benutzen. Gruß Hagen
@Hagen das geht nur in eine Richtung, da sich die Schaltung ja sonst bei 0 hält, sobald einmal an irgendeiner Seite 0 ausgegeben wurde. Mit Richtungsumschaltung würde es "halbduplex" gehen
Hi, also ich meine es geht. Dazu muß man aber mit 4 Pins pro Leitung arbeiten und FPGA-User's obigen Trick anwenden, eiegntlich ganz simple. Anbei erstmal das VHDL das ich mit Quartus II für einen MAX7000S erzeugt habe. Gruß Hagen
So und nun die Timing Simulation. Man verbindet also SDA_3V_in + SDA_3V_out als eine Leitung auf 3.3V Seite und SDA_5V_in + SDA_5V_out auf 5V Seite. Die erste Transistion auf Low wird auf 3.3V Seite gemacht. Die zweite Transistion auf Low auf 5V Seite. Man sieht die Laufzeitverzögerungen im CPLD und da SDA_3V_in + SDA_3V_out zusammengeschaltete Pins sind muß natürlich auch der SDA_3V_out auf Low gehen wenn an SDA_3V_in oder SDA_5V_in LOw anliegt. Eine Kollision der verschiedenen Pegel falls an beiden Enden zwei Master sitzen dürfte es nur solange geben wie die Gatterverzögerung im CPLD anhält. Naja normalerweise sollte es ja im Grunde zu keinen Masterkonflikt kommen. Gruß Hagen
Sorry, Simulation war nicht ganz korrekt, wie müssen ja mit Weak-High und Weak-Low arbeiten. Gruß Hagen
Vergesst es, das funktioniert so auch nicht und in fact bin ich sogar erleichtert das es so nicht geht. Somit stimmt zumindestens meine erste Aussage wieder, es geht nicht weil man so wie es FPGA-User sagt zumindestens die Datenrichtung aktiv dem CPLD/FPGA mitteilen muß. Es geht immer nur in eine Richtung aus Sicht des CPLD/FPGA. Es geht nicht automatisch. Ich werde nochmal versuchen die Eingangs Pins als Clocks zu betrachten, aber ich glaube kaum das das hinhaut. Wie FPGA-User es schon sagte, einmal ein Eingang auf Low sind alls Ausgänge immer auf Low. Der Shifter geht nicht mehr auf High und blockiert sich selber. Gruß Hagen
Hallo, wenn es euch wirklich nur um die Pegelkonvertierung geht, dann fahrt ihr ganz schön große Geschütze auf. Das wären ja nicht mal mehr Kanonen, mit denen ihr auf Spatzen zielt. Hier nochmal der erwähnte Elektor-Artikel: http://www.elektor.de/Default.aspx?tabid=27&year=2005&month=7&art=5550552&PN=On MfG Michael
@Michael: naja die Frage ist ja nicht ob man mit zusätzlicher Elektronik sowas hinbekommen würde sondern ob man ohne zusätzliche Elektronik sowas in einem CPLD hinbekommen würde. Ich habe jetzt mal mit meiner obigen Idee experimentiert und versucht einen intelligenten Levelshifter hinzubekommen. Intellgent deshalb weil der VHDL Source Bus Kollisionen verhindern soll. Wie ich meine habe ich das sogar hinbekommen ;) Es kann immer nur einer der Master sein, nämlich derjenige der zuerst den Bus auf Low Pegel zieht. Solange dieser Master nicht wieder auf Weak-High = HighZ geht und somit den Bus freigibt kann der andere Master am Bus nicht den Bus übernehmen. Anbei das VHDL, den Screenshot der Simulation poste ich separat. Gruß Hagen
Wie man sieht passiert folgendes: Zuerst übernimmt SDA_3V den Bus und zieht 2 mal nacheinander auf L. SDA_5V reagiert darauf. Danach zieht SDA_5V zweimal den Bus auf Low und ist somit Master. Bei der blauenMarkierung versucht nun SDA_3V den Bus illegaler Weise zu über nehmen aber da noch SDA_5V der Master ist reagiert SDA_5V natürlich nicht darauf sondern behält weiterhin die Buskontrolle als Master. Es geht also, wenn auch mit Einschränkungen. Ob meine Lösung nun clever ist das weiß ich selber nicht so richtig, auf alle Fälle funktioniert sie. Es werden 6 FF's benötigt und die max. Geschwindigkeit mit einem 5ns MAX7000S ist 78MHz. Gruß Hagen
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.