Conectar correctamente a una señal bidireccional

3

Background

Estoy diseñando una interfaz en VHDL que se conecta a una señal bidireccional. Sin embargo, mi experiencia en la dinámica del diseño de hardware es limitada. Lo que tengo en este momento es el siguiente:

DentrodelcuadrorojoestáloqueestáenelFPGA,fueradeesohaycomponenteseléctricos.

ElmóduloRXbuscaunaseñalBAJAparaunbitdeinicio.ParaevitarlainterferenciaentreelmóduloTXyelmóduloRX:coloquéunMuxcontroladoporelmóduloTXparapasarloaALTOcuandoestétransmitiendo.

ElcircuitoexternogarantizaquemiTXnuncaconduzcalalíneaALTAparaevitarcortocircuitos.

Elproblema

CuandolosmódulosRXyTXestánseparados,funcionanperfectamente.ElRXrecibeyleelaseñalcorrectamenteyelTXsetransmite(noenlalíneabidireccional;ensulugar,miosciloscopio)perfectamente.Sinembargo,cerrarelinterruptorparacombinarlosdosesunacatástrofe.ElmóduloRXparecequedejaderesponder.

Lapregunta

Noestoysegurodesisetratadeunproblemadediseñogeneral,oalgopequeñoyestúpidoconmiVHDL.

Entonces,¿esesteunmétodoaceptableparainteractuarconunaseñalbidireccional?Tengolasensacióndequehayalgomuymalenmiconfiguración.Soloestoybuscandosugerencias,críticasoideasgenerales.

Siestaesrealmenteunaconfiguracióncorrecta,almenospuedotenerconfianzaenlainvestigacióndelVHDLparaelproblema,ysaberquemisesfuerzosnoseránenvanodebidoaundiseñogeneralinherentementedefectuoso.

AlbuscarenGoogle:"Conectarse a un bus bidireccional" parece sugerir buffers de tres estados. ¿Es este un mejor enfoque?

Extra

Me siento molesto por molestarles constantemente debido a la falta de comprensión conceptual, por lo que si pudiera obtener una sugerencia sobre libros o varias fuentes de investigación para diseñar hardware conceptualmente, sería fantástico.

    
pregunta Nick Williams

1 respuesta

3

Tristate es lo que quieres. O bien, como tiene una resistencia de pull-up externa, una unidad open-drain . También verá que open-colector significa lo mismo; depende del estilo de los transistores utilizados, pero la idea fundamental es la misma. ISO9141 (diagnóstico automotriz) funciona de esta manera, por ejemplo.

El drenaje abierto significa que el pin del conductor solo puede bajar la señal externa, pero no puede conducirla a un nivel alto. La resistencia permitirá que la línea "flote" suavemente hacia arriba. También significa que múltiples dispositivos pueden controlar la línea de comunicación, por lo que debe asegurarse (por ejemplo, a través de un protocolo de nivel superior o un canal lateral) que solo un dispositivo chatee a la vez.

Para implementar esto en VHDL:

En tu entity necesitas un pin:

TxRx_pin : inout std_logic;

y en el architecture dos señales:

signal tx_sig, rx_sig : std_logic;

Conectalos de esta manera:

TxRx_pin <= '0' when tx_sig = '0' else 'Z';
rx_sig <= to_X01(TxRx_pin);

La primera línea copia 0 s del transmisor en el pin, pero no controla 1 s, sino que utiliza el estado Z que significa "desconectado", lo que permite que la resistencia externa levante la línea .

La segunda línea garantiza que todo lo que aparece en el pin se copia en rx_sig . El motivo de la llamada to_X01 es hacer que funcionen las simulaciones. En su banco de pruebas, la resistencia de pullup se modela al colocar un H (llamado llamado pullup débil) en la señal TxRx:

TxRx_sig <= 'H';

Su lógica FPGA no buscará H s (en simulación), por lo que no funcionará correctamente: la función to_X01 convierte de H a 1 (entre otras cosas que no son relevantes para esta situación).

Por cierto, no es necesario que un mux apague la recepción para tener un diseño funcional, pero es posible que desee mantenerla para no ver los datos que está transmitiendo.

    
respondido por el Martin Thompson

Lea otras preguntas en las etiquetas