FPGA arbeitet als Bridge I2C in, out Problem [geschlossen]

Ich möchte I2C-Signale auf dem FPGA vom Cypress 2.0-Modul mit i2c-Pins wie unten verwenden. aber es funktioniert nicht gut. Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Xilinx FPGA <--------------------> MCU-Modul (I2c)

.UCF
NET in_scl LOC = "A1";
NET in_sda LOC = "A2";

NET out_scl LOC = "C1";
NET out_sda LOC = "C2";

und in verilog wie unten bin ich implementiert.

module top();

inout wire in_sda;
inout wire in_scl;

inout wire out_sda;
inout wire out_scl;


assign out_sda = in_sda;
assign out_scl = in_scl;



endmodule

Können Sie mir helfen, was fehlt mir?

Ist dies eine überarbeitete Version einer früheren Frage? Warum muss das FPGA überhaupt im System sein und nicht nur ein Kabel?
@ pjc50 Es gibt viele Gründe, warum Sie dies tun. aber nicht dieses Mal.
@Neil_UK Alles funktioniert für eine Definition von Arbeit . Wie soll ich an der Aussage "Es funktioniert nicht gut" erraten, was falsch ist? Hat es Feuer gefangen? Hat es überhaupt nicht kommuniziert? Hat das OP nicht die erwartete Übertragungsgeschwindigkeit erreicht?
"Unklar" ist dies nur, wenn die Person, die sich beschwert, so wenig Wissen über i2c und programmierbare Logik hat wie der Fragesteller. Für jeden mit wirklichem Bewusstsein ist die Art und Ursache des Fehlers sofort ersichtlich – weshalb diese Frage zwei Antworten erhielt.

Antworten (2)

Bei der I2C-Kommunikation werden Open-Collector-Treiber verwendet. Das Protokoll hängt von der Ebene auf der Leitung ab, die das 'Draht-ODER' aller Treiber ist.

Dies bedeutet, dass an einer lokalen Schnittstelle ein Pin niedrig sein kann, weil er von einem Remote-Treiber auf niedrig gezogen wird, oder weil er von selbst auf niedrig gezogen wird.

Offensichtlich muss jeder Puffer, der sich zwischen dieser Schnittstelle und den Remote-Schnittstellen befindet, in der Lage sein, zu unterscheiden, warum die Leitung niedrig ist. Wenn es niedrig ist, weil eine Fernbedienung es niedrig zieht, muss es auch niedrig ziehen, um dies zu übertragen. Wenn es niedrig ist, weil der lokale Fahrer es niedrig zieht, darf es nicht, sonst würde die Leitung niedrig stecken bleiben und es würde nichts mehr passieren.

Verschiedene Strategien werden von Anbietern von (zum Beispiel) Optokopplern verwendet, die für I2C entwickelt wurden. Ihr Ausgang zieht auf einen anderen Pegel als die typische lokale Schnittstelle, und Spannungssensoren können unterscheiden, welcher Treiber ihn niedrig zieht. Aber es ist alles ziemlich flockig und hängt von der "typischen" guten Leistung des lokalen Fahrers ab.

Da ein I2C-Bus für die Busverbindung ausgelegt ist, besteht die bei weitem beste Möglichkeit, das FPGA mit dem Bus zu verbinden, darin, einen Eingang und einen O/C-Treiber für jeden der beiden Pins zu implementieren und mit den beiden I2C-Busleitungen zu verbinden. Dadurch bleibt die direkte Verbindung aller bereits im Bus befindlichen Artikel erhalten. Die minimale Programmierung, damit das FPGA den Busverkehr nicht stört, besteht darin, die O/C-Ausgänge nicht anzusteuern. Um am Busverkehr teilnehmen zu können, ist ein I2C-Protokollstack im FPGA erforderlich.

Eine robuste Möglichkeit, den Pfad durch das FPGA zu durchbrechen , besteht darin, zwei I2C-Stacks im FPGA zu implementieren, von denen einer in jede Richtung weist, um Nachrichten weiterzuleiten. Obwohl dies eine ziemlich schwere Option erscheinen mag, sind I2C-Schnittstellen als vorgefertigte IP für FPGAs verfügbar, und es eliminiert die Unzuverlässigkeit beim Versuch, ein dummes Pass-Through zu implementieren.

I2C verwendet Open-Drain/Collector-Ausgänge. Aus diesem Grund kann man nicht einfach einen typischen FPGA-Ausgang mit Push-Pull-Struktur verwenden.

Ich weiß nicht, ob das von Ihnen verwendete FPGA Open-Drain-Ausgänge bietet.

Auf jeden Fall sollte es möglich sein, sie mit der folgenden Struktur (von hier entnommen ) nachzuahmen, Geben Sie hier die Bildbeschreibung eindie mit diesem Code abgeleitet werden kann:

always @(ENABLE)
if (ENABLE)
DOUT = 1'bZ;
else
DOUT = 1'b0;

Natürlich funktioniert diese Lösung nur in eine Richtung, aber ich denke, das ist Ihnen bewusst.

Danke, aber der Sensor muss die i2c-Signale erhalten und das i2c-Signal an das MCU-Modul senden. Dies bedeutet, dass das MCU-Modul den Sensor über FPGA liest und schreibt. es scheint also bidirektional benötigt zu werden.
Dann müssen Sie Ihren Code umschreiben. Oder haben Sie erwartet, dass der Eingang ein Ausgangssignal erzeugen würde?
Würdest du mir bitte helfen? Ich habe aktualisiert, aber ich denke, es sollte etwas anderes in meinem Code sein. aber ich bin mir nicht sicher.
Tut mir leid, dafür habe ich keine Zeit. Aber Sie können eine Reihe von Implementierungen im Netz finden ( faculty.lasierra.edu/~ehwang/digitaldesign/public/projects/DE2/… ).