Problemas al implementar un contador ascendente/descendente

Estoy tratando de entender cómo implementar un contador de ondas binarias arriba/abajo. Básicamente, tengo un montón de D-flipflops y conecto clk del siguiente flipflop a ether Q o Q'.

Entonces, si quiero cambiar la dirección de conteo, simplemente cambio todos los multiplexores clk entre Q y Q', y el contador comienza a contar en la dirección opuesta.

Sin embargo, el problema es que cuando cambio las entradas entre Q y Q, los flip-flops cuentan 1, por lo que mi contador cuenta desde un número diferente.

Es decir, no puedo tener algo como: 0->1->2->3(cambio de dirección)->2->1->0, se vuelve como 0->1->2->3(cambio de dirección)-> c->b->a->9...

¿Qué me estoy perdiendo?

Respuestas (2)

Los puntos clave son:

  • Asegúrese de que, después de la activación, el nuevo arreglo tenga sentido lógico. es decir, ¿por qué debería contar ABAJO ahora? Si no sigue la lógica de lo que cree que debería hacer, entonces no puede sorprenderse demasiado si no está de acuerdo con usted :-)

  • Cambie siempre en un estado "neutro". Asegúrese de que las líneas de reloj u otras líneas relevantes para el estado estén en una condición antes y después del cambio que no provoque un cambio de estado transitorio.


Un circuito "funcional" desde aquí

ingrese la descripción de la imagen aquí

Una herramienta maravillosa (y gratuita)

Logisim: una herramienta educativa para diseñar y simular circuitos lógicos digitales

Ellos dicen:

  • Logisim es una herramienta educativa para diseñar y simular circuitos lógicos digitales. Con su sencilla interfaz de barra de herramientas y la simulación de circuitos a medida que los construye, es lo suficientemente simple como para facilitar el aprendizaje de los conceptos más básicos relacionados con los circuitos lógicos. Con la capacidad de construir circuitos más grandes a partir de subcircuitos más pequeños y de dibujar haces de cables con solo arrastrar el mouse, Logisim se puede usar (y se usa) para diseñar y simular CPU completas con fines educativos.
Gracias, el problema parecía ser que los contadores asíncronos no se pueden implementar tan fácilmente :-)

Si desea un contador de ondulación que cuente bidireccionalmente, es posible implementar un contador de código gris de entrada en cuadratura bidireccional utilizando pestillos totalmente sensibles al nivel. Los dos bits superiores de una etapa pueden alimentar la siguiente etapa. Incluso si una de las entradas se vuelve metaestable por un tiempo, el contador se comportará siempre que la entrada metaestable se estabilice antes de que cambie la otra entrada.

Doh, sí, aparentemente es un poco más complicado de lo que pensaba :-)
@BarsMonster: me gusta más el diseño de un contador de código gris de cuadratura bidireccional, aunque otro enfoque es simplemente tener un par de contadores de ondulación, uno que cuenta pulsos "ascendentes" y otro que cuenta pulsos "abajo". Tratar de diseñar un contador de ondulación asíncrono normal que pueda manejar eventos "arriba" y "abajo" asíncronos es problemático porque los eventos "arriba" y "abajo" casi simultáneos deberían cancelarse, pero es difícil garantizar que lo hagan.
Bueno, en mi caso, solo puedo usar un puñado de puertas NAND, por lo que las cosas complejas suenan aterradoras. En mi caso, puedo estar seguro de que los pulsos de subida y bajada tienen intervalos de tiempo suficientes entre ellos para que toda la lógica se asiente.