Forum: FPGA, VHDL & Co. Spartan 3 I2C ISE Tristate


von foobla (Gast)


Lesenswert?

Hi.

Ich will nen I2C slave direkt an nen Spartan 3 anbinden.
Ich habe vor dafür interne Pullups vom FPGA zu verwenden.
(werden mit U0 : PULLUP port map... instantiiert).
Nun wollte ich an den Pin mit dem Pullup dran, halt
entweder eine 0 anlegen oder auf hochohmig schalten.

Jetzt faengt aber offenbar das ISE an mir Signale weg-
zu optimieren... sie sind ja immer 0 und werden nur
abgeschalten per tri state oder so.

Wie mach ich das denn?

Sowas spuckt ISE aus:
WARNING:Xst:1710 - FF/Latch  <Mtridata_cam_sdata> (without init value) 
has a constant value of 0 in block <plasma>.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch 
<Mtridata_cam_sclk> (without init value) has a constant value of 0 in 
block <plasma>.
WARNING:Xst:638 - in unit plasma Conflict on KEEP property on signal 
Mtridata_cam_sdata and Mtridata_cam_sclk Mtridata_cam_sclk signal will 
be lost.


foobla

von Falk (Gast)


Lesenswert?

@foobla

>Ich will nen I2C slave direkt an nen Spartan 3 anbinden.
>Ich habe vor dafür interne Pullups vom FPGA zu verwenden.

Naja, geht soweit, könnte aber bei höheren Datenraten zu hochohmig sein.

>Jetzt faengt aber offenbar das ISE an mir Signale weg-
>zu optimieren... sie sind ja immer 0 und werden nur
>abgeschalten per tri state oder so.

>Wie mach ich das denn?

  i2c_sda <= '0' when i2c_sda_int ='0' else 'Z';
  i2c_scl <= '0' when i2c_scl_int ='0' else 'Z';

MfG
Falk

von foobla (Gast)


Lesenswert?

Erstmal danke für die prompte Antwort.

Kannst du die Lösung (es funktioniert nun) vielleicht
noch etwas erläutern? Vorher hatte ich einfach
ein Signal das 0 oder Z angenommen hat, nun hab
ich wie von dir vorgeschlagen 2 Signale und es geht.
Warum versucht er nicht i2c_sda wegzuoptimieren,
nimmt ja auch nur 0 oder Z an.

foobla

von Falk (Gast)


Lesenswert?

@foobla

>Warum versucht er nicht i2c_sda wegzuoptimieren,
>nimmt ja auch nur 0 oder Z an.

Interne Signale könne nur 1 oder 0 sein, Tristate gibt es nicht (mehr). 
Gabs mal in älteren FPGAs.
Wenn man nun in VHDL ein SIGNAL mit 0 und Z treibt, und das dann an ein 
Ausgangspin gibt (in diesem Fall sogar ein bidirektionales), dann 
verhaspelt sich der Compiler (naja, es gibt schon definierte Regeln zur 
Signalzuweisung, aber hier klappt das eben nicht so, wie man sich es so 
einfach vorstellt.) Also muss man direkt auf den Ausgang die 
obengenannte Zuweisung machen.

MFG
Falk

von foobla (Gast)


Lesenswert?

Danke!

von Foobla F. (foobla)


Lesenswert?

Hm, jetzt habe ich noch das Problem,
dass offenbar beim lesen von dem
"ge-pull-up-ten" inout Pin, immer
nur eins kommt, auch wenn ich den
Ausgang tri state und Masse
an den Pin anschliesse.

Weiss da evtl. noch jemand Rat?

foobla

von Falk (Gast)


Lesenswert?

@ Foobla Foobar

>Hm, jetzt habe ich noch das Problem,
>dass offenbar beim lesen von dem
>"ge-pull-up-ten" inout Pin, immer
>nur eins kommt, auch wenn ich den
>Ausgang tri state und Masse
>an den Pin anschliesse.

Das ist vollkommen unmöglich. Poste mal deinen Code.

MfG
Falk

von i2c beginner (Gast)


Lesenswert?

Ich will auch einen I2C-Slave in einem Xilinx FPGA implementieren.
Aber dann mit externem Pull-up.
Haben die Xilinx FPGAs open drain in/outs oder wie wird das gemacht? 
Kann ich zwei normale in/outs dazu denn verwenden?
Danke an Antwortende,

von Falk B. (falk)


Lesenswert?

@ i2c beginner (Gast)

>Ich will auch einen I2C-Slave in einem Xilinx FPGA implementieren.
>Aber dann mit externem Pull-up.

Schön.

>Haben die Xilinx FPGAs open drain in/outs oder wie wird das gemacht?

So wie oben beschrieben!
1
  i2c_sda <= '0' when i2c_sda_int ='0' else 'Z';
2
  i2c_scl <= '0' when i2c_scl_int ='0' else 'Z';

>Kann ich zwei normale in/outs dazu denn verwenden?

Sicher.

MFG
Falk

von i2c beginner (Gast)


Lesenswert?

Vielen Dank.

von i2c beginner (Gast)


Lesenswert?

Braucht man eine Lizenz um I2C kommerziell zu verwenden? Habe etwas von 
Philips Patent gelesen.

von Falk B. (falk)


Lesenswert?

@ i2c beginner (Gast)

>Braucht man eine Lizenz um I2C kommerziell zu verwenden? Habe etwas von
>Philips Patent gelesen.

Nein, nur wenn du eine IC auf den Markt bringst und die Schnittstelle 
I2C nennst. Wenn du sie TWI /TWo Wire Interface) oder Doppeldraht oder 
wasweissich nennst ist alles OK.

MFG
Falk

von i2c beginner (Gast)


Lesenswert?

Wenn ich im i2c modul zwei unidirektionale leitungen (ein in, ein out) 
pro i2c leitung nehme und das ganze mit einem xilinx IOBUF verbinde 
klappt das dann auch?
Wenn ich eine inout leitung nehme: hab gelesen das man das nur auf 
top-ebene darf, heisst das ich kann einen inout nicht in einem unteren 
block haben oder nur das ich den bis oben ohne veraenderung durchreichen 
muss?
Danke.

von Jan M. (mueschel)


Lesenswert?

Ohne Veraenderung und ohne Zugriff solltest du ihn auch durchreichen 
koennen.

von Falk B. (falk)


Lesenswert?

@ i2c beginner (Gast)

>Wenn ich im i2c modul zwei unidirektionale leitungen (ein in, ein out)
>pro i2c leitung nehme und das ganze mit einem xilinx IOBUF verbinde
>klappt das dann auch?

Ja.

>Wenn ich eine inout leitung nehme: hab gelesen das man das nur auf
>top-ebene darf,

Du darfst es auch durchreichen. Sollte man aber nicht machen. Daran 
verschlucken sich die Synthesetools manchmal.

MfG
Falk

von i2c beginner (Gast)


Lesenswert?

Danke.
Also ist es sogar besser den IOBUF zu nehmen und die "Z"-Zuweisung nicht 
selbst zu machen, wenn das modul auf einer unteren ebene ist? Sollte man 
das generell als saubereren programmierstil betrachten?

von Falk B. (falk)


Lesenswert?

@ i2c beginner (Gast)

>Also ist es sogar besser den IOBUF zu nehmen und die "Z"-Zuweisung nicht
>selbst zu machen, wenn das modul auf einer unteren ebene ist?

Nein. IOBUFs gehören nur auf die oberste Ebene (Toplevel). Und mit den 
IOBUF hantiert man möglichst wenig per Hand, das kann der Compiler zu 
95% alleine und besser.

> Sollte man das generell als saubereren programmierstil betrachten?

Nein. Nutze die "Z"-Zuweisung auf dem Toplevel und geh dann mit zwei 
unidirektionalen Signalen an dein Modul.

MFG
Falk

von i2c beginner (Gast)


Lesenswert?

Danke, hat mir schon sehr geholfen.
Nochwas, wenn ich die flanken beim i2c clock erkennen will ueber samplen 
mit 50 MHz, muss ich dieses SCL signal mehrmals registern? Also so wie 
entprellen, weil es so langsam ist und vielleicht irgendwie sonst was 
falsch wird? Oder kann ich direkt auf das Signal zugreifen und nur zur 
Flankenerkennung einmal registern?

von Falk B. (falk)


Lesenswert?

@ i2c beginner (Gast)

>mit 50 MHz, muss ich dieses SCL signal mehrmals registern? Also so wie
>entprellen, weil es so langsam ist und vielleicht irgendwie sonst was
>falsch wird?

Ist besser. Und man sollte falls möglich die Eingänge als 
Schmitt-trigger schalten.

Mfg
Falk

von i2c beginner (Gast)


Lesenswert?

Okay, aber wenn ich nur den fpga (Spartan3) habe geht das mit dem 
schmitt trigger nicht oder hat der welche dabei? Oder besser gleich ein 
"entprell"modul schreiben das nach erkennung eines wechsels erstmal 
nichts mehr annimmt?

von Falk B. (falk)


Lesenswert?

@ i2c beginner (Gast)

>Okay, aber wenn ich nur den fpga (Spartan3) habe geht das mit dem
>schmitt trigger nicht oder hat der welche dabei?

Nein, der hat keine.

> Oder besser gleich ein
>"entprell"modul schreiben das nach erkennung eines wechsels erstmal
>nichts mehr annimmt?

Ja.

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.