En este momento, está considerando utilizar un contador precargado. Esto significa que cada ciclo de reloj obtiene un incremento fijo, en una longitud de acumulador variable que usted controla, por lo que la frecuencia es recíproca a su valor de control.
Si, en cambio, utiliza un incremento variable controlable en una longitud fija del acumulador, su frecuencia dependerá linealmente del valor de control.
Así es como funciona un DDS. Un acumulador de longitud fija, generalmente una potencia de 2, por ejemplo, un acumulador de 18 bits que cuenta hasta 2 ^ 18 (250k-ish largo) se incrementa cada ciclo de reloj del reloj del sistema. En pigHDL, escribirías
int count [17 downto 0];
proceso (en sys_clock en aumento):
_ count < = count + freq;
_ salida: = cuenta [17];
Esto puede, o no, darle lo que necesita. El MSB del contador le dará la salida, pero a menos que freq sea una potencia exacta de 2, los ciclos de salida no tendrán exactamente la misma longitud, variarán en una cuenta.
La frecuencia de salida promedio = freq * fs / longitud del acumulador.
Puede obtener una mayor resolución para la frecuencia aumentando la longitud del acumulador y la palabra de frecuencia, a la derecha.
No hay forma de eliminar esta fluctuación de un ciclo, si va a utilizar el reloj como una fuente digital. Tenga en cuenta que para un FPGA, es mala forma tomar la salida de MSB y usarla como la línea del reloj para otros elementos. Es mucho mejor convertirlo en un ClockEnable de un ciclo, y usarlo para condicionar el reloj en elementos descendentes.
Si es para una fuente externa, puede tomar los primeros bits del acumulador en un DAC, filtrar la forma de onda y usar un comparador, esto reducirá la fluctuación de fase considerablemente.