mikrocontroller.net

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


Autor: foobla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: foobla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: foobla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Autor: Foobla Foobar (foobla)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: i2c beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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!
  i2c_sda <= '0' when i2c_sda_int ='0' else 'Z';
  i2c_scl <= '0' when i2c_scl_int ='0' else 'Z';

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

Sicher.

MFG
Falk

Autor: i2c beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

Autor: i2c beginner (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: i2c beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Veraenderung und ohne Zugriff solltest du ihn auch durchreichen 
koennen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: i2c beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: i2c beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: i2c beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.