Forum: FPGA, VHDL & Co. Xilinx IOs als open-collector


von Hartmut (Gast)


Lesenswert?

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

von FPGA-User (Gast)


Lesenswert?

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

von Thomas Pototschnig (Gast)


Lesenswert?

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