A concepção de loops de fase digital (PLLs) em VHDL é uma habilidade fundamental para engenheiros que trabalham na síntese de frequência e gerenciamento de relógios em sistemas digitais. Os PLLs são componentes essenciais que ajudam a sincronizar sinais e gerar frequências estáveis, tornando-os vitais em dispositivos eletrônicos modernos, como transceptores sem fio, conversores de dados e processadores digitais. Ao contrário dos PLLs analógicos, os PLLs digitais (DPLLs) oferecem maior flexibilidade, programabilidade e imunidade às variações de processo, tornando-os a escolha preferida para implementações de sistemas em chip (SoC). Este artigo fornece um guia abrangente passo a passo para projetar DPLLs em VHDL, cobrindo fundações teóricas, design de componentes centrais, técnicas de simulação e considerações práticas para a síntese de frequências.

Compreender PLLs digitais

Um PLL digital é um sistema de controlo de feedback que compara a fase de um sinal de referência de entrada com a fase de um sinal de saída gerado. O objectivo é alinhar a fase de saída com a entrada, travando eficazmente a frequência. Num ciclo fechado, o DPLL ajusta continuamente a frequência de um oscilador digital numericamente controlado (NCO) até que a diferença de fase diminua para um pequeno erro de estado estacionário. Este processo garante que o sinal de saída permanece sincronizado com a referência, mesmo na presença de ruído ou deriva de frequência. Os PLLs digitais são preferidos em sistemas digitais porque podem ser implementados inteiramente em linguagens de descrição de hardware como VHDL, sintetizados em listas de rede de nível de portas, e integrados em FPGAs ou ASICs sem componentes analógicos externos.

A arquitetura básica de um DPLL consiste em quatro blocos principais: um detector de fase, um filtro de loop, um NCO e um caminho de feedback. O detector de fase calcula a diferença entre a fase de referência e a fase de feedback. Este sinal de erro é filtrado pelo filtro de loop, que normalmente inclui um controlador proporcional- integrado (PI) para definir a dinâmica da loop. A palavra de controle filtrada a NCO, que gera o relógio de saída ou a forma de onda. A saída é alimentada de volta ao detector de fase, fechando a loop. Compreender a interação destes blocos é essencial para projetar um DPLL estável e responsivo.

Componentes-chave de uma PLL Digital

Antes de mergulhar na implementação da VHDL, é importante entender as funções e os trade-offs de design de cada componente.

Detector de Fase

O detector de fase (PD) gera um sinal de erro proporcional à diferença de fase entre os sinais de referência e feedback. Em projetos digitais, as implementações mais comuns são o detector de fase de porta XOR e o detector de fase-frequência (PFD).

  • XOR Phase Detector: Uma porta XOR compara dois sinais binários e produz um sinal cujo ciclo de trabalho médio é proporcional à diferença de fase. Funciona melhor quando ambos os sinais têm 50% de ciclos de trabalho e uma relação de quadratura (90° de mudança de fase). A PD XOR tem uma faixa linear limitada (±π/2) e não consegue detectar diferenças de frequência.
  • Detector de Frase- Frequencia (PFD): Um PFD usa lógica sequencial (por exemplo, dois chinelos e um portão AND) para detectar diferenças de fase e frequência. Ele produz pulsos para cima e para baixo que indicam se a referência leva ou atrasa o feedback. O PFD tem um intervalo linear mais amplo (±2π) e pode bloquear mesmo quando as frequências estão distantes, tornando- se a escolha preferida para a síntese de frequência.

Filtro de Perfis

O filtro de loop processa o sinal de erro de fase para produzir uma tensão de controle (ou código digital) que aciona o NCO. Num PLL digital, o filtro de loop é normalmente um filtro IP digital. O termo proporcional fornece uma correção imediata com base no erro atual, enquanto o termo integral acumula erros ao longo do tempo para eliminar o deslocamento de fase em estado estacionário. Os coeficientes do filtro (Kp e Ki) determinam a largura de banda, o tempo de bloqueio e a estabilidade do loop. Um filtro de loop bem desenhado deve equilibrar a aquisição rápida com um jitter baixo.

Oscilador controlado numericamente (NCO)

O NCO gera a forma de onda de saída - muitas vezes uma onda quadrada ou onda seno - numa frequência programável. Ele normalmente contém um acumulador de fase que adiciona uma palavra de controle de frequência (FCW) em cada ciclo de relógio. O resultado do acumulador, representando a fase instantânea, aborda uma tabela de busca (LUT) que armazena valores de seno ou cosseno. Alternativamente, para a síntese do relógio, o NCO pode simplesmente produzir o pedaço mais significativo do acumulador de fase para produzir uma onda quadrada de ciclo de 50%. A resolução do NCO é determinada pelo número de bits no acumulador (por exemplo, 32 bits), permitindo passos de frequência muito finos.

Caminho de Feedback

O caminho de feedback é simples: ele encaminha a saída NCO de volta para o detector de fase. Em alguns projetos, um divisor de frequência pode ser colocado no caminho de feedback para permitir que o PLL gere frequências que são múltiplas da referência (por exemplo, síntese inteiro- N). Os DPLLs modernos também podem incorporar divisores programáveis para síntese flexível.

Projetando um PLL Digital em VHDL

A implementação de uma PLL digital em VHDL envolve a codificação de cada componente como uma entidade separada e a sua ligação hierarquicamente.As subseções seguintes fornecem exemplos de design de VHDL para cada bloco, com ênfase em construtos sintetizados e melhores práticas.

Implementação do Detector de Fase

Iremos implementar um PFD, pois é mais robusto para a síntese de frequências. O PFD usa dois chinelos D, um AND reset gate e saídas up/down. O código VHDL para um PFD simples é mostrado abaixo. Note que o design é completamente síncrono para evitar problemas de metaestabilidade.

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;

Nesta implementação, o sinal é conduzido por uma combinação AND de ambos os chinelos, garantindo que, após ambas as bordas chegarem, o detector reinicia rapidamente. Este PFD produz um pulso em ] quando a referência lidera o feedback, e um pulso em quando o feedback leva. A largura do pulso é proporcional à diferença de fase.

Implementação do Filtro de Perfis

Um filtro IP digital pode ser implementado usando um acumulador e multiplicadores paralelos. Para simplificar, assumimos que as saídas PFD são convertidas para um valor de erro assinado. Os coeficientes de filtro são escolhidos para fornecer um fator de amortecimento de 0,7 e uma frequência natural que atenda ao requisito de tempo de bloqueio. O código VHDL abaixo mostra um filtro IP básico com 16 bits de aritmética assinada.

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;

Neste exemplo, os coeficientes são representados no formato Q14 de ponto fixo. O acumulador integral é de 32 bits para evitar o transbordamento, e a saída é truncada para 16 bits. Este filtro impulsiona a palavra de controle de frequência do NCO.

Implementação da NCO

O NCO gera o relógio de saída. Para a síntese de frequência, muitas vezes precisamos de uma onda quadrada com ciclo de trabalho de 50%. A abordagem do acumulador de fase funciona bem. O seguinte código VHDL implementa um NCO de 32 bits com uma saída de relógio (o MSB do 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;

A frequência de saída é dada por . Usando um acumulador de 32 bits, fornece uma resolução de frequência de . Para a síntese de onda seno, substitua a saída por uma tabela de pesquisa endereçada pelos bits de alta ordem do acumulador. Por exemplo, use os 8 bits superiores para indexar um LUT de seno de 256 pontos armazenado em um bloco ROM.

Integração e Design de Nível Superior

Uma vez que os módulos individuais são projetados, criamos uma entidade de alto nível que instancia o PFD, filtro de loop e NCO. O caminho de feedback conecta a saída NCO de volta à entrada de feedback do PFD. Um design VHDL de alto nível simples é mostrado abaixo.

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;

Note que neste exemplo simples, o erro de fase é quantizado em ±1. Na prática, um detector de fase mais sofisticado (por exemplo, conversor tempo-digital) pode fornecer uma resolução mais fina. O filtro de loop e NCO rodam no mesmo relógio de referência, o que simplifica o design, mas limita a frequência de saída máxima. Para frequências de saída mais altas, pode ser usado um domínio de clock de alta velocidade separado.

Simulação e Verificação

Simular um PLL digital é fundamental para verificar o tempo de bloqueio, estabilidade e desempenho de jitter. Um banco de teste VHDL deve aplicar um relógio de referência, permitir que o PLL bloqueie e, em seguida, medir o erro de fase. Use o procedimento para parar a simulação após um tempo razoável. Abaixo está um banco de teste esqueleto.

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;

Ferramentas de simulação como ModelSim, Vivado Simulator ou GHDL podem ser usadas. Também é aconselhável executar extensas simulações de caso de canto com relógios de referência agitados e transientes de energia. Um recurso útil para técnicas de simulação de PLL é o white paper on ]PLL simulation best practices] do RF Centers.

Síntese de Frequência com PLL Digital

Uma vez que o DPLL está bloqueado, podemos usá- lo para a síntese de frequência alterando a palavra de controle de frequência do NCO. Numa aplicação típica, o relógio de referência é um oscilador de cristal estável, e o DPLL gera uma saída de alta frequência que é um múltiplo da referência. Para a síntese inteira- N, um separador pode ser adicionado no caminho de feedback. Para a síntese fracionária- N, o divisor de feedback é modulado (por exemplo, usando um modulador sigma- delta) para atingir fatores de multiplicação não- inteiros. Os PLLs digitais se sobressaem na síntese fracionária- N porque a palavra de controle de frequência do NCO pode ser atualizada em tempo real com alta resolução.

A relação entre a frequência de saída e a palavra de controlo é dada por f out = (FCW[ / 2N[] * f clk[, onde N é o número de bits acumuladores. Ao variar FCW, o DPLL pode produzir uma ampla gama de frequências. Em sistemas de espectro de dispersão de saltos de frequência (FHSS), o DPLL pode alternar frequências dentro de alguns ciclos de relógio, atualizando FCW, desde que a largura de banda de loop permita uma rápida fixação.

Para mais leituras sobre a síntese de frequências digitais, veja o texto clássico Loops Fechados com Fase: Design, Simulação e Aplicações[] de Roland E. Best (McGraw-Hill, 2007). Adicionalmente, o artigo IEEE sobre arquitetura PLL digital de Staszewski et al. fornece uma perspectiva avançada.

Considerações Práticas

Projetar um DPLL que funcione de forma confiável em hardware requer atenção cuidadosa a vários problemas práticos.

Tempo de bloqueio e Largura de Banda

O tempo de bloqueio de um DPLL é inversamente proporcional à largura de banda do loop. Uma largura de banda mais larga bloqueia mais rapidamente, mas permite uma alimentação mais de referência do esporão e jitter. Uma largura de banda estreita atenua o ruído mas demora mais tempo a bloquear. Os coeficientes de filtro do loop devem ser ajustados de modo a corresponder aos requisitos da aplicação. Comece com um factor de amortecimento de 0, 707 (amporação crítica) e ajuste a frequência natural com base no tempo de bloqueio aceitável. Use a fórmula [[ FLT: 0]]ω n[[ FLT: 1]] □ 2 * π * (largura de banda) para trocar.

Jitter e ruído de fase

Os PLLs digitais sofrem de jitter de quantização devido à resolução finita do detector de fase e NCO. Aumentar a largura do acumulador reduz o ruído de quantização de frequência. Usando um detector de fase multi-bit (por exemplo, um conversor tempo-digital com 10s de resolução ps) melhora o ruído de fase. Para aplicações de alto desempenho, considere implementar um detector de fase bang-bang (binário) com um filtro de loop digital de alta velocidade. Referências externas com ruído de baixa fase, como osciladores de cristal controlados por forno (OCXOs), também melhoram o jitter global.

Consumo de energia

Os DPLL implementados em FPGAs ou ASICs consomem energia dinâmica proporcional à frequência do relógio e ao número de portas de comutação. Para reduzir a potência, use relógios fechados ou habilite sinais para o NCO quando não é necessária a reconfiguração de frequência. As arquiteturas modernas de baixa potência DPLL, como as que usam processamento de domínio do tempo, são discutidas no ] trabalho de pesquisa de Chen et al.

Variações de processo, tensão, temperatura (PVT)

Os desenhos digitais são mais imunes às variações de PVT do que aos circuitos analógicos, mas o ganho do filtro de loop e a frequência de NCO ainda dependem do relógio do sistema, que pode variar entre os cantos. Usando uma pequena margem nos coeficientes de filtro de loop e realizando análise de tempo estática garante que o DPLL atenda ao tempo em todas as condições. A simulação com o back-anotação SDF (formato padrão de atraso) é recomendada para o sinal.

Tópicos Avançados

Para engenheiros prontos para ir além do básico, existem várias topologias avançadas do DPLL.

PLL totalmente digital (ADPLL)

Um ADPLL substitui todos os componentes analógicos por equivalentes digitais, incluindo um conversor tempo-digital (TCD) como o detector de fase e um oscilador digitalmente controlado (DCO). Esta abordagem é amplamente utilizada em CMOS nanômetro para aplicações RF. A metodologia de projeto VHDL estende-se naturalmente aos ADPLLs adicionando um bloco IP TDC e uma interface de controle oscilador.

PLL fraccional-N com Modulação 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.

Conclusão

Desenhar loops digitais bloqueados por fases em VHDL para síntese de frequências é uma tarefa desafiadora, mas gratificante, que combina processamento digital de sinal, teoria de controle e design de hardware. Este artigo cobriu os componentes fundamentais – detector de fases, filtro de loop e NCO – com exemplos de VHDL sintetizados e estratégias de simulação. Ao entender esses blocos de construção, você pode criar DPLLs robustos capazes de gerar relógios estáveis de alta frequência para uma ampla gama de aplicações. Lembre-se de sempre verificar seu projeto através de simulação, considerar trocas práticas como tempo de bloqueio e jitter e explorar arquiteturas avançadas para atender a requisitos de desempenho rigorosos.