Diseño de la aplicación digital de los ciclos de trabajo (PLL) en VHDL es una habilidad fundamental para los ingenieros que trabajan en la síntesis de frecuencias y la gestión de relojes en sistemas digitales. Los PLL son componentes esenciales que ayudan a sincronizar las señales y generar frecuencias estables, haciéndolos vitales en dispositivos electrónicos modernos como transceptores inalámbricos, convertidores de datos y procesadores digitales.

Comprender los PLLs digitales

Un sistema de control de retroalimentación digital que compara la fase de una señal de referencia de entrada con la fase de una señal de salida generada. El objetivo es alinear la fase de salida con la entrada, cerrando efectivamente la frecuencia. En un circuito cerrado, el DPLL ajusta continuamente la frecuencia de un oscilador digital controlado numéricamente (NCO) hasta que la diferencia de fase disminuye a un pequeño error de estado constante.

La arquitectura básica de un DPLL consta de cuatro bloques principales: un detector de fases, un filtro de bucle, una NCO y una ruta de retroalimentación. El detector de fases calcula la diferencia entre la fase de referencia y la fase de retroalimentación. Esta señal de error se filtra por el filtro de bucle, que normalmente incluye un controlador proporcional integrado (PI) para configurar la onda de flujo.

Componentes clave de un PLL digital

Antes de sumergirse en la implementación de VHDL, es importante entender la función de cada componente y diseñar los intercambios.

Detector de fases

El detector de fases (PD) genera una señal de error proporcional a la diferencia de fase entre las señales de referencia y retroalimentación. En los diseños digitales, las implementaciones más comunes son el detector de fases de compuerta XOR y el detector de frecuencias de fase (PFD).

  • XOR Detector de Fase: Una puerta XOR compara dos señales binarias y produce una señal cuyo ciclo de servicio promedio es proporcional a la diferencia de fase. Funciona mejor cuando ambas señales tienen 50% de ciclos de servicio y una relación de cuadrícula (desplazamiento de fase de 90°). El PD XOR tiene un rango lineal limitado (±π/2) y no puede detectar diferencias de frecuencia.
  • ] Detector de frecuencias (PFD): Un PFD utiliza lógica secuencial (por ejemplo, dos volteretas y una puerta AND) para detectar diferencias de fase y frecuencia. Produce pulsos arriba y abajo que indican si la referencia conduce o lava la retroalimentación. El PFD tiene un rango lineal más amplio (±2π) y la opción de frecuencia más alta.

Filtro de bucle

El filtro de bucle procesa la señal de error de fase para producir un voltaje de control (o código digital) que impulsa la NCO. En un PLL digital, el filtro de bucle es generalmente un filtro PI digital. El término proporciona corrección inmediata basada en el error actual, mientras que el término integral error acumulando tiempo para eliminar el equilibrio de fase constante.

Oscilador (NCO) con control numérico

La NCO genera la onda de salida, a menudo una onda cuadrada o sine, a una frecuencia programable. Normalmente contiene un acumulador de fase que añade una palabra de control de frecuencia (FCW) en cada ciclo de reloj. La salida del acumulador, representando la fase instantánea, aborda una tabla de búsqueda (LUT) que almacena los valores de onda sine o cosine.

Camino de la retroalimentación

La ruta de retroalimentación es sencilla: recorre la salida de NCO de nuevo al detector de fases. En algunos diseños, se puede colocar un divider de frecuencia en la ruta de retroalimentación para permitir que el PLL genere frecuencias que son múltiples de la referencia (por ejemplo, la síntesis de integer-N).

Diseño de una PLL digital en VHDL

La implementación de una PLL digital en VHDL implica la codificación de cada componente como entidad separada y la conexión jerárquica. Las subsecciones siguientes proporcionan ejemplos de diseño VHDL para cada bloque, con énfasis en construcciones sintetizables y mejores prácticas.

Aplicación del Detector de Fase

Implementaremos un PFD, ya que es más robusto para la síntesis de frecuencias. El PFD utiliza dos volteretas D, una puerta de restablecimiento AND y salidas de restablecimiento/desactivación. El código VHDL para un PFD simple se muestra a continuación. Tenga en cuenta que el diseño es completamente sincronizado para evitar problemas de metástabilidad.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity pfd is
 port (
 clk_ref : in std_logic;
 clk_fb : in std_logic;
 reset : in std_logic;
 up : out std_logic;
 down : out std_logic
 );
end pfd;

architecture rtl of pfd is
 signal q_ref, q_fb : std_logic;
begin
 process(clk_ref, reset)
 begin
 if reset = '1' then
 q_ref <= '0';
 elsif rising_edge(clk_ref) then
 q_ref <= '1';
 end if;
 end process;

 process(clk_fb, reset)
 begin
 if reset = '1' then
 q_fb <= '0';
 elsif rising_edge(clk_fb) then
 q_fb <= '1';
 end if;
 end process;

 up <= q_ref and not q_fb;
 down <= q_fb and not q_ref;

 reset <= q_ref and q_fb; -- internal reset for both flip-flops
end rtl;

En esta implementación, la señal es impulsada por una combinación de las dos volteretas, asegurando que después de que ambos bordes lleguen, el detector se reinicia rápidamente. Este PFD produce un pulso en cuando la referencia conduce la retroalimentación, y un pulso en cuando la retroalimentación conduce.

Aplicación de filtros de bucle

Un filtro PI digital se puede implementar utilizando un acumulador y multiplicadores paralelos. Para la simplicidad, suponemos que las salidas PFD se convierten a un valor de error firmado. Los coeficientes de filtro se eligen para proporcionar un factor de amortiguación de 0.7 y una frecuencia natural que cumple con el requisito de tiempo de bloqueo. El código VHDL muestra un filtro PI básico con aritmética firmada de 16 bits.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity loop_filter is
 port (
 clk : in std_logic;
 rst : in std_logic;
 phase_err: in signed(15 downto 0);
 freq_ctrl: out signed(15 downto 0)
 );
end loop_filter;

architecture rtl of loop_filter is
 -- Coefficients: Kp = 0.25, Ki = 0.03125 (example values)
 constant Kp : signed(15 downto 0) := to_signed(8192, 16); -- 0.25 in Q14
 constant Ki : signed(15 downto 0) := to_signed(1024, 16); -- 0.03125 in Q14
 signal integral : signed(31 downto 0) := (others => '0');
 signal prop_term, int_term : signed(31 downto 0);
begin
 process(clk, rst)
 begin
 if rst = '1' then
 integral <= (others => '0');
 elsif rising_edge(clk) then
 integral <= integral + (phase_err * Ki); -- saturated accumulation
 end if;
 end process;

 prop_term <= phase_err * Kp;
 int_term <= integral(31 downto 16); -- truncate to 16-bit
 freq_ctrl <= prop_term(15 downto 0) + int_term(15 downto 0);
end rtl;

En este ejemplo, los coeficientes están representados en formato Q14 de punto fijo. El acumulador integral es de 32 bits para evitar el desbordamiento, y la salida se trunca a 16 bits. Este filtro impulsa la palabra de control de frecuencias de la NCO.

Aplicación de la OMA

La NCO genera el reloj de salida. Para la síntesis de frecuencias, a menudo necesitamos una onda cuadrada con 50% de ciclo de servicio. El enfoque acumulador de fase funciona bien. El siguiente código VHDL implementa una NCO de 32 bits con una salida del reloj (la MSB del acumulador).

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity nco is
 port (
 clk : in std_logic;
 rst : in std_logic;
 freq_word: in unsigned(31 downto 0);
 out_clk : out std_logic
 );
end nco;

architecture rtl of nco is
 signal accumulator : unsigned(31 downto 0) := (others => '0');
begin
 process(clk, rst)
 begin
 if rst = '1' then
 accumulator <= (others => '0');
 elsif rising_edge(clk) then
 accumulator <= accumulator + freq_word;
 end if;
 end process;

 out_clk <= accumulator(31); -- MSB toggles at half the NCO frequency
end rtl;

La frecuencia de salida es dada por . Utilizando un acumulador de 32 bits proporciona una resolución de frecuencia de . Para la síntesis de ondas sine, reemplace la salida con una tabla de búsqueda dirigida por los pedazos de alto orden del acumulador. Por ejemplo, utilice los 8 primeros bits para indexar un LUT sine de 256 puntos almacenado en un bloque ROM.

Integración y Diseño de Top-Level

Una vez diseñados los módulos individuales, creamos una entidad de alto nivel que instantánea el PFD, filtro de bucle y NCO. La ruta de retroalimentación conecta la salida NCO de nuevo a la entrada de comentarios del PFD. Un diseño VHDL de alto nivel se muestra a continuación.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity digital_pll is
 port (
 ref_clk : in std_logic;
 rst : in std_logic;
 pll_out : out std_logic
 );
end digital_pll;

architecture rtl of digital_pll is
 signal up, down : std_logic;
 signal phase_err_signed : signed(15 downto 0);
 signal freq_ctrl : signed(15 downto 0);
 signal fb_clk : std_logic;
begin
 -- Convert up/down to signed error
 phase_err_signed <= (to_signed(1, 16) when up='1') else
 (to_signed(-1, 16) when down='1') else
 (others => '0');

 u_pfd : entity work.pfd
 port map (
 clk_ref => ref_clk,
 clk_fb => fb_clk,
 reset => rst,
 up => up,
 down => down
 );

 u_loop_filter : entity work.loop_filter
 port map (
 clk => ref_clk,
 rst => rst,
 phase_err => phase_err_signed,
 freq_ctrl => freq_ctrl
 );

 u_nco : entity work.nco
 port map (
 clk => ref_clk,
 rst => rst,
 freq_word => unsigned(freq_ctrl),
 out_clk => fb_clk
 );

 pll_out <= fb_clk;
end rtl;

Tenga en cuenta que en este simple ejemplo, el error de fase se cuantizó a ±1. En la práctica, un detector de fases más sofisticado (por ejemplo, convertidor de tiempo a dígitos) puede proporcionar una resolución más fina. El filtro de bucle y NCO funcionan en el mismo reloj de referencia, que simplifica el diseño pero limita la frecuencia de salida máxima. Para frecuencias de salida más altas, se puede utilizar un dominio de reloj de alta velocidad separado.

Simulación y Verificación

Simular un PLL digital es crítico para verificar el tiempo de bloqueo, la estabilidad y el rendimiento del jitter. Un testbench VHDL debe aplicar un reloj de referencia, permitir que el PLL cerrifique, y luego medir el error de fase. Utilice el procedimiento para detener la simulación después de un tiempo razonable.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity tb_digital_pll is
end tb_digital_pll;

architecture sim of tb_digital_pll is
 signal ref_clk : std_logic := '0';
 signal rst : std_logic := '0';
 signal pll_out : std_logic;
 constant T : time := 20 ns; -- 50 MHz reference
begin
 ref_clk <= not ref_clk after T/2;
 rst <= '1', '0' after 100 ns;

 dut : entity work.digital_pll
 port map (ref_clk, rst, pll_out);

 -- verification process
 process
 begin
 wait until rising_edge(rst);
 wait for 1 us; -- allow lock
 -- check frequency and phase
 report "Simulation complete";
 std.env.finish;
 end process;
end sim;

Herramientas de simulación como ModelSim, Vivado Simulator o GHDL pueden ser utilizados. También es recomendable realizar extensas simulaciones de esquina con relojes de referencia y transientes de potenciación. Un recurso útil para técnicas de simulación PLL es el papel blanco en ]Las mejores prácticas de simulación PLL de los centros de RF.

Sintesis de frecuencia con PLL digital

Una vez que el DPLL está bloqueado, podemos utilizarlo para la síntesis de frecuencias cambiando la palabra de control de frecuencias de la NCO. En una aplicación típica, el reloj de referencia es un oscilador de cristal estable, y el DPLL genera una salida de alta frecuencia que es un múltiple de la referencia. Para la síntesis integer-N, un divider puede ser añadido en el camino de retroalimentación.

La relación entre la frecuencia de salida y la palabra de control se da por f out = (FCW] / 2N) * f clk, donde N es el número de sistemas de secuenciación de frecuencias de accumula

Para más información sobre la síntesis de frecuencias digitales, vea el texto clásico Phase-Locked Loops: Design, Simulation, and Applications por Roland E. Best (McGraw-Hill, 2007). Adicionalmente, el ]EEE sobre la arquitectura PLL de todo dígitos] por Staszewski et al.

Consideraciones prácticas

La designación de un DPLL que funcione de forma fiable en hardware requiere una atención cuidadosa a varios problemas prácticos.

Tiempo de bloqueo y ancho de banda

El tiempo de bloqueo de un DPLL es inversamente proporcional al ancho de banda de bucle. Un ancho de banda más ancho se bloquea más rápido pero permite más referencias de entrada y destornillador. Un ancho de banda estrecho atenua el ruido pero tarda más en bloquear. Los coeficientes de filtro de bucle deben ajustarse para que coincida con los requisitos de aplicación.

Jitter y Fase Noise

Los PLL digitales sufren de cuarentena debido a la resolución finita del NCO y detector de fase. Aumentar el ancho del acumulador reduce el ruido de cuarentena de frecuencia. Usar un detector de fases multi-bit (por ejemplo, un convertidor de tiempo a dígitos con resolución de 10s) mejora el ruido de fase. Para aplicaciones de alto rendimiento, considere la implementación de un detector de referencia de alta velocidad (binario)

Consumo de energía

Los DPLL implementados en FPGAs o ASIC consumen potencia dinámica proporcional a la frecuencia del reloj y el número de puertas de rebote. Para reducir la potencia, utilizar relojes cerrados o activar señales para la NCO cuando no se necesita reconfiguración de frecuencia. Modernas arquitecturas de baja potencia DPLL, como las que usan procesamiento de tiempo-dominio, se discuten en el

Variaciones de proceso, voltaje, temperatura (PVT)

Los diseños digitales son más inmunes a las variaciones de PVT que los circuitos analógicos, pero la ganancia de filtro de bucle y la frecuencia de NCO todavía dependen del reloj del sistema, que puede variar a través de las esquinas. Utilizar un pequeño margen en coeficientes de filtro de bucle y realizar análisis de tiempo estático garantiza que el DPLL cumple el tiempo a través de todas las condiciones.

Temas avanzados

Para los ingenieros listos para ir más allá de lo básico, existen varias topologías avanzadas de DPLL.

PLL de todo dígito (ADPLL)

Un ADPLL reemplaza todos los componentes analógicos con equivalentes digitales, incluyendo un convertidor de tiempo a dígitos (TDC) como el detector de fases y un oscilador de control digital (DCO). Este enfoque se utiliza ampliamente en el nanometro CMOS para aplicaciones RF. La metodología de diseño VHDL se extiende naturalmente a los ADPLLs mediante la adición de un bloque IP TDC y una interfaz de control de oscilador.

PLL Fraccional-N con la Modulación Sigma-Delta

Fractional-N synthesis allows arbitrary frequency ratios, enabling fine frequency steps without reducing the phase detector frequency. The feedback divider's modulus is modulated by a sigma-delta modulator (SDM) to shape quantization noise away from the loop bandwidth. The SDM can be implemented in VHDL as a third-order error feedback structure. A tutorial on SDM-based fractional-N PLLs is available from Analog Devices.

Conclusión

Diseño de bucles digitales de bloqueo de fase en VHDL para síntesis de frecuencias es una tarea difícil pero gratificante que combina procesamiento digital de señales, teoría de control y diseño de hardware. Este artículo ha cubierto los componentes fundamentales: detector de fases, filtro de bucle y NCO, con ejemplos de VHDL sintetizables y estrategias de simulación. Al entender estos bloques de construcción, puede crear DPLLs robustos capaces de generar relojes de simulación estables de alta frecuencia para verificar un amplio rango de gran alcance.