La progettazione di circuiti digitali bloccati a fase (PLL) in VHDL è una capacità fondamentale per gli ingegneri che lavorano sulla sintesi di frequenza e la gestione del clock nei sistemi digitali. I PLL sono componenti essenziali che aiutano a sincronizzare i segnali e generare frequenze stabili, rendendoli vitali nei moderni dispositivi elettronici come i transceivers wireless, i convertitori di dati e i processori digitali.

Comprensione di PLL digitali

Un PLL digitale è un sistema di controllo del feedback che confronta la fase di un segnale di riferimento di input con la fase di un segnale di uscita generato. L'obiettivo è quello di allineare la fase di uscita con l'ingresso, bloccando efficacemente la frequenza. In un loop chiuso, il DPLL regola continuamente la frequenza di un oscillatore digitale numericamente controllato (NCO) fino a quando la differenza di fase diminuisce ad un piccolo errore di stato costante.

L'architettura di base di un DPLL consiste di quattro blocchi principali: un rilevatore di fase, un filtro a loop, un NCO e un percorso di feedback. Il rilevatore di fase calcola la differenza tra la fase di riferimento e la fase di feedback. Questo segnale di errore viene filtrato dal filtro a loop, che in genere include un controllo proporzionale-integrale (PI) per impostare le dinamiche del loop.

Componenti chiave di un PLL digitale

Prima di immergersi nell'implementazione VHDL, è importante capire la funzione di ciascun componente e i trade-off di progettazione.

Detetto di fase

Il rilevatore di fase (PD) genera un segnale di errore proporzionale alla differenza di fase tra i segnali di riferimento e di feedback. Nei progetti digitali, le implementazioni più comuni sono il rilevatore di fase di XOR e il rilevatore di frequenza di fase (PFD).

  • XOR Phase Detector:[] Un cancello XOR confronta due segnali binari e produce un segnale il cui ciclo medio di dovere è proporzionale alla differenza di fase. Funziona meglio quando entrambi i segnali hanno il 50% di cicli di dovere e una relazione quadratura (90° di fase).
  • Phase-Frequency Detector (PFD): Un PFD utilizza logica sequenziale (ad esempio, due infradito e un cancello E) per rilevare sia differenze di fase che di frequenza.

Filtro di carico

Il filtro passante elabora il segnale di errore di fase per produrre una tensione di controllo (o codice digitale) che guida il NCO. In un PLL digitale, il filtro passante è solitamente un filtro PI digitale. Il termine proporzionale fornisce una correzione immediata basata sull'errore corrente, mentre il termine integrale accumula errore nel tempo per eliminare l'offset di fase a stato costante.

Oscillatore Numerically Controlled (NCO)

Il NCO genera la forma d'onda di uscita – spesso un'onda quadrata o un'onda sinusoidale – a frequenza programmabile. Contiene tipicamente un accumulatore di fase che aggiunge una parola di controllo di frequenza (FCW) su ogni ciclo di orologio. L'uscita dell'accumulatore, che rappresenta la fase istantanea, indirizza una tabella di ricerca (LUT) che memorizza i valori di sine o di cosene.

Sentiero di feedback

Il percorso di feedback è semplice: si tratta di un percorso di rientro dell'uscita NCO al rilevatore di fase. In alcuni progetti, un divisore di frequenza può essere posizionato nel percorso di feedback per consentire al PLL di generare frequenze che sono multipli del riferimento (ad esempio, sintesi integer-N).

Progettazione di un PLL digitale in VHDL

L'implementazione di un PLL digitale in VHDL comporta la codifica di ogni componente come entità separata e la connessione gerarchica.Le sottosezioni seguenti forniscono esempi di design VHDL per ogni blocco, con l'accento su costrutti sintetizzabili e le migliori pratiche.

Attuazione del rilevamento di fase

Il PFD utilizza due infradito D, un cancello di reset AND e uscite up/down. Il codice VHDL per un semplice PFD è mostrato di seguito. Si noti che il design è completamente sincronizzato per evitare problemi di metastabilità.

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;

In questa implementazione, il segnale ] è guidato da un E combinato di entrambe le infradito, assicurando che dopo l'arrivo di entrambi i bordi, il rivelatore si resetta rapidamente. Questo PFD emette un impulso su quando il riferimento porta il feedback, e un impulso su quando il feedback porta.

Attuazione del filtro del lotto

Per semplicità, si presuppone che le uscite PFD siano convertite in un valore di errore firmato. I coefficienti di filtro sono scelti per fornire un fattore di smorzamento di 0.7 e una frequenza naturale che soddisfa il requisito di tempo di serratura. Il codice VHDL qui sotto mostra un filtro PI di base con aritmetica a 16 bit firmata.

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;

In questo esempio, i coefficienti sono rappresentati in formato Q14 a punto fisso. L'accumulatore integrale è di 32 bit per evitare il trabocco, e l'uscita è troncata a 16 bit. Questo filtro guida la parola di controllo della frequenza di NCO.

Attuazione NCO

Per la sintesi delle frequenze, abbiamo spesso bisogno di un'onda quadrata con il 50% del ciclo di dovere. L'approccio dell'accumulatore di fase funziona bene. Il seguente codice VHDL implementa un NCO a 32 bit con un'uscita dell'orologio (il MSB dell'accumulatore).

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 frequenza di uscita è data da . Utilizzando un accumulatore a 32 bit fornisce una risoluzione di frequenza di [. Per la sintesi dell'onda sine, sostituire l'uscita con una tabella di ricerca indirizzata dai bit di alto ordine dell'accumulatore. Ad esempio, utilizzare i primi 8 bit per indicizzare una sine a 256-punto memorizzata in un blocco ROM.

Integrazione e Top-Level Design

Una volta che i singoli moduli sono progettati, creiamo un'entità di alto livello che istanzia il PFD, il filtro a loop e NCO. Il percorso di feedback collega l'uscita NCO all'ingresso di feedback del PFD.

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;

Si noti che in questo semplice esempio, l'errore di fase è quantizzato a ±1. In pratica, un rilevatore di fase più sofisticato (ad esempio, convertitore tempo-digitale) può fornire una risoluzione più fine. Il filtro del loop e NCO funzionano sullo stesso orologio di riferimento, che semplifica il design ma limita la frequenza di uscita massima.

Simulazione e verifica

La simulazione di un PLL digitale è fondamentale per verificare il tempo di blocco, la stabilità e le prestazioni del jitter. Un banco di prova VHDL dovrebbe applicare un orologio di riferimento, consentire al PLL di bloccare, e quindi misurare l'errore di fase.

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;

È inoltre consigliabile eseguire simulazioni di cassa angolare con orologi di riferimento jittered e transients power-up. Una risorsa utile per le tecniche di simulazione PLL è la carta bianca su Le migliori pratiche di simulazione PLL] da RF Centers.

Frequenza Sintesi con Digital PLL

Una volta bloccata la DPLL, possiamo utilizzarla per la sintesi delle frequenze cambiando la parola di controllo della frequenza NCO. In una tipica applicazione, l'orologio di riferimento è un oscillatore di cristallo stabile, e il DPLL genera un'uscita ad alta frequenza che è un multiplo del riferimento. Per la sintesi di sigma-N, un divisore può essere aggiunto nel percorso di feedback.

Il rapporto tra la frequenza di uscita e la parola di controllo è dato da f out = (FCW / 2]N]]]]]] [f clk, dove N è il numero di accumulo di bit

Per ulteriori informazioni sulla sintesi delle frequenze digitali, vedere il testo classico []Leggi le foto: Design, Simulazione e Applicazioni[[]] di Roland E. Best (McGraw-Hill, 2007). Inoltre, la IE carta su architettura PLL all-digitale] di Staszew.

Considerazioni pratiche

Progettare un DPLL che funziona in modo affidabile in hardware richiede un'attenzione attenta a diversi problemi pratici.

Tempo di bloccaggio e larghezza di banda

Il tempo di blocco di un DPLL è inversamente proporzionale alla larghezza di banda del ciclo. Una larghezza di banda più ampia blocca più velocemente, ma permette un maggiore sfrego di riferimento attraverso e jitter. Una stretta larghezza di banda attenua il rumore ma richiede più tempo per bloccare. I coefficienti di filtro del loop devono essere sintonizzati per soddisfare i requisiti di applicazione.

Jitter e Phase Noise

L'aumento della larghezza dell'accumulatore riduce il rumore di quantizzazione della frequenza. Utilizzando un rilevatore di fase multi-bit (ad esempio, un convertitore di tempo-digitale con 10s di risoluzione del ps) migliora il rumore di fase. Per applicazioni ad alte prestazioni, consideri l'implementazione di un rilevatore di fase di bang-bang (binary) con un flusso di riferimento digitale ad alta velocità.

Consumo di energia

DPLL implementati in FPGAs o ASIC consumano energia dinamica proporzionale alla frequenza dell'orologio e il numero di cancelli di attivazione. Per ridurre l'alimentazione, utilizzare orologi gated o attivare i segnali per il NCO quando non è necessaria la riconfigurazione della frequenza.

Variazioni di processo, tensione, temperatura (PVT)

I disegni digitali sono più immuni alle variazioni PVT rispetto ai circuiti analogici, ma il guadagno del filtro a ciclo e la frequenza NCO dipendono ancora dall'orologio di sistema, che può variare a seconda degli angoli. Utilizzando un piccolo margine nei coefficienti di filtro a ciclo e l'analisi dei tempi statici, il DPLL incontra i tempi in tutte le condizioni.

Argomenti avanzati

Per gli ingegneri pronti ad andare oltre le basi, esistono diverse topologie DPLL avanzate.

PLL digitale (ADPLL)

Un ADPLL sostituisce tutti i componenti analogici con equivalenti digitali, tra cui un convertitore temporale-digitale (TDC) come rilevatore di fase e un oscillatore controllato digitalmente (DCO), che è ampiamente utilizzato in CMOS nanometrico per applicazioni RF. La metodologia di progettazione VHDL si estende naturalmente agli ADPLL aggiungendo un blocco TDC IP e un'interfaccia di controllo oscillatore.

PLL Fractional-N con modulazione 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.

Conclusioni

La progettazione di loop digitali a blocchi di fase in VHDL per la sintesi di frequenza è un compito impegnativo ma gratificante che combina l'elaborazione digitale del segnale, la teoria del controllo e la progettazione hardware. Questo articolo ha coperto i componenti fondamentali - rivelatore di fase, filtro a loop e NCO - con esempi di VHDL sintetizzabili e strategie di simulazione.