Aller au contenu

Recettes d'entrées-sorties Basys 3

Le XDC maître officiel est l'autorité pour les emplacements et standards électriques. Décommentez seulement les lignes utilisées puis renommez chaque argument get_ports selon votre entité supérieure.

Interrupteurs et LED

Les interrupteurs sont asynchrones par rapport à l'horloge 100 MHz. Une liaison combinatoire directe est acceptable pour un premier essai :

led_o <= switch_i;

Si un interrupteur pilote une machine à états ou un compteur, synchronisez-le d'abord.

Boutons poussoirs

Deux problèmes distincts :

  1. Asynchronisme : la transition peut survenir près de n'importe quel front.
  2. Rebond : une pression produit plusieurs transitions pendant quelques millisecondes.

Chaîne recommandée :

bouton physique → synchroniseur 2 bascules → anti-rebond → détecteur de front → application

N'utilisez jamais un bouton brut comme horloge.

Impulsion d'un cycle

process(clk_i)
begin
  if rising_edge(clk_i) then
    previous_q <= clean_button_i;
    pulse_o    <= clean_button_i and not previous_q;
  end if;
end process;

Afficheur sept segments

Les quatre chiffres partagent les lignes de segments. Le contrôleur doit multiplexeur :

  1. Sélectionner un chiffre.
  2. Présenter son motif et le point décimal.
  3. Attendre un court intervalle.
  4. Passer au chiffre suivant.

La persistance rétinienne fait apparaître les quatre chiffres allumés.

Les segments et commandes de chiffres sont actifs à l'état bas. Confirmez toujours l'ordre des bits et la polarité dans le manuel.

Décodeur hexadécimal

with hex_i select
  segments_o <=
    "1000000" when x"0",
    "1111001" when x"1",
    "0100100" when x"2",
    "0110000" when x"3",
    "0011001" when x"4",
    "0010010" when x"5",
    "0000010" when x"6",
    "1111000" when x"7",
    "0000000" when x"8",
    "0010000" when x"9",
    "0001000" when x"A",
    "0000011" when x"B",
    "1000110" when x"C",
    "0100001" when x"D",
    "0000110" when x"E",
    "0001110" when x"F",
    "1111111" when others;

Cette table suppose l'ordre abcdefg et des sorties actives à zéro. Inversez volontairement si votre vecteur vaut gfedcba.

Fréquence de balayage

Pour rafraîchir l'affichage complet à 1 kHz :

  • chaque chiffre revient toutes les 1 ms ;
  • la sélection change à 4 kHz ;
  • à 100 MHz, l'intervalle vaut 25 000 cycles.

Générez une validation à 4 kHz, pas une horloge logique de 4 kHz.

LED RGB

Chaque couleur se commande indépendamment. Une PWM règle la luminosité :

red_o <= '1' when pwm_counter_q < red_level_i else '0';

Vérifiez la polarité électrique de la carte.

UART

Pour un émetteur :

  1. Ligne au repos à 1.
  2. Bit de départ à 0.
  3. Données, bit de poids faible d'abord.
  4. Parité éventuelle.
  5. Un ou plusieurs bits d'arrêt à 1.

À 115 200 bauds avec 100 MHz :

100 000 000 / 115 200 = 868,0556

Un diviseur entier de 868 produit une petite erreur. Un accumulateur de phase améliore la précision. La réception est asynchrone : synchronisez l'entrée et échantillonnez près du centre du bit, souvent par suréchantillonnage.

VGA

Un contrôleur VGA nécessite :

  • une horloge ou validation pixel adaptée ;
  • des compteurs horizontal et vertical ;
  • des impulsions de synchronisation ;
  • la détection de la zone active ;
  • les composantes rouge, verte et bleue.

C'est un bon projet intermédiaire car compteurs, horloge et moniteur doivent respecter les mêmes paramètres.

Pmod

Avant de connecter un module :

  • vérifier tension et standard électrique ;
  • identifier le sens des broches ;
  • relier les masses ;
  • respecter le courant maximum ;
  • synchroniser les entrées numériques asynchrones ;
  • contraindre les interfaces externes synchrones.

Principe d'interface

Placez les préoccupations physiques dans une fine couche supérieure :

broches/XDC ↔ board_top ↔ interface logique synchronisée ↔ cœur réutilisable

Le cœur n'a pas besoin de connaître le rebond d'un bouton ou la polarité d'une anode.