FPGA Divisor de frecuencia con regulación lineal

2

Actualmente estoy desarrollando un gateware FPGA que requiere un divisor de frecuencia regulado y me pregunto si hay alguna manera difícil de obtener una regulación de frecuencia de salida lineal.

Lo que quiero decir es que si uso un contador precargado simple obtengo una relevancia de f ~ 1 / x, donde x es un valor inicial de contador. Como necesito regular la frecuencia en un rango relativamente amplio (por ejemplo, 0.5Hz-10kHz) me gustaría que fuera una función lineal de algún argumento (por supuesto, no necesariamente un valor de contador, puede ser algo más complejo ;-) ).

    
pregunta kaolpr

3 respuestas

1

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.

    
respondido por el Neil_UK
1

Sugeriré usar un multiplicador de tasa binaria. He adjuntado una hoja de referencia que muestra lo que quiero decir. Puede usar con precisión la multiplicación binaria para obtener un buen rango de frecuencias de salida. No exactamente lineal, pero fácil de controlar.

enlace

    
respondido por el mcmiln
0

Hay varias cosas a considerar.

1) Cuanto mayor sea la frecuencia principal de FPGA que use, mejor. Esto le da más resolución en las frecuencias más altas. Esto se traduce a más bits en su divisor.

2) Si tuviera que limitar su rango de frecuencia, tendría una capacidad más práctica para realizar un Freq - > Relación de divisor que podría considerarse más recta.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas