Implementación de contador de programa de 8 bits

Estoy tratando de construir un contador de programa de 8 bits en Logisim. Actualmente tiene funciones LOAD, lo que hace que la entrada de 8 Bits (A0-A7) aparezca en la salida (S0-S7) en el pulso del reloj:

Cargando 1 como entrada:CARGA 1

1 cargado/almacenado con éxito:CARGA 2

Cuando LOAD es alto, A0-A7 se ejecuta a través del sumador completo, que técnicamente se usa; solo agrega 0, por lo que no afecta la salida.

Ahora también estoy tratando de implementar un INC (incremento), que cuando sea alto básicamente solo agregará 1, pero tomará el valor del registro actual como entrada, en lugar de A0-A7. Aquí está la lógica que fluye en la simulación, que es exactamente lo que quiero (he marcado con un círculo el valor que entra en el registro, que es 2 - perfecto):Cª

Sin embargo, ahora, cuando trato de almacenar este valor en el registro pulsando el reloj, aparece un error de "oscilación detectada" en Logisim:ERROR

Esta es la primera vez que intento construir esto, entonces, ¿hay algo intrínsecamente incorrecto con mi implementación, o me estoy perdiendo algo pequeño que debería hacer que funcione como se esperaba?

¿Puedes poner algunas etiquetas en tus entradas/salidas para el sumador completo y mux? Sospecho que está obteniendo una dependencia circular en el sentido de que el sumador está tratando de agregar 1 a la salida del registro, que presenta al sumador nuevas entradas a través del mux, ¡pero es difícil saberlo sin etiquetas!
¿Tienes alguna documentación sobre ese "registro"? Solo puedo ver algún tipo de problema allí si a) es un registro transparente (las salidas siguen a las entradas siempre que el "reloj" esté alto) o b) el simulador no puede calcular ese ciclo aunque no sea una situación inválida del mundo real.
@ srl100 Por supuesto, se me olvidó por completo. Ahora actualizado!
@RaphaelP Una abstracción del registro sería: Salida = Entrada cuando LOAD es alto Y CLK es pulsado. La salida se almacena/permanece en todos los demás estados, independientemente de las entradas.
¿Este registro tiene algún atributo/propiedad que cambie la forma en que se comporta?
No es asi. Sin embargo, si mantengo CLK y LOAD altos, luego cambio la entrada, se refleja directamente en la salida. ¿Debería ser este el caso solo una vez por pulso (flanco ascendente) en lugar de consistentemente cuando CLK es alto?
Si los documentos de su registro son estos cburch.com/logisim/docs/2.3.0/libs/mem/register.html Entonces querrá verificar si "Trigger" no está configurado en "nivel alto". @ su último comentario: ese es exactamente el problema. Si no puede cambiar ese comportamiento, tendrá que cambiar un poco el circuito.
De hecho, yo mismo diseñé las chanclas tipo D, que ahora me doy cuenta de que actúan como "de alto nivel", en lugar de "activadas por el borde ascendente". Esto solo crea un ciclo de conteo infinito, de ahí el error de "oscilación". Muchas gracias por la información, ni siquiera había considerado esto. Feliz de aceptar como respuesta si desea publicarlo.
¿Sabía que puede agrupar hasta 32 cables en un solo cable en Logisim? Hace que el esquema sea menos desordenado.
@immibis Sí, este diagrama fue solo para un poco más de claridad. ¡Saludos por la punta sin embargo!

Respuestas (1)

Su registro está propagando su salida en función del nivel de "reloj" y no de su transición (también conocido como registro transparente), lo que está creando un bucle inestable. Para que ese circuito funcione, tendrías que:

  • Cambie esa parte a un registro que cambie sus salidas solo en la transición del reloj de bajo a alto.

o

  • Agregue un segundo registro después del primero que esté cronometrado en forma inversa al reloj del primero. Al hacerlo, su circuito aún necesita 1 reloj para enviar los cambios al bus, pero lo hace en dos pasos, evitando que la salida cambiante del registro afecte su propia entrada.