El contador de cuadratura en FPGA se está escapando

Estoy intentando contar pulsos de un codificador de cuadratura en un FPGA Altera. Creo que tengo mi contador configurado correctamente (diagrama de circuito a continuación, siguiendo este tutorial ), pero cuando enciendo mi codificador, el conteo comienza a aumentar sin parar. Cuando giro el codificador en un sentido, el conteo se acelera, y cuando lo giro en el otro sentido, se ralentiza, por lo que parece que de hecho estoy contando pulsos, pero también contando hacia adelante. ¿Alguien sabe por qué puede ser esto?

esquemático

simular este circuito : esquema creado con CircuitLab

Las señales count clocky count directionvan a una función de contador integrada de 32 bits ( LPM_COUNTER) en mi Altera FPGA programada con Quartus II v9.0. La salida de este contador se almacena en un búfer ( LPM_BUSTRI) y se lee usando un programa de LabVIEW siempre que el código de LabVIEW lo necesite. Tengo un código de LabVIEW similar que lee otros búferes de la FPGA que funciona bien, por lo que estoy bastante seguro de que el problema radica en alguna parte de mi FPGA.

¡Tu ayuda es muy apreciada!

EDITAR: se corrigió la frecuencia de reloj mostrada.

Respuestas (1)

Asegúrese de que la señal de "recuento de reloj" no se esté utilizando como un reloj real en el contador. Desea usarlo como "habilitación de conteo". El reloj en el contador debe ser el mismo reloj de 25,13 MHz que usó en otros lugares.

Otro problema que vale la pena vigilar... Cuando un codificador no se mueve, a veces puede atascarse en una especie de estado intermedio. Lo que verá es que la entrada A o B podría alternar de un lado a otro con cierta rapidez. En un sistema diseñado correctamente, esto no debería ser un problema (solo verá que el conteo cambia rápidamente entre dos valores adyacentes). También puede ver el equivalente al rebote del interruptor en A y B a medida que cambia de valor. Algunos codificadores de cuadratura usan interruptores mecánicos, pero incluso los codificadores ópticos podrían tener algo similar.

Pero este diseño requiere que A y B no cambien rápidamente. Las entradas deben tener un valor constante durante 2 o 3 relojes antes de que se les permita cambiar. Si se viola este requisito, entonces no funcionará correctamente. No he hecho el trabajo para averiguar exactamente cómo se comportará, pero es probable que no cuente correctamente.

Cuando he hecho decodificadores en cuadratura, siempre lo he hecho más con una máquina de estado que como lo has hecho tú aquí. El tuyo está bien, siempre que cumplas con todos los requisitos, pero hay mejores formas de hacerlo.

¡Usted señor es un genio! Eso parece haber ayudado, aunque todavía tengo un comportamiento de fuga. Ahora, cuando dejo de girar el codificador, a veces el conteo se detiene, pero a veces sigue corriendo como antes. ¿Alguna idea de por qué esto sería intermitentemente el caso?
Se ve bastante limpio cuando puedo medirlo, pero con todo el circuito conectado es posible que tenga algo de ruido en la línea. ¿Crees que el ruido podría causar la fuga que estoy viendo? Intentaré volver a poner mi alcance allí y ver si alguna de las fases está fluctuando cuando debería estar quieta.
@Engineero Agregué algunos a mi respuesta.
Gracias por la actualización. ¿Tiene alguna referencia que pueda vincular sobre cómo hacerlo mejor con un FPGA como este? Lo he hecho antes con una máquina de estado en un FPGA de National Instruments, pero no pude averiguar cómo hacer que ese esquema funcionara en mi placa Altera. Además, ¿hay alguna otra forma en que pueda filtrar mis fases para evitar este tipo de fuga con el diseño que estoy usando?
Solo haré una pregunta separada para el problema que todavía estoy viendo. Me interesaría saber qué mejores formas existen de contar pulsos que podrían ser menos propensos a este error de fuga, pero su respuesta resolvió el problema inmediato. ¡Gracias!