¿Recurso fácil para aprender a resolver problemas de contador?

¿Alguien podría señalarme alguna dirección sobre dónde puedo aprender a resolver problemas simples de contador como contar en una secuencia dada usando un flip-flop dado? Por ejemplo:

Cree un contador contando en una secuencia 3-1-4-7-2 y nuevamente desde el principio usando los flip-flops tipo D

No estoy pidiendo ayuda en este problema en particular, sino que sería genial saber cómo resolver este tipo de problemas. Sé cómo diseñar contadores en serie para contar de n a n+k o al revés, pero ¿cómo hacer esto?

Respuestas (2)

Piense en su contador especial como una máquina de estado. Luego asigne al estado el valor codificado de la secuencia de conteo que desee. En este caso, los estados serían los siguientes y se mostraría el siguiente estado.

Estado Estado siguiente
  3 -> 1
  1 -> 4
  4 -> 7
  7 -> 2
  2 -> 3

Cada estado se puede codificar en tres bits binarios, por lo que su diseño requerirá tres flip-flops tipo D. Debe crear un conjunto de tres mapas de Karnough, uno para cada flip-flop que muestre el siguiente valor de bit para el flop flop (entrada D) en función de los tres estados actuales (salidas Q).

Utilice los k-maps para simplificar la lógica hasta el mínimo necesario. Finalmente, puede codificar la lógica mínima en una serie de compuertas AND que conducen compuertas OR en cada entrada FF D.

Aquí muestro el mapa k para el bit ordenado más bajo del "contador" para que comiences con la idea.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

¡Vaya, eso es increíblemente informativo y fácil de expresar! ¡Muchas gracias, lo entiendo! :)

La idea básica en este tipo de problemas es que sus flip-flops D representan su estado y necesita crear alguna lógica combinacional que tome como entrada el estado actual y genere como salida el siguiente estado.

Así que primero creas la tabla de verdad:

  input      output
D2 D1 D0 | D2' D1' D0'
 0  0  0 |  *   *   *    # actually, don't care is not quite right, see below
 0  0  1 |  1   0   0    # 1 -> 4
 0  1  0 |  0   1   1    # 2 -> 3
 0  1  1 |  0   0   1    # 3 -> 1
 1  0  0 |  1   1   1    # 4 -> 7
 1  0  1 |  *   *   *    # not quite right, see below
 1  1  0 |  *   *   *    # not quite right, see below
 1  1  1 |  0   1   0    # 7 -> 2

Así que ahora tiene tres funciones ( D2', D1'y D0') para las que debe crear una lógica combinacional. Lo cual puedes hacer con un mapa de Karnaugh o cualquier otra cosa que tengas a tu disposición. (Por ejemplo, puede obtener una copia del minimizador lógico Espresso . El código fuente está en github . Hay varias versiones precompiladas disponibles si busca en Google).

Inicialización

En la tabla de verdad anterior, dije que no importa "no del todo bien". He aquí por qué: cuando enciende por primera vez la alimentación en su circuito, los flip-flops D aparecerán en algún estado aleatorio. Por lo tanto, debe asegurarse de que su circuito de alguna manera entre en un estado razonable. Una forma de hacer esto es asegurarse de que alguna otra parte de su circuito afirme las líneas de configuración/reinicio correctas en sus flip-flops poco después del inicio (y tenga en cuenta que 000 no esun estado válido en este caso.) Otra forma de hacerlo es asegurarse de que los estados "no importa" en realidad (eventualmente) conduzcan a estados válidos. (Esto también hace que su circuito sea más resistente a los errores transitorios). Así que asegúrese de que el estado 000 no haga la transición al estado 000 (o más perversamente, que no tenga transiciones que ciclen entre estados no válidos, como 000->101 ->000.) Si su minimización lógica usa el don't cares para crear ciclos, puede romper estos ciclos reemplazando el don't cares con estados válidos.

Algunos recursos para ayudarlo a explorar más:

Preguntas anteriores de electronics.stackexchange sobre temas similares: