Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> VHDL

Contrôleur d'affichage VHDL double à 7 segments pour SSD Pmod – Intégration FPGA facile

Dans cet article, je vais vous présenter un module VHDL capable d'afficher un numéro à deux chiffres sur le SSD Pmod :Seven-segment Display de Digilent. Le double afficheur 7 segments est compatible avec l'interface Pmod, ce qui signifie que vous pouvez l'utiliser sans aucune soudure. Il s'insère dans le connecteur Pmod, qui est standard sur de nombreuses cartes de développement FPGA.

Pour tester l'implémentation VHDL, j'utilise le Lattice iCEstick, une carte de développement FPGA à faible coût avec un connecteur Pmod. En plus de l'iCEstick, vous avez besoin d'un câble répartiteur Pmod 2 × 6 broches vers double 6 broches pour passer du connecteur Pmod parallèle de l'iCEstick à la version en série de la prise attendue par l'écran à 7 segments. Enfin, je recommande de vous procurer une rallonge USB type A car brancher l'iCEstick directement sur le port USB de l'ordinateur n'est pas pratique.

Fonctionnement des écrans à 7 segments

Il existe de nombreux écrans 7 segments différents sur le marché. Le nombre de chiffres varie entre eux, tout comme l'interface physique et le brochage. Une solution générique couvrant tous les écrans à 7 segments possibles que vous pourriez rencontrer ne serait probablement pas très conviviale. Vous pouvez cependant vous baser sur le code présenté dans cet article et le modifier selon vos besoins.

L'image ci-dessus provient de la fiche technique du module Digilent Pmod. Il montre comment l'affichage à 7 segments se connecte aux broches Pmod. Ces broches sont directement accessibles au FPGA sur l'iCEstick.

Sept des broches contrôlent chacune un segment sur l'écran. En pilotant une valeur logique élevée sur une telle broche, le segment correspondant s'allumera sur l'écran. Mais il y a deux chiffres sur cet écran, et nous ne pouvons en contrôler qu’un à la fois. La broche P4/C du connecteur J2 sélectionne l'un ou l'autre chiffre. Lorsque la tension logique sur cette broche est '0' , le chiffre de droite s'allume, s'il s'agit de '1' , le chiffre de gauche est activé.

Le point décimal « DP » n'est pas connecté et n'est pas accessible.

L'entité

Le code ci-dessous montre l'entité de notre module seg7 VHDL. L'entité possède un port générique avec une constante nommée clk_cnt_bits . Il définit la longueur d'un compteur interne qui contrôle le taux de rafraîchissement de l'affichage, la fréquence d'alternance entre les chiffres gauche et droit.

La fréquence exacte n'est pas essentielle. Sélectionnez une longueur de compteur comprise entre 50 et quelques centaines de Hertz. La formule qui détermine le taux de rafraîchissement est refresh_hz =2clk_cnt_bits / clk_hz .

entity seg7 is
 generic (
 -- refresh_hz = (2 ** clk_cnt_bits) / clk_hz
 clk_cnt_bits : integer
 );
 port (
 clk : in std_logic;
 rst : in std_logic;
 value : in integer range 0 to 99;
 segments : out std_logic_vector(6 downto 0);
 digit_sel : out std_logic
 );
end seg7;

En plus de l'horloge et de la réinitialisation, l'entité dispose d'un signal d'entrée :la valeur à afficher sur l'afficheur à 7 segments. Le value signal est un type entier limité à la plage de 0 à 99 car ce sont les seules valeurs numériques qu'il est possible d'afficher en utilisant seulement deux chiffres.

Les signaux de sortie sont les sept segments sous forme de vecteur et le signal de sélection de chiffres pour choisir le chiffre gauche ou droit à éclairer.

Représentant une décimale codée en binaire

Pour représenter les chiffres affichés à l'écran, nous utiliserons le format connu sous le nom de décimal codé binaire (BCD). Bien qu'une représentation binaire soit le moyen le plus efficace de stocker le nombre décimal, nous rencontrons des problèmes lorsque nous essayons de le diviser en chiffres gauche et droit pour l'afficher à l'écran. Nous ne pouvons pas distinguer les chiffres décimaux simplement en découpant le vecteur utilisé pour stocker le nombre.

subtype digit_type is integer range 0 to 9;
type digits_type is array (1 downto 0) of digit_type;
signal digit : digit_type;
signal digits : digits_type;

Comme le montre le code ci-dessus, nous déclarons un sous-type de l'entier compris entre 0 et 9 pour décrire la valeur qui peut être représentée par un chiffre décimal. Ensuite, nous déclarons un nouveau type de tableau pouvant contenir deux de ces valeurs BCD. Le digit Le signal contient le numéro actuellement affiché sur le côté gauche ou droit de l’écran. Par contre, le digits Le signal contient les caractères décimaux individuels pour les deux chiffres, tels qu'ils apparaîtront à une personne regardant l'écran.

Convertir le nombre décimal en BCD

L'entrée de ce module, value , est un entier compris entre 0 et 99, une représentation binaire du nombre. Nous devons convertir cet entier unique en deux entiers compris entre 0 et 9, les BCD.

L'algorithme standard pour cela est Double Dabble, également connu sous le nom de shift-and-add-3. algorithme. Bien que cela soit acceptable, j'opterai pour une solution plus courte dans notre cas car nous n'avons que deux chiffres à séparer.

digits(1) <= value / 10;
digits(0) <= value - ((value / 10) * 10);

En utilisant la division entière comme indiqué dans le code ci-dessus, nous pouvons isoler le chiffre décimal le plus significatif et l'attribuer au digits(1). signaler. Pour récupérer le chiffre le moins significatif, nous pouvons soustraire le chiffre le plus significatif du value signal, nous laissant seulement le numéro à attribuer au digits(0) signal.

Comptage des cycles d'horloge

Le retardement du temps dans les FPGA consiste simplement à compter les cycles d'horloge. La période d'horloge est le seul intervalle de temps prévisible sur lequel vous pouvez compter dans votre code VHDL. Le code ci-dessous montre le clk_count signal, que nous utilisons pour compter les cycles d’horloge. Le clk_cnt_bits générique détermine le nombre de bits à réserver pour ce signal non signé.

signal clk_cnt : unsigned(clk_cnt_bits - 1 downto 0);

Le taux de rafraîchissement exact de l’écran a moins d’importance, c’est pourquoi j’ai opté ici pour un type non signé. Cela nous permet d'utiliser le comportement d'auto-enroulement du signal non signé. Il suffit d'incrémenter le compteur à chaque front montant de l'horloge. Le code ci-dessous montre le processus synchrone avec réinitialisation qui s'en charge.

COUNT_PROC : process(clk)
begin
 if rising_edge(clk) then
 if rst = '1' then
 clk_cnt <= (others => '0');
 
 else
 clk_cnt <= clk_cnt + 1;
 
 end if;
 end if;
end process;

Alterner entre les chiffres

Maintenant que le compteur libre fonctionne, nous pouvons utiliser le bit le plus significatif (MSB) du signal du compteur non signé pour basculer entre les deux chiffres. Le MSB alterne entre '0' et '1' avec un cycle de service de 50%. La première ligne du code ci-dessous définit le digit_sel signal basé sur la valeur du MSB. La deuxième ligne implémente un multiplexeur avec le MSB utilisé comme sélecteur. Il transmettra la valeur du chiffre actif du digits tableau au digit signal.

digit_sel <= clk_cnt(clk_cnt'high);
digit <= digits(0) when clk_cnt(clk_cnt'high) = '0' else digits(1);

BCD vers encodeur 7 segments


La dernière étape du module seg7 consiste à traduire le BCD stocké dans le digit signal à une représentation visuelle sur l’affichage à 7 segments. Le code ci-dessous montre un processus qui permet d'y parvenir en utilisant une instruction case.

La position dans le vecteur de chaque bit littéral correspond à un segment sur l'écran. L'index 0 est égal au segment A, l'index 1 est B, et ainsi de suite, jusqu'à l'index 6, qui contrôle le segment G. Les mappages des segments aux index vectoriels sont dérivés de la fiche technique de l'affichage Digilent à 7 segments.

ENCODER_PROC : process(digit)
begin
 case digit is
 
 when 0 => segments <= "0111111";
 when 1 => segments <= "0000110";
 when 2 => segments <= "1011011";
 when 3 => segments <= "1001111";
 when 4 => segments <= "1100110";
 when 5 => segments <= "1101101";
 when 6 => segments <= "1111101";
 when 7 => segments <= "0000111";
 when 8 => segments <= "1111111";
 when 9 => segments <= "1101111";
 
 end case;
end process;

La sortie

Le module seg7 VHDL restituera à l'écran tout ce que vous attribuez au value signal d’entrée. Dans le banc de test, nous incrémentons le value signal une fois par seconde. Ensuite, on simule un peu plus de 100 secondes pour pouvoir observer le point de retour à la ligne du value compteur.

La forme d'onde ci-dessus provient de ModelSim. Il montre la première partie de la simulation, où la valeur a compté de 0 à 15. Nous pouvons voir que les nombres dans le digits le tableau compte également. Ceux (0) comptent à chaque fois les value le signal change, tandis que les dizaines (1) incrémenter tous les dix chiffres.

Vous pouvez télécharger le projet ModelSim, y compris le banc de test, en utilisant le formulaire ci-dessous.

Si vous implémentez le module seg7 comme module supérieur sur le FPGA, l'écran affichera très probablement un « 00 » stable. C'est parce que '0' est la valeur par défaut la plus courante donnée aux signaux non initialisés dans les FPGA. Lorsque le value le signal est réglé sur tous les zéros, l'écran affichera exactement cela.

Pour parcourir tous les nombres d'entrée possibles, j'ai créé un module wrapper VHDL qui incrémente le value signal dix fois par seconde. J'ai ensuite instancié le module seg7 dans le wrapper avant d'implémenter la conception sur le Lattice iCEstick. La vidéo Gif en boucle ci-dessous montre à quoi ressemble la conception mise en œuvre sur l'affichage à 7 segments.

Acheter le SSD Pmod :affichage à sept segments

L'affichage à 7 segments utilisé dans cet article de blog provient de Digilent. Vous pouvez acheter le module Pmod sur la boutique en ligne Digilent ou l'obtenir auprès de l'un des nombreux revendeurs. Dans la liste ci-dessous, j'ai créé un lien vers la page du produit pour l'affichage dans quelques magasins d'électronique en ligne qui proposent l'article.

Veuillez noter que si vous souhaitez utiliser l'afficheur Digilent à 7 segments avec le Lattice iCEstick , ou toute autre carte de développement FPGA dotée d'un connecteur Pmod 6 × 2 broches, vous avez également besoin d'un câble répartiteur. Le câble est disponible auprès de Digilent , Digi-clé , Mouser , et RS Electronics .

De plus, tous les composants sont disponibles auprès de différents vendeurs sur Amazon et eBay.

Cours VHDL utilisant l'afficheur Digilent à 7 segments

J'ai lancé un nouveau cours VHDL et FPGA pour les débutants absolus. Dans le cours, j'utilise l'écran 7 segments de Digilent et la carte de développement FPGA Lattice iCEstick pour l'enseignement du VHDL. Cliquez sur le lien ci-dessous pour en savoir plus sur le cours !

Fast-Track FPGA et VHDL :

Pratique pour les débutants absolus

Vous êtes familier avec la programmation mais vous débutez avec le VHDL ?

Avez-vous besoin d'une brève introduction à ce sujet peu familier ?

Votre emploi du temps est chargé et il ne vous reste plus de temps pour étudier ?

Comprenez les bases du développement FPGA en VHDL en quelques soirées ! Ce cours s'adresse aux professionnels de l'informatique et aux étudiants qui ont besoin d'un aperçu rapide du sujet. Avec ce cours et la carte de développement Lattice iCEstick à faible coût, vous développerez du matériel réel en quelques heures.

Cliquez ici pour en savoir plus et vous inscrire :
Fast-Track FPGA et VHDL :pratique pour les débutants absolus


VHDL

  1. Fichier de stimulation lu dans testbench à l'aide de TEXTIO
  2. Automatisez le développement FPGA avec Jenkins, Vivado et GitHub sur un VPS Linux
  3. Comment utiliser une procédure dans un processus en VHDL
  4. Quiz VHDL de base – partie 3
  5. Comment créer un effet LED respirant à l'aide d'une onde sinusoïdale stockée dans le bloc RAM
  6. Comment créer votre premier programme VHDL :Hello World !
  7. Comment utiliser le type VHDL le plus courant :std_logic
  8. Comment créer un processus avec une liste de sensibilité en VHDL
  9. Cours FPGA – Tout ce que vous devez savoir sur le cours Dot Matrix VHDL