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
@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
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
@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
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
@ 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
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,
@ 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
Braucht man eine Lizenz um I2C kommerziell zu verwenden? Habe etwas von Philips Patent gelesen.
@ 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
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.
Ohne Veraenderung und ohne Zugriff solltest du ihn auch durchreichen koennen.
@ 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
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?
@ 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
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?
@ 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
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?
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.