Preparando un ejercicio de laboratorio, donde tenemos la tarea de generar un reloj de 1 Hz fuera del reloj del sistema de 50 Mhz de un FPGA. Esto se debe lograr sin usar ninguna biblioteca además de ieee.std_logic_1164 y ieee.numeric_std.
La posibilidad obvia sería, para ejecutar un contador. Cuando golpea 25 * 10 ^ 6 tics, se puede transmitir un borde (alternando entre subir y bajar). Luego reinicie el temporizador. Esto requeriría un temporizador de 25 bits y una comparación de 25 bits. Como nuestro ejercicio general no es tan complejo, no deberíamos encontrarnos con las limitaciones de los recursos FPGA. Sin embargo, me preguntaba cómo se podría implementar esto de manera más eficiente. P.ej. uno podría comparar solo el primer par de bits, perdiendo así la precisión de la frecuencia de reloj.
La documentación del ejercicio indica que, por lo general, estos temporizadores solo se bloquean en un bit dentro del contador. Entonces, una posibilidad sería contar más rápido, de modo que después de medio segundo se intercambiaría un bit específico. Esto se puede hacer contando hasta 2 ^ n y aumentando los pasos del contador. Sin embargo, esto crearía un error debido al resto truncado en el tamaño del paso. P.ej. contar a 2 ^ 30 con un tamaño de paso de 43 resultaría en un error de 0.1%, mientras que contar a 2 ^ 27 tiene un error de 6.9% con un tamaño de paso de 5.
¿Hay más recursos de conceptos eficientes para generar tal reloj? Preferiblemente usar un contador y bloquear en un solo bit para la generación de reloj.