¿Por qué no puedo implementar un divisor de frecuencia usando un mux de esta manera?

1

Encontré una pregunta de entrevista interesante para el ingeniero de FPGA en línea: Implementar un contador con Mux , así que decidí intentar hacer eso. Intenté mantenerlo simple y así implementar un contador con dos bits, para que solo pueda contar hasta 3 y luego reiniciar.

Llegué a la conclusión de que necesito 3 multiplexores, dos para cada bit, y el otro para que sirva como divisor de frecuencia para el reloj ( Estoy seguro de que hay otras ideas, me encantaría escucharlas como bien ). Tenga en cuenta que quería que este divisor de frecuencia funcionara en el borde descendente del reloj.

Básicamente esto es lo que intenté hacer:

simular este circuito : esquema creado usando CircuitLab

Usé un reloj de 1Hz solo para que no sea demasiado rápido (aunque quizás no importa), siendo mux1 el divisor de frecuencia.

La idea aquí es que el contador es así:

Q1 Q0
0  0
0  1
1  0
1  1

Entonces, como Q0 cambia con cada borde del reloj, conecté el reloj a mux3 . Como Q1 alterna cada dos relojes, intenté diseñar un divisor de frecuencia que me asegure de que Q1 alternará cada dos relojes (clk1) flancos descendentes .

Pensé que funcionaría bien, pero en una simulación ( usé Multisim para eso , porque no sé cómo simularlo, circuitlab, me encantaría que me mostraras cómo puedo hacer eso), obtuve un resultado muy extraño: la simulación se detuvo. Aquí es cómo se veía ( la salida de mux1 ):

Cuandomeacerquéalbordedescendente(a500ms),seveíaasí:

Así que mis preguntas son:

  1. ¿Por qué no funciona mi divisor de frecuencia?
  2. ¿Es esta implementación de un contador incluso buena, si ese divisor de frecuencia funcionó? ¿Es esto posible?
pregunta Eran

1 respuesta

1

Piense en lo que hace cada parte de su circuito.

MUX3

Todo lo que está haciendo es decir si CLK1 es alto, entonces la salida 1. Si CLK1 es bajo, salida 0. ¿Cuál es el propósito de este mux? Simplemente MUX3 = CLK1

MUX2

Nuevamente, si MUX1 es alto, salida 0, si MUX1 es bajo, salida 1. Entonces, básicamente, MUX2 = !MUX1

MUX1

¿Qué sucede, por ejemplo, cuando CLK1 es bajo? Selecciona In0 de MUX1 . In0 es simplemente el inverso de la salida de MUX1 .

En otras palabras, MUX1 = !MUX1 : has creado un oscilador que alternará en cualquiera que sea el retardo de propagación de la puerta no. Los bucles de inversores no controlados como estos casi nunca son una buena idea.

¿Qué sucede si CLK1 es alto? Bueno, obtienes MUX1 = MUX1 , así que básicamente la salida mantendrá el estado que tenía anteriormente.

Creo que la teoría de la pregunta de la entrevista radica en el hecho de que un MUX de 2 entradas está funcionalmente completo, puedes usar múltiples muxes para hacer cualquier puerta lógica.

Uno de ellos es que un mux puede configurarse como una puerta AND con una entrada invertida simplemente atando el pin IN1 a GND. Luego, simplemente puede usar dos de estos para crear un pestillo S-R.

Una vez que tienes un pestillo S-R es muy fácil crear registros y luego contadores.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas