Ich habe einen einzigen externen I2C-Bus (SDA- und SCL-Pins). Dies wird derzeit von einem IP-Core eines Drittanbieters gesteuert, der "implizite" Inout-Ports in der MPD bereitstellt, insbesondere:
PORT IIC_DATA = "", DIR = IO, THREE_STATE=TRUE
PORT IIC_CLOCK = "", DIR = O, THREE_STATE=TRUE
Ich bin in eine Situation geraten, in der ich unabhängig vom IP-Core mit einem Gerät auf diesem Bus sprechen möchte (zu einem Zeitpunkt, an dem der IP-Core selbst zurückgesetzt werden kann, damit ich weiß, dass er nicht stören kann). Ich habe versucht, einen separaten axi_iic
Master zu erstellen und ihn an dieselben externen Ports anzuschließen, aber das funktioniert nicht, da es sich über mehrere miteinander verbundene Ausgangstreiber aufregt.
Ich denke also, ich brauche einen einfachen I2C-Multiplexer als Glue-Logik zwischen den beiden Mastern, und ich glaube, ich weiß, wie das in Bezug auf die internen _I
, _O
, _T
Signale jedes Masters geht, aber ich bin mir nicht sicher, wie ich diese "extrahieren" soll interne Signale für den vorhandenen Kern, wenn die MPD oben gegeben ist (sie sind in der zugrunde liegenden VHDL vorhanden).
Im Moment habe ich die MPD-Datei nur manuell modifiziert, um diese Signale freizulegen, aber ich habe mich gefragt, ob es einen besseren Weg gibt, dies zu tun (entweder an die Signale heranzukommen, ohne die MPD-Datei zu ändern, oder das ganze I2C-Multi-Master-Ding zu machen ); Während die manuelle Bearbeitung funktioniert, können die Änderungen an der MPD-Datei verloren gehen, wenn der Kern aktualisiert wird, sodass sie fehleranfällig ist.
Eine andere Lösung, die ich in Betracht gezogen habe (aber ich bin mir nicht sicher, ob sie mir gefällt, obwohl es immer noch möglich ist, da die FPGA-Pinbelegung noch nicht endgültig ist), besteht darin, den externen Bus doppelt zu routen (so dass der externe SDA zu zwei separaten FPGAs geht). Stifte, einen für den Drittanbieterkern und einen für den neuen Kern). Das scheint zwar ziemlich hässlich und verschwenderisch, aber dann bin ich kein Experte. :)
Nur der Vollständigkeit halber (da ich kürzlich an diese Frage erinnert wurde) werde ich die Antwort wiederholen, für die ich mich schließlich entschieden habe:
Angesichts des folgenden MPD-Snippets, das vom Core-Anbieter bereitgestellt wird:
PORT IIC_DATA = "", DIR = IO, THREE_STATE=TRUE
PORT IIC_CLOCK = "", DIR = O, THREE_STATE=TRUE
Ich ersetze es durch Folgendes:
PORT IIC_DATA_I = "", DIR = I
PORT IIC_DATA_O = "", DIR = O
PORT IIC_DATA_T = "", DIR = O
PORT IIC_DATA = "", DIR = IO, THREE_STATE=TRUE, TRI_I = IIC_DATA_I, TRI_O = IIC_DATA_O, TRI_T = IIC_DATA_T
PORT IIC_CLOCK_O = "", DIR = O
PORT IIC_CLOCK_T = "", DIR = O
PORT IIC_CLOCK = "", DIR = O, THREE_STATE=TRUE, TRI_O = IIC_CLOCK_O, TRI_T = IIC_CLOCK_T
Dies funktioniert gut (da die zugrunde liegenden Signale sowieso in der VHDL definiert wurden). Es ist ein bisschen mühsam, da ich daran denken muss, dies jedes Mal zu tun, wenn ich einen aktualisierten Kern vom Anbieter erhalte, aber das ist selten genug, um keine große Sache zu sein. (Ich habe versucht, den Verkäufer davon zu überzeugen, es selbst hinzuzufügen, hatte aber bisher nicht viel Glück.)
Wenn Sie das Problem nicht intern im FPGA lösen können, verwenden Sie externe Übertragungsgatter, um zwei Master auf einen externen Bus zu leiten.
Platzhalter
Miral
Miral
Platzhalter
Wouter van Ooijen
Miral