La conception de boucles numériques à verrouillage par phase (PLL) en VHDL est une compétence fondamentale pour les ingénieurs qui travaillent sur la synthèse de fréquences et la gestion d'horloges dans les systèmes numériques. Les PLL sont des composants essentiels qui aident à synchroniser les signaux et à générer des fréquences stables, les rendant vitaux dans les appareils électroniques modernes tels que les émetteurs sans fil, les convertisseurs de données et les processeurs numériques. Contrairement aux PLL analogiques, les PLL numériques offrent une plus grande flexibilité, une plus grande programmabilité et une plus grande immunité aux variations de processus, ce qui en fait le choix préféré pour les implémentations système-sur-puce (SoC).

Comprendre les LPL numériques

Un PLL numérique est un système de contrôle de rétroaction qui compare la phase d'un signal de référence d'entrée à la phase d'un signal de sortie généré. L'objectif est d'aligner la phase de sortie avec l'entrée, en le verrouillant efficacement sur la fréquence. Dans une boucle fermée, le DPLL ajuste en permanence la fréquence d'un oscillateur numérique (NCO) jusqu'à ce que la différence de phase diminue à une petite erreur d'état stable. Ce processus garantit que le signal de sortie reste synchronisé avec la référence, même en présence de bruit ou de dérive de fréquence.

L'architecture de base d'un DPLL se compose de quatre blocs principaux : un détecteur de phase, un filtre à boucles, un NCO et un chemin de rétroaction. Le détecteur de phase calcule la différence entre la phase de référence et la phase de rétroaction. Ce signal d'erreur est filtré par le filtre à boucles, qui comprend généralement un contrôleur proportionnel intégré (PI) pour régler la dynamique de la boucle. Le mot de commande filtré conduit le NCO, qui génère l'horloge de sortie ou la forme d'onde. La sortie est renvoyée au détecteur de phase, en fermant la boucle.

Composantes clés d'une PLL numérique

Avant de plonger dans la mise en œuvre de la LHDV, il est important de comprendre la fonction de chaque composant et les compromis de conception.

Détecteur de phase

Le détecteur de phase (PD) génère un signal d'erreur proportionnel à la différence de phase entre les signaux de référence et de rétroaction. Dans les conceptions numériques, les implémentations les plus courantes sont le détecteur de phase de la barrière XOR et le détecteur de fréquence de phase (PFD).

  • Détecteur de phase XOR: Une barrière XOR compare deux signaux binaires et produit un signal dont le cycle de travail moyen est proportionnel à la différence de phase. Il fonctionne mieux lorsque les deux signaux ont des cycles de travail de 50 % et une relation quadrature (déplacement de phase de 90°).
  • Détecteur de fréquence de phase (PFD): Un PFD utilise une logique séquentielle (p. ex. deux tongs et une porte ET) pour détecter les différences de phase et de fréquence. Il produit des impulsions ascendantes et descendantes qui indiquent si la référence mène ou retarde la rétroaction. Le PFD a une plage linéaire plus large (±2π) et peut verrouiller même lorsque les fréquences sont éloignées, ce qui en fait le choix préféré pour la synthèse de fréquence.

Filtre de boucle

Le filtre boucle traite le signal d'erreur de phase pour produire une tension de commande (ou un code numérique) qui alimente le NCO. Dans une PLL numérique, le filtre boucle est généralement un filtre numérique PI. Le terme proportionnel fournit une correction immédiate basée sur l'erreur courante, tandis que le terme intégral accumule l'erreur au fil du temps pour éliminer le décalage de phase en état d'équilibre. Les coefficients du filtre (Kp et Ki) déterminent la bande passante de la boucle, le temps de verrouillage et la stabilité.

Oscillateur à commande numérique (OCN)

La NCO génère la forme d'onde de sortie, souvent une onde carrée ou une onde sinusoïdale, à une fréquence programmable. Elle contient généralement un accumulateur de phase qui ajoute un mot de contrôle de fréquence (FCW) sur chaque cycle d'horloge. La sortie de l'accumulateur, qui représente la phase instantanée, s'adresse à une table de recherche (LUT) qui stocke des valeurs sinus ou cosinus.

Voie de rétroaction

Le chemin de rétroaction est simple : il conduit la sortie de NCO vers le détecteur de phase. Dans certains modèles, un diviseur de fréquence peut être placé dans le chemin de rétroaction pour permettre à la PLL de générer des fréquences qui sont multiples de la référence (p. ex., synthèse entière-N).

Conception d'une PLL numérique en VHDL

La mise en œuvre d'une LPL numérique dans la LHDV consiste à coder chaque composant en tant qu'entité distincte et à les connecter hiérarchiquement. Les sous-sections suivantes fournissent des exemples de conception de la LHDV pour chaque bloc, en mettant l'accent sur les constructions synthétisées et les meilleures pratiques.

Mise en œuvre du détecteur de phase

Nous allons mettre en œuvre un PFD, car il est plus robuste pour la synthèse de fréquences. Le PFD utilise deux tongs D, une porte ET reset, et des sorties haut / bas. Le code VHDL pour un PFD simple est montré ci-dessous. Notez que la conception est complètement synchrone pour éviter les problèmes de métastabilité.

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;

Dans cette implémentation, le signal est entraîné par une combinaison ET des deux tongs, assurant qu'après l'arrivée des deux bords, le détecteur se réinitialise rapidement. Ce PFD émet une impulsion sur lorsque la référence mène la rétroaction, et une impulsion sur lorsque la rétroaction mène. La largeur de l'impulsion est proportionnelle à la différence de phase.

Mise en œuvre du filtre à boucle

Un filtre numérique PI peut être implémenté à l'aide d'un accumulateur et de multiplicateurs parallèles. Pour simplifier, nous supposons que les sorties PFD sont converties en une valeur d'erreur signée. Les coefficients de filtre sont choisis pour fournir un facteur d'amortissement de 0,7 et une fréquence naturelle qui répond aux exigences de temps de verrouillage.

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;

Dans cet exemple, les coefficients sont représentés au format Q14 à point fixe. L'accumulateur intégral est de 32 bits pour empêcher le débordement, et la sortie est tronquée à 16 bits. Ce filtre permet de contrôler la fréquence du NCO.

Mise en oeuvre de l'OCN

Pour la synthèse de fréquence, nous avons souvent besoin d'une onde carrée avec un cycle de 50 %. L'approche de l'accumulateur de phase fonctionne bien. Le code VHDL suivant implémente un NCO 32 bits avec une sortie d'horloge (le MSB de l'accumulateur).

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 fréquence de sortie est donnée par . L'utilisation d'un accumulateur 32 bits fournit une résolution de fréquence de . Pour la synthèse d'onde sinusoïdale, remplacer la sortie par une table de recherche adressée par les bits de haut de gamme de l'accumulateur.

Intégration et conception de haut niveau

Une fois les modules individuels conçus, nous créons une entité de haut niveau qui permet d'instantaner le PFD, le filtre de boucle et le NCO. Le chemin de rétroaction relie la sortie NCO à l'entrée de rétroaction du PFD. Un design VHDL de haut niveau simple est montré ci-dessous.

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;

Dans cet exemple simple, l'erreur de phase est quantifiée à ±1. En pratique, un détecteur de phase plus sophistiqué (p. ex. convertisseur time-to-numérique) peut fournir une résolution plus fine. Le filtre de boucle et NCO fonctionnent sur la même horloge de référence, ce qui simplifie la conception mais limite la fréquence de sortie maximale. Pour les fréquences de sortie supérieures, un domaine d'horloge à grande vitesse distinct peut être utilisé.

Simulation et vérification

Simuler une LPL numérique est essentiel pour vérifier le temps de verrouillage, la stabilité et les performances de jeu. Un banc de test VHDL devrait appliquer une horloge de référence, permettre à la LPL de verrouiller, puis mesurer l'erreur de phase. Utilisez la procédure pour arrêter la simulation après un temps raisonnable. Ci-dessous est un banc de test squelette.

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;

Il est également conseillé d'exécuter de vastes simulations de cas de coin avec des horloges de référence amarrées et des transitoires de puissance. Une ressource utile pour les techniques de simulation de PLL est le livre blanc sur les meilleures pratiques de simulation de PLL des centres RF.

Synthèse de fréquence avec PLL numérique

Une fois le DPLL verrouillé, nous pouvons l'utiliser pour la synthèse de fréquence en modifiant le mot de contrôle de fréquence de l'OCN. Dans une application typique, l'horloge de référence est un oscillateur cristallin stable, et le DPLL génère une sortie haute fréquence qui est un multiple de la référence. Pour la synthèse entière-N, un diviseur peut être ajouté dans le chemin de rétroaction. Pour la synthèse fractionnelle-N, le diviseur de rétroaction est modulé (par exemple, en utilisant un modulateur sigma-delta) pour obtenir des facteurs de multiplication non entiers.

La relation entre la fréquence de sortie et le mot de commande est donnée par f out = ([FCW[ / 2N) * f clk, où N est le nombre de bits d'accumulateur. En modifiant la FCW, la DPLL peut produire une large gamme de fréquences.

Pour plus de détails sur la synthèse numérique de fréquences, voir le texte classique Loops à phases : Conception, simulation et applications de Roland E. Best (McGraw-Hill, 2007). De plus, le EIEe paper on all-digital PLL architecture[ de Staszewski et al. fournit une perspective avancée.

Considérations pratiques

La conception d'un DPLL qui fonctionne de manière fiable dans le matériel nécessite une attention particulière à plusieurs questions pratiques.

Heure de verrouillage et largeur de bande

Le temps de verrouillage d'un DPLL est inversement proportionnel à la largeur de bande de la boucle. Une largeur de bande plus large se verrouille plus rapidement mais permet un flux de référence plus large et plus amer. Une bande passante étroite atténue le bruit mais prend plus de temps pour verrouiller. Les coefficients de filtre de boucle doivent être ajustés pour correspondre aux exigences de l'application. Commencez par un facteur d'amortissement de 0,707 (amortissement critique) et ajustez la fréquence naturelle en fonction du temps de verrouillage acceptable.

Bruit de jitter et de phase

Les LLP numériques souffrent de la jitter quantification en raison de la résolution finie du détecteur NCO et de phase. L'augmentation de la largeur de l'accumulateur réduit le bruit de quantification de fréquence. L'utilisation d'un détecteur de phase multibit (par exemple, un convertisseur temps-numérique avec résolution de 10s de ps) améliore le bruit de phase.

Consommation d'énergie

Pour réduire la puissance, utiliser des horloges fermées ou activer des signaux pour le NCO lorsque la reconfiguration de fréquence n'est pas nécessaire. Les architectures modernes de faible puissance, comme celles utilisant le traitement du domaine temporel, sont discutées dans le document de recherche de Chen et al..

Variations de processus, de tension, de température (PVT)

Les modèles numériques sont plus à l'abri des variations PVT que les circuits analogiques, mais le gain de filtre de boucle et la fréquence NCO dépendent toujours de l'horloge du système, qui peut varier d'un coin à l'autre. L'utilisation d'une petite marge dans les coefficients de filtre de boucle et l'analyse statique du timing garantit que le DPLL respecte le timing dans toutes les conditions.

Sujets avancés

Pour les ingénieurs prêts à aller au-delà des bases, il existe plusieurs topologies avancées de DPLL.

LL numérique (ADPLL)

Un ADPLL remplace tous les composants analogiques par des équivalents numériques, y compris un convertisseur time-to-numérique (TDC) comme détecteur de phase et un oscillateur à commande numérique (DCO).Cette approche est largement utilisée dans les CMOS nanométriques pour les applications RF. La méthodologie de conception VHDL s'étend naturellement aux ADPLL en ajoutant un bloc IP TDC et une interface de contrôle des oscillateurs.

LL fractionnaire-N avec modulation 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.

Conclusion

La conception de boucles numériques verrouillées par phase en VHDL pour la synthèse de fréquences est une tâche difficile mais enrichissante qui combine le traitement numérique du signal, la théorie du contrôle et la conception matérielle. Cet article couvre les composants fondamentaux – détecteur de phase, filtre de boucle et NCO – avec des exemples de VHDL synthétisés et des stratégies de simulation. En comprenant ces éléments de construction, vous pouvez créer des DPLL robustes capables de générer des horloges stables et à haute fréquence pour une large gamme d'applications. N'oubliez pas de vérifier votre conception par simulation, de considérer des compromis pratiques comme le temps de verrouillage et les jitters, et d'explorer des architectures avancées pour répondre à des exigences de performance strictes.