Tengo un solo bus I2C externo (pines SDA y SCL). Esto actualmente está 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 poder hablar con un dispositivo en ese bus independientemente del núcleo de IP (en un momento en que el propio IP se puede restablecer para que sepa que no puede interferir) . He intentado crear un axi_iic
master por separado y conectarlo a los mismos puertos externos, pero esto no funciona porque se molesta por los múltiples controladores de salida conectados.
Así que creo que necesito un multiplexor I2C simple como lógica de cola entre los dos maestros, y creo que sé cómo hacerlo en términos de _I
interno, _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 ( están presentes en el VHDL subyacente).
Por el momento, acabo de modificar manualmente el archivo MPD para exponer estas señales, pero me preguntaba si hay una mejor manera de hacerlo (ya sea llegar a las señales sin cambiar el archivo MPD o hacer todo el I2C multi -la cosa del maestro); Si bien la edición manual es viable, los cambios en el archivo MPD pueden perderse cuando se actualiza el núcleo, por lo que es propenso a errores.
Otra solución que he considerado (pero no estoy seguro de si me gusta, aunque todavía es posible porque el pinout del FPGA aún no es definitivo) es enrutar el bus externo (así que el SDA externo va a dos pines FPGA separados, uno para el núcleo de terceros y otro para el nuevo núcleo). Sin embargo, esto parece bastante feo y derrochador, pero entonces no soy un experto. :)