Cómo obtener 1 pulsación de botón para generar 1 tic "activo" de acuerdo con un reloj

Antecedentes: soy un ingeniero de software con solo un poco de conocimiento de circuitos, todo informal, tratando de construir una calculadora binaria de suma y acarreo de 8 bits a partir de puertas lógicas básicas.

Pregunta: ¿Existen circuitos bien conocidos para hacer que presionar un botón (después de eliminar el rebote) solo active una señal durante exactamente un ciclo de reloj mientras se presiona? ¿Cómo se llaman para que pueda aprender más sobre ellos?

Contexto: tengo los botones "1", "0", "+" y "borrar" en mi calculadora, pero cuando los presiono, solo quiero que la salida de este circuito permanezca activa por un solo pero completo , ciclo de reloj (no puedo dejar que se mantenga alto ya que el reloj puede oscilar miles de veces mientras mantengo presionado el botón, y cada tic se trataría como si se presionara otro botón). Básicamente, 1 pulsación = 1 marca "activa". Tenga en cuenta que esto es después de eliminar el rebote del botón.

Hasta ahora tengo este circuito, que parece estar funcionando en Logisim:

esquemático

simular este circuito : esquema creado con CircuitLab

Trate el interruptor como si ya hubiera rebotado y el LED de la derecha como "salida". ¿Es esta la forma correcta de abordar este problema? ¿O estoy reinventando completamente la rueda? Esto suena como un problema de multivibrador monoestable, pero todos los ejemplos que he visto usan circuitos RC y envían pulsos en lugar de señales altas a tiempo con un reloj...

Me pregunto cómo se te ocurrió ese peculiar diseño DFF/JKFF con dos rutas de retroalimentación lógica. Es extraño e interesante, especialmente si funciona. Verifique mi respuesta para una solución alternativa. Como mínimo, debe agregar un sincronizador a la señal de entrada.
Este es literalmente uno de los tres diseños locos diferentes que se me ocurrieron usando una variedad de flip-flops (la mayoría de los cuales con dos bucles de retroalimentación). Esto es lo que sucede cuando literalmente no tiene una base sobre la cual comenzar y usar un solo FF tanto para la lógica como para la sincronización (aunque, para ser justos, en realidad funcionó en ambas cuentas, menos el raro problema de metaestabilidad que destacó a continuación).
Ojalá hubiera más preguntas como esta: acertijos de lógica digital bien pensados ​​y bien presentados. Ciertamente es un diseño extravagante. Parece el resultado de mezclar componentes hasta que hacen lo que usted quiere que hagan. Los FF en su diseño no logran la sincronización adecuada de CDC. Ambos reciben entradas asíncronas, por lo que cualquiera de ellos puede volverse metaestable.

Respuestas (1)

Aquí hay una solución de dominio digital. No hay un nombre para un componente que se ajuste a la función que describe, pero puede usar un sincronizador junto con una máquina de estado finito.

esquemático

simular este circuito : esquema creado con CircuitLab

Sincronizador

Primero, su dedo no está sincronizado con el reloj, por lo que se supone que el botón es una señal asíncrona. Si la entrada cambia cerca del reloj, podría violar los requisitos de configuración o tiempo de espera del DFF0. Esto puede hacer que la salida de DFF0 sea impredecible (metaestable), incluso en un nivel no lógico. Un DFF que se vuelve metaestable es como una moneda que cae de costado cuando la lanzas. Debería ser 0 o 1, pero en realidad, en casos excepcionales, no lo es.

El problema no es que el DFF enganche un nuevo valor 1 ciclo antes o después, el problema es que la salida puede fallar de un lado a otro antes de estabilizarse en un valor particular. Esto podría ser malo aguas abajo del diseño. En este caso, nuestro FSM puede generar un fallo o un pulso de dos ciclos de reloj, por ejemplo. La probabilidad de que ocurra la metaestabilidad suele ser bastante baja y depende de su DFF, la velocidad del reloj operativo, el voltaje de suministro, el ruido aleatorio y el momento preciso en que presiona el botón.

Este problema se denomina cruce de dominio de reloj (CDC) y requiere una técnica de sincronización. Un enfoque popular es solo dos DFF como el anterior. Esto agrega una latencia de dos ciclos de reloj a la señal de entrada, pero este retraso es trivial en su aplicación. El sincronizador no elimina el problema por completo, pero lo convierte en una posibilidad extremadamente baja. Los errores debidos a no abordar un CDC son notoriamente difíciles de depurar. Puede pasar 1000 pruebas y fallar la prueba 1001. Esto puede conducir a un seguimiento y depuración minuciosos para tratar de encontrar la fuente del error muy raro.

Si lo que está construyendo tiene una baja tolerancia a errores, debe usar un sincronizador. Puede usar uno como el anterior, o usar uno con tres DFF para una probabilidad de falla aún menor. De lo contrario, si puede tolerar un error ocasional, puede salirse con la suya con solo dos DFF y una puerta AND para todo su diseño.

El nivel de robustez en el diseño debe coincidir con su aplicación. Si está construyendo un circuito de misión crítica como un sistema de guía de cohetes, probablemente debería usar un sincronizador 3 DFF. Si está creando un producto de consumo con alta confiabilidad, opte por el sincronizador 2 DFF. Si es para un juguete de comida feliz de McDonald's, solo use un solo DFF. Un buen ingeniero eléctrico debe conocer los requisitos de MTBF para el diseño y calcular la probabilidad de falla permitida para el circuito del botón, la tasa de falla real de las opciones del sincronizador y elegir en consecuencia.

Máquina de estados finitos

Lo que quiere para su generador de pulsos es en realidad una máquina de estados finitos. Ya sea que sea un principiante completo o un profesional experimentado, siempre se recomienda comenzar con un diagrama de estado.

Empezamos en el estado A. Cuando la entrada cambia a 1, queremos la salida, y [ norte ] , para ser 1. Un ciclo de reloj más tarde, y [ norte ] debería volver a 0, por lo que debemos cambiar el estado a B para recordar no generar 1. Luego esperamos a que a [ norte ] ser 0 antes de que el estado vuelva a A. A partir de ahí empezamos desde el principio. Con la señal de entrada ahora sincronizada como a [ norte ] , podemos dibujar el diagrama en función de lo que queramos.

ingrese la descripción de la imagen aquí

Desde allí, debería poder pasar del diagrama de estado a una tabla de estado y luego a un circuito FSM. Solo necesita un DFF en su FSM para representar los dos estados. En el ejemplo anterior, el estado A y el estado B representan Q = 1 y Q = 0 respectivamente, pero puede obtener una FSM alternativa igualmente válida cambiando los dos estados. Si no es obvio cómo llegar al circuito FSM, siga algunos tutoriales sencillos de FSM hasta que lo domine.

La salida del FSM anterior será a [ norte ] a [ norte 1 ] ¯ . Esto significa que solo emite un pulso de 1 ciclo cuando hay una transición de 0 a 1 en la señal de entrada.

Una nota final es que si no puede tolerar errores durante el inicio, deberá agregar un reinicio a sus tres DFF. De lo contrario, se garantiza que el diseño anterior se estabilizará en la salida correcta después de tres ciclos de reloj después del encendido.

Duuuuuuuud Eso es exactamente lo que estaba buscando. El problema con mi diseño (aunque era funcional) era que fusionaba los dos componentes en uno con un bucle hacia atrás (que fue como "obtuve" un [n-1]) haciendo que las cosas fueran innecesariamente complejas. Sin embargo, mi única pregunta: ¿por qué se necesita el DFF medio? En mi cabeza, realmente no veo el propósito. Y traté de simularlo sin el DFF medio; parecía funcionar bien conectando su Q y QN directamente al primer DFF.
Claro, entiendo la necesidad de sincronizar el reloj (mi circuito original tenía dos FF solo para ese propósito). Y esto suena como un problema familiar. Entonces, ¿estoy en lo cierto en que está abordando la siguiente configuración de FF desencadenada por dos flancos ascendentes? 1. El usuario configura la entrada alta a la derecha cuando el reloj sube. 2. El primer FF sube (internamente) justo a tiempo, aunque, después de los retrasos de puerta involucrados, el reloj ahora está bajo (al menos para el otro FF). 3. El otro FF ve el reloj bajo e ignora la salida del primer FF. Puedo ver cómo eso sería un problema y el segundo FF lo resuelve.
Dicho esto, ¿ese tipo de condición de metaestabilidad es realmente un problema para este circuito en particular? Estoy tratando de minimizar partes, y no lo creo. Aunque ciertamente puedo entender por qué usar dos FF es una buena práctica para circuitos genéricos, en este caso particular, dado que podemos confiar razonablemente en que presionar un botón dure más que un tic de reloj (incluso para un reloj bastante lento), no lo hará que la metaestabilidad errónea sea resuelta por el próximo tick? Creo que mientras no enviemos accidentalmente dos señales altas, podemos darnos el lujo de descartar una si finalmente se envía con el siguiente tick.
@ ox24a537r9, agregué muchos detalles a la respuesta, por lo que debería responder todas sus preguntas. Pensé que la respuesta original era algo así como puf aquí hay un circuito mágico que funciona, así que quería explicarlo para que puedan ver cómo hacer lo que hice.
Eso es genial. Tantas cosas buenas, especialmente con la explicación de la metaestabilidad. ¡Gracias!
La metaestabilidad puede acercarse sigilosamente a usted de muchas maneras, una vez construimos un sincronizador/marcador de tiempo que generaba marcas de tiempo GPS a partir de un marcador de evento de escáner láser y luego lo enviaba a una PC... si los tres relojes difieren en 10 ppm, y asumimos relojes de 1 MHz, luego, los bordes del reloj de cada uno se deslizarán lentamente entre sí. Usamos flip flops doble D para evitar la metaestabilidad. Hicimos una modificación temporal en el EPLD para marcar los casos metaestables en el primer D FF, y vimos algunos eventos de la hora más o menos que vimos.
También he usado chips codificadores ópticos estándar, que parecían tener un solo sincronizador D FF. Creemos que vimos algunos errores de tipo metaestable con largas longitudes de cable del codificador, que estamos razonablemente seguros de que desaparecieron al agregar un schmitt disparo en la entrada. (funcionó en el banco de pruebas, simulamos los pulsos usando generadores de señales que coincidían con los tiempos de subida, así que básicamente contó +1, -1,+1,-1, el chip codificador siempre leerá 0 o 1, si se desvía de allí ocurrió un evento metaestable.