Forum: FPGA, VHDL & Co. Tri-state Ports


von Tom (Gast)


Lesenswert?

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?

von Hagen (Gast)


Lesenswert?

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

von Sthembiso Sibeko (Gast)


Angehängte Dateien:

Lesenswert?

what us are Tri-State Ports

von AxelMeineke (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

Vielleicht soll das ja die Frage beantworten.
nach dem Motto: dumme Frage -> dumme Antwort ?

Gruß Hagen

von AxelMeineke (Gast)


Lesenswert?

Naja... den witz habe ich dann wohl nicht verstanden. Aber danke für den
Tipp...

von ups (Gast)


Lesenswert?

0, 1 ,Z

von Michael (Gast)


Lesenswert?

@ 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

von Hagen (Gast)


Lesenswert?

@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

von Hagen (Gast)


Lesenswert?

>> 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

von Michael (Gast)


Lesenswert?

@Hagen

kommst Du aus Leipzig? FHL?

Gruß Micha

von Hagen (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von FPGA-User (Gast)


Lesenswert?

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';

von Michael (Gast)


Lesenswert?

@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

von FPGA-User (Gast)


Lesenswert?

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

von FPGA-User (Gast)


Lesenswert?

Beispiel Open-Drain :

port1 <= '0' when SDA = '0' else 'Z'; -- könnte I2C sein

von Hagen (Gast)


Lesenswert?

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

von FPGA-User (Gast)


Lesenswert?

@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

von Hagen (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hagen (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hagen (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, Simulation war nicht ganz korrekt, wie müssen ja mit Weak-High
und Weak-Low arbeiten.

Gruß Hagen

von Hagen (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von Hagen (Gast)


Angehängte Dateien:

Lesenswert?

@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

von Hagen (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.