Aller au contenu

Horloges, resets et traversées de domaines

Les erreurs de clocking et de CDC peuvent provoquer sur la carte des pannes invisibles en simulation RTL. Traitez-les comme des choix d'architecture.

Horloge Basys 3

L'oscillateur fournit 100 MHz sur W5 :

set_property PACKAGE_PIN W5 [get_ports clk_i]
set_property IOSTANDARD LVCMOS33 [get_ports clk_i]
create_clock -period 10.000 -name sys_clk [get_ports clk_i]

Un cycle vaut 10 ns. Cent millions de cycles représentent une seconde, à la tolérance de l'oscillateur près.

Activité lente par validation

Générez une impulsion d'un cycle :

process(clk_i)
begin
  if rising_edge(clk_i) then
    tick_o <= '0';
    if reset_i = '1' then
      counter_q <= 0;
    elsif counter_q = G_DIVISOR - 1 then
      counter_q <= 0;
      tick_o    <= '1';
    else
      counter_q <= counter_q + 1;
    end if;
  end if;
end process;

Tous les registres restent sur clk_i et changent seulement si tick_o='1'.

Utilisez un Clocking Wizard/MMCM/PLL lorsqu'une fréquence, une phase, un filtrage de jitter ou une vraie sortie d'horloge différente est nécessaire.

Stratégie de reset

Spécifiez :

  • polarité ;
  • assertion synchrone ou asynchrone ;
  • libération synchrone ou asynchrone ;
  • durée minimale ;
  • registres réellement réinitialisés ;
  • comportement juste après libération.

Reset synchrone

process(clk_i)
begin
  if rising_edge(clk_i) then
    if reset_i = '1' then
      state_q <= IDLE;
    else
      state_q <= state_d;
    end if;
  end if;
end process;

Son timing s'analyse comme celui d'une donnée et sa libération est naturellement alignée.

Assertion asynchrone, libération synchrone

L'assertion place immédiatement le circuit en reset, tandis qu'une petite chaîne synchronise sa libération. Suivez les recommandations du composant et ne distribuez pas directement un reset libéré de manière asynchrone à plusieurs domaines.

Métastabilité

Si une entrée asynchrone change près d'un front, une bascule peut mettre un temps imprévisible à résoudre sa sortie. Une simulation RTL ne représente généralement pas ce phénomène analogique.

signal sync_ff : std_logic_vector(1 downto 0) := (others => '0');

attribute ASYNC_REG : string;
attribute ASYNC_REG of sync_ff : signal is "TRUE";

process(clk_i)
begin
  if rising_edge(clk_i) then
    sync_ff(0) <= async_i;
    sync_ff(1) <= sync_ff(0);
  end if;
end process;

sync_o <= sync_ff(1);

L'attribut aide Vivado à reconnaître et placer le synchroniseur.

Warning

Ce patron convient à un niveau sur un bit restant stable assez longtemps. Il ne transfère pas correctement un bus quelconque ni une impulsion très courte.

Patrons CDC

Traversée Patron conseillé
Bit unique lent/stable Deux bascules ou plus
Impulsion vers domaine plus rapide Synchroniseur d'impulsion ou bascule toggle
Impulsion vers domaine plus lent Élargissement, toggle ou handshake
Mot de contrôle multibit Handshake, données maintenues stables
Flux continu FIFO asynchrone
Compteur/statut Code Gray ou capture par handshake

Incohérence d'un bus

Synchroniser chaque bit séparément ne garantit pas un mot cohérent : les bits peuvent se stabiliser sur des cycles différents.

Employez :

  • handshake valid/acknowledge ;
  • FIFO asynchrone ;
  • code Gray lorsqu'un seul bit change par pas ;
  • macro CDC constructeur adaptée.

Boutons

broche bouton → synchroniseur → filtre anti-rebond → niveau propre → détecteur de front

La synchronisation protège le domaine ; l'anti-rebond élimine les transitions mécaniques répétées.

Analyse

report_cdc
report_clock_interaction

Examinez chaque traversée. Les macros XPM CDC peuvent fournir des structures testées et mieux reconnues ; utilisez leur documentation AMD courante.

Contraintes

  • Définir chaque horloge.
  • Définir les horloges générées.
  • Déclarer correctement les relations asynchrones.
  • Appliquer les exceptions de manière étroite.
  • Préserver l'identification des synchroniseurs.

Une fausse route large ne rend pas une traversée sûre.

Relecture CDC

  • Chaque registre appartient à un domaine identifié.
  • Chaque traversée possède une méthode explicite.
  • Aucun bouton brut ne commande directement l'état synchrone.
  • Aucun bus multibit n'est synchronisé bit par bit.
  • Une impulsion courte ne peut pas être perdue.
  • Les resets sont libérés sûrement dans chaque domaine.
  • Les résultats de report_cdc sont compris.
  • Les exceptions correspondent à l'architecture.