Valor de bus si algunos pines están flotando

Estoy trabajando en un complemento para el software de simulación (solo IC digital).
Por ejemplo, hay un bus de 8 bits.
El usuario quiere leer su valor. En el lado del complemento, compruebo el estado de cada pin. Puede ser 1, 0 o indefinido. Por el momento, si al menos un bit está flotando, devuelvo cero como valor de bus. ¿Es correcto en absoluto? ¿Puede ser un mejor valor de retorno reemplazar los bits flotantes con aleatorios [1-0] y advertir al usuario en el registro al respecto?

Si el usuario no ha habilitado las resistencias pull-up/pull-down internas que están presentes en algunos dispositivos, esta implementación depende de usted. Si fuera yo, probablemente devolvería el estado indefinido o un valor aleatorio como sugirió, ya que no hay forma de saber el estado de este pin en el momento de la muestra.

Respuestas (3)

Lo siento, pero no tienes suerte. No existe una forma obvia de saber si una entrada digital está flotando. Los receptores de bus no pueden saber si un nivel de voltaje de entrada determinado se produce porque un controlador lo desea o si es porque no hay un controlador de entrada. Todo lo que sabe es que la entrada es más alta (1 lógico) o más baja (0 lógico) que el voltaje de umbral del receptor.

Ciertamente es posible construir un circuito de este tipo:

esquemático

simular este circuito : esquema creado con CircuitLab

En este caso, Vth es el voltaje de umbral lógico nominal y R4 es una resistencia más grande. R1/R2/R3 establece los límites de error superior e inferior para el voltaje de entrada.

En funcionamiento, un alto o bajo válido en la entrada la llevará por encima o por debajo de los puntos de ajuste del comparador, y ambos comparadores leerán alto o bajo. Esto establece la salida XOR en un nivel bajo, lo que indica que la salida es buena. Si la entrada se deja flotante, R4 lleva la entrada a un valor intermedio, y un comparador sube mientras que el otro baja, y la salida XOR se eleva, lo que indica una entrada flotante.

No hace falta decir que dudo mucho que sus entradas digitales se vean así.

El problema es que puedo estar seguro de que el pin está flotando porque depende del simulador decidir si el pin flota o no. Se dice que este es un valor indefinido. Pero tengo que ponerle valor a algo. Por ejemplo, tomé la CPU Z80 e hice un circuito simple, solo lo encendí y apagué varias veces. El bus de direcciones siempre fue el mismo, aunque su valor no está definido desde el principio. Entonces, ¿es mejor reemplazar los flotadores con aleatorios, pero no nulos? Lo siento por mi ingles
Si usara este circuito en la práctica, obtendría un pulso corto "no válido" en cada transición HL y LH. Podría poner rebote en la señal inválida, pero incluso entonces sería un truco masivo.
@nitro2k01 - Oh, sí. Es solo uno de una serie de detalles de implementación del mundo real por los que no quería molestar al OP. Y "truco masivo" resume bastante bien mis sentimientos. Eso no quiere decir que nunca haya hecho ninguno, solo que este no parece valer el tiempo y el esfuerzo.
@pugnator: eso depende de lo que haga el circuito simulado con los datos del bus. En el caso de un Z80, por ejemplo, creo que un 00 hexadecimal no es operativo, por lo que sería bueno inicializarlo si el circuito simulado realmente opera en los datos del bus. Por otro lado, si el circuito simulado en realidad no hace nada con los datos del bus, entonces un valor aleatorio no dañará nada. Todo depende de las consecuencias de tu elección. No conozco los detalles de su simulación, así que no puedo darle una respuesta definitiva. Lo siento.
@WhatRoughBeast Roger eso. Pensé en señalarlo en caso de que alguien, en algún lugar, piense que esto es realmente una buena idea.

En la mayoría de los programas de simulación, la visualización de los datos del bus depende de la representación numérica que se utilice. La regla general es que si alguno de los bits que afectan a un dígito de visualización en particular no está definido, ese dígito se muestra como una 'X'.

Cuando la pantalla está en binario, octal o hexadecimal, el número resultante puede tener dígitos válidos con 'X' entre ellos, porque cada bit solo puede afectar a un dígito. Pero si la pantalla está en decimal, cada dígito de la pantalla puede verse afectado por cualquiera de los bits, por lo que si alguno de los bits no está definido, el valor completo del bus se muestra como 'XXXXXX'.

Muchas gracias por la sugerencia, pero no muestro valores. Solo leo los pines como valores tristate y la pregunta es cómo interpretarlo como un valor para llenar el registro correspondiente

Se observó un efecto casi fantasmal en las computadoras de la década de 1980 con direcciones multiplexadas/buses de datos: la lectura de direcciones donde no había ningún dispositivo tendía a dar lo que parecía una tabla ASCII en un depurador. Lo que probablemente sucedió realmente fue que leyó la carga capacitiva restante de las escrituras de dirección... factible si hubiera dispositivos MOS en el extremo de lectura.

En la práctica, depende del dispositivo de lectura y de lo que pueda interferir con el cableado: casi todos los dispositivos TTL-ish tratarán una entrada flotante como un 1 sólido si no hay una resistencia pulldown y una falta de interferencia severa. Las entradas CMOS sin un pulldown o pullup le darán cualquier carga capacitiva que tenga almacenada el cableado, si hay una gran falta de interferencia; muchas veces, las entradas CMOS flotantes le darán un reloj de 50/60Hz.