[FPGA] Créer un circuit logique pour faire un compteur
par
, 08/08/2022 à 08h00 (2492 Affichages)
Notre compteur N bits en free running se contente d’incrémenter une valeur (interne) à chaque front montant du signal d’horloge CLK. Codée sur N bits, la valeur count du compteur peut évoluer entre 0 et 2N-1, puis reprend à zéro après débordement. Le comptage est bloqué si le signal ENA (Enable) est à l’état bas. Sur une impulsion du signal SCLR (Synchronous Clear), la valeur du compteur est forcée à zéro. Une impulsion est délivrée sur la sortie TC (Terminal Count) lorsque la valeur maximale 2N-1 est atteinte.
Exemple de simulation pour un compteur 3 bits :
Les fonctionnalités d’un compteur peuvent être étendues avec d’autres signaux de contrôle pour compter dans les deux sens, compter/décompter en free running ou sur événement, signaler une valeur nulle ou un débordement du compteur, réinitialiser sa valeur, bloquer et reprendre le comptage/décomptage, capturer une valeur du compteur, et la comparer à une autre valeur, etc.
Par exemple, connaître l’évolution d’un compteur entre deux événements permet de déterminer la durée entre ces deux événements, connaissant la fréquence de l’horloge CLK. (Pensez à un capteur à ultrason pour mesurer une distance d’un obstacle où un compteur part de zéro au moment de l’émission du train d’ultrasons, et sa valeur relevée au retour du train après réflexion par l’obstacle).
Avec notre version simplifiée, on sait qu’avec une horloge à 50MHz et un compteur 19 bits (N=19), le signal TC délivre une impulsion au bout de (1/50.106)x219=10,49ms (si le compteur part de zéro et n’est pas interrompu).
On donne le code Verilog du module counter.v :
Code verilog : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 module counter (CLK, ENA, SCLR, TC); parameter N = 3; // compteur N bits, valeur N par défaut input CLK, // horloge 'clock' ENA, // enable SCLR; // synchronous clear output TC; // terminal count reg [N-1 : 0] count; // compteur N bits assign TC = (count == {N{1'b1}}); // concaténation de 1 en binaire, N fois always @(posedge CLK) begin // sur front montant de l'horloge if (SCLR) count <= 0; // synchronous clear else begin if (ENA) count <= count + 1'b1; end end endmodule
Ci-dessous, une représentation des éléments synthétisés pour notre compteur 3 bits :
Bilan de la synthèse : 3 « registres » (count[0], count[1] et count[2]) ont été mobilisés, en fait une bascule D par bit du compteur, et 5 autres éléments logiques (LOGIC_CELL_COMB) qui sont des LookUp Tables (LUT).
La copie d’écran montre en surbrillance le détail de la configuration de la LUT qui alimente la sortie TC (Terminal Count). C’est la LUT la plus facile à analyser, on voit que la sortie TC est à 1 lorsque les 3 bits du compteur sont aussi à 1 (configuration en cellule ET à 3 entrées).
L’analyse complète du circuit reste un bel exercice de logique séquentielle, mais on préférera sans doute faire confiance à sa description par un langage HDL et au synthétiseur
Billet précédent [FPGA] Créer un circuit logique pour détecter les fronts d’un signal