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¶
La synchronisation protège le domaine ; l'anti-rebond élimine les transitions mécaniques répétées.
Analyse¶
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_cdcsont compris. - Les exceptions correspondent à l'architecture.