Moin, ich moechte eine IIC Kommunikation mit einem CMOS Kamera chip(QV7620) herstellen, und dafuer benoetige ich eine bi-direktionalen Datenleitung. In meinem Modul habe ich folgendes implementiert: ############ module I2C(Clock, Reset, SDA, SCL, ...); ... inout SDA; reg SDAreg; assign SDA = SDAreg; ... ########## Ich kann dann problemlos SDA lesen und schreiben. Meine Frage: muss ich explizit vor Place&Route den SDA Input als open-collector spezifizieren, und wie mache ich das? Ich nutze Spartan3 von Xilinx und ISE7.1. Gruss, H
Hallo, genau genommen müsste man sagen Open-Drain. Nein, die Synthese erkennt aus der Beschreibung, ob ein Open-Drain implementiert werden soll oder ein Push-Pull Ausgang. Input-mäßig ist es eh immer dasselbe: ein Input-Buffer der den Logik-Pegel vom Pin einliest. Hier mal 2 Beispiele VHDL(nur für die Output-Seite): Datenbus bidirektional, push-pull: my_databus <= data when rd_n = '0' else (others=>'Z'); I2C, Open-Drain am SDA: sda <= '0' when sda_intern = '0' else 'Z'; -- keine '1' !
Das genze ist eigentlich nur ein Trick. Bei sda<='0' wird der push-pull-treiber so getrieben, dass eben LO rauskommt - bei sda<='Z' wird der Aus-/Eingang nur auf Tristate geschaltet - ist bei den AVRs eigentlich das Gleiche. Übrigens muss man in der Entity dann sda : inout std_logic; verwenden.
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.