Tengo un único bus I2C externo (pines SDA y SCL). Esto es actualmente controlado por un núcleo IP de terceros que proporcionó puertos de entrada "implícitos" en el MPD, específicamente:
PORT IIC_DATA = "", DIR = IO, THREE_STATE=TRUE
PORT IIC_CLOCK = "", DIR = O, THREE_STATE=TRUE
Me he encontrado con una situación en la que quiero ser capaz de hablar con un dispositivo en ese bus independientemente del núcleo IP (en un momento en el que el propio núcleo IP puede mantenerse en reset para saber que no puede interferir). He tratado de crear un axi_iic
maestro y conectarlo a los mismos puertos externos, pero esto no funciona ya que se molesta por los múltiples controladores de salida conectados juntos.
Así que creo que necesito un simple multiplexor I2C como lógica de cola entre los dos maestros, y creo que sé cómo hacerlo en términos de la interna _I
, _O
, _T
señales de cada maestro, pero no estoy seguro de cómo "extraer" esas señales internas para el núcleo existente dado el MPD anterior (ellos son presente en el VHDL subyacente).
Por el momento sólo he modificado manualmente el archivo MPD para exponer estas señales, pero me preguntaba si hay una mejor manera de hacer esto (ya sea llegar a las señales sin cambiar el archivo MPD, o hacer toda la cosa I2C multi-master); mientras que la edición manual es viable, los cambios en el archivo MPD puede perderse cuando el núcleo se actualiza, por lo que es propenso a errores.
Otra solución que he considerado (pero no estoy seguro de que me guste, aunque todavía es posible ya que el pinout de la FPGA no es definitivo todavía) es hacer un doble enrutamiento del bus externo (de modo que el SDA externo va a dos pines separados de la FPGA, uno para el núcleo de terceros y otro para el nuevo núcleo). Esto parece bastante feo y derrochador, pero no soy un experto :)