Hallo zusammen,
ich habe in meinem VHDL Modul einen I2C Slave verbaut. Dieser kann Daten
empfangen und senden.
In meiner Top-Testbench habe ich einen I2C Master eingebunden, der den
I2C Slave ansprechen soll. Leider hat der den Nachteil/die dumme
Angewohnheit, dass er die Leitungen nur auf '0' treiben kann und
ansonsten SCL und SDA auf 'Z' legt.
Mit einem 'Z' kann mein I2C Slave nur leider nicht anfangen.
Da sowohl Slave, als auch Master hier im Uninetzwerk im Bibliotheken
vorliegen, kann ich diese auch nicht ändern. Ein Änderungsvorschlag habe
ich schon gemacht, der wird gerade geprüft.
SDA ist ein Port vom Typ INOUT.
Ich habe also in meinem VHDL Modul eine Art Buffer verbaut, der für SDA
die Umschaltung vornimmt. Er schaltet also SDA_IN und SDA_OUT mit einem
OEN Pin um und damit auf dem INOU Port meines Top-Moduls.
Nun muss ich mir was einfallen lassen, wie ich den "Fehler" mit dem
Zustand 'Z' behandeln soll.
Wenn ich es so versuche:
1 | SCL_IN_SLAVE <= '1' when SCL_IN_MASTER = 'Z' else SCL_IN_MASTER ;
|
2 | SDA_IN_SLAVE <= '1' when SDA_IN_MASTER = 'Z' else SDA_IN_MASTER ;
|
klappt es zwar für SCL, denn der ist unidirektional, aber nicht für SDA.
Sobald der Slave versucht die Daten auf '0' zu ziehen, gibt es ein 'X',
weil dann SDA_IN_SLAVE und SDA_IN_MASTER gegeneinander treiben.
Gibt es eine Möglichkeit, wie ich die bidirektionalen Daten sicher
umschalten kann?
Vielen Dank!
Ralf