Compteur 4 bits : Comptage Binaire Efficace de 0 à 15
Le compteur 4 bits commence à s'incrémenter de 4'b0000 à 4'h1111, puis revient à 4'b0000. Il continuera à compter tant qu'il reçoit une horloge active et que la réinitialisation est maintenue haute.
Le retour à zéro (rollover) se produit lorsque le bit de poids fort de l'addition finale est ignoré. Lorsque le compteur est à sa valeur maximale 4'b1111 et reçoit une demande de comptage supplémentaire, il tente d'atteindre 5'b10000, mais comme il ne supporte que 4 bits, le MSB est rejeté, résultant en 0.
0000 0001 0010 ... 1110 1111 rollover 0000 0001 ...
La conception contient deux entrées : une pour l'horloge et une pour une réinitialisation active basse. Une réinitialisation active basse signifie que la conception est réinitialisée lorsque la valeur de la broche de réinitialisation est 0. Il y a une sortie 4 bits appelée out qui fournit les valeurs du compteur.
Conception du compteur électronique
module counter (
input clk, // Port d'entrée pour l'horloge permettant au compteur de compter
input rstn, // Port d'entrée pour la réinitialisation permettant de remettre le compteur à 0
output reg[3:0] out // Port de sortie 4 bits pour obtenir les valeurs du compteur
);
// Ce bloc always sera déclenché au front montant de clk (0->1)
// Une fois dans ce bloc, il vérifie si la réinitialisation est 0 ; si oui, met out à zéro
// Si la réinitialisation est 1, la conception doit compter, donc incrémente le compteur
always @ (posedge clk) begin
if (! rstn) out <= 0;
else out <= out + 1;
end
endmodule
Le module counter a une horloge et une réinitialisation active basse (dénommée par n) en entrées et la valeur du compteur en sortie 4 bits. Le bloc always est toujours exécuté chaque fois que l'horloge passe de 0 à 1, ce qui signifie un front montant ou positif. La sortie est incrémentée seulement si la réinitialisation est maintenue haute (1), réalisé par le bloc if-else. Si la réinitialisation est trouvée basse au front positif de l'horloge, la sortie est réinitialisée à une valeur par défaut de 4'b0000.
Testbench
Nous pouvons instancier la conception dans notre module testbench pour vérifier que le compteur compte comme prévu.
Le module testbench est nommé tb_counter et les ports ne sont pas requis car c'est le module de niveau supérieur en simulation. Cependant, nous avons besoin de variables internes pour générer, stocker et piloter l'horloge et la réinitialisation. Pour cela, nous avons déclaré deux variables de type reg pour l'horloge et la réinitialisation. Nous avons également besoin d'un net de type wire pour connecter la sortie de la conception, sinon il sera par défaut un net scalaire 1 bit.
L'horloge est générée via un bloc always qui donne une période de 10 unités de temps. Le bloc initial est utilisé pour définir les valeurs initiales de nos variables internes et piloter la valeur de réinitialisation vers la conception. La conception est instanciée dans le testbench et connectée à nos variables internes, de sorte qu'elle reçoit les valeurs quand nous les pilotons depuis le testbench. Nous n'avons pas d'instructions $display dans notre testbench, donc nous ne verrons aucun message dans la console.
module tb_counter;
reg clk; // Variable TB interne pour piloter l'horloge vers la conception
reg rstn; // Variable TB interne pour piloter la réinitialisation active basse
wire [3:0] out; // Wire pour connecter la sortie de la conception
// Instanciation de la conception counter et connexion avec variables TB
counter c0 (
.clk (clk),
.rstn (rstn),
.out (out)
);
// Génération d'une horloge à piloter vers la conception
// Cette horloge inverse sa valeur toutes les 5ns -> période = 10ns -> freq = 100 MHz
always #5 clk = ~clk;
// Ce bloc initial forme le stimulus du testbench
initial begin
// 1. Initialisation des variables TB à 0 au début de la simulation
clk <= 0;
rstn <= 0;
// 2. Pilote le reste du stimulus, la réinitialisation est assertée entre-temps
#20 rstn <= 1;
#80 rstn <= 0;
#50 rstn <= 1;
// 3. Termine le stimulus après 200ns
#20 $finish;
end
endmodule
Journal de simulation
ncsim> run [0ns] clk=0 rstn=0 out=0xx [5ns] clk=1 rstn=0 out=0x0 [10ns] clk=0 rstn=0 out=0x0 [15ns] clk=1 rstn=0 out=0x0 [20ns] clk=0 rstn=1 out=0x0 [25ns] clk=1 rstn=1 out=0x1 [30ns] clk=0 rstn=1 out=0x1 [35ns] clk=1 rstn=1 out=0x2 [40ns] clk=0 rstn=1 out=0x2 [45ns] clk=1 rstn=1 out=0x3 [50ns] clk=0 rstn=1 out=0x3 [55ns] clk=1 rstn=1 out=0x4 [60ns] clk=0 rstn=1 out=0x4 [65ns] clk=1 rstn=1 out=0x5 [70ns] clk=0 rstn=1 out=0x5 [75ns] clk=1 rstn=1 out=0x6 [80ns] clk=0 rstn=1 out=0x6 [85ns] clk=1 rstn=1 out=0x7 [90ns] clk=0 rstn=1 out=0x7 [95ns] clk=1 rstn=1 out=0x8 [100ns] clk=0 rstn=0 out=0x8 [105ns] clk=1 rstn=0 out=0x0 [110ns] clk=0 rstn=0 out=0x0 [115ns] clk=1 rstn=0 out=0x0 [120ns] clk=0 rstn=0 out=0x0 [125ns] clk=1 rstn=0 out=0x0 [130ns] clk=0 rstn=0 out=0x0 [135ns] clk=1 rstn=0 out=0x0 [140ns] clk=0 rstn=0 out=0x0 [145ns] clk=1 rstn=0 out=0x0 [150ns] clk=0 rstn=1 out=0x0 [155ns] clk=1 rstn=1 out=0x1 [160ns] clk=0 rstn=1 out=0x1 [165ns] clk=1 rstn=1 out=0x2 Simulation complete via $finish(1) at time 170 NS + 0
Notez que le compteur revient à 0 lorsque la réinitialisation active basse devient 0, et lorsque la réinitialisation est désactivée vers 150ns, le compteur recommence à compter à la prochaine occurrence du front positif de l'horloge.
Schéma matériel
Verilog
- Recharger, réinitialiser, et reconfigurer votre stratégie IT pour un succès estival
- Compteur binaire 3 bits avec timer 555 et bascules JK 4027
- Compteurs binaires synchrones : Conception, fonctionnement Up/Down et applications encodeurs
- Module de compteur : Algorithmes optimisés pour systèmes modernes
- Convergence IT/OT : un reset culturel pour une transformation digitale durable
- Python Counter dans collections : comptage efficace, mise à jour et opérations arithmétiques
- Conception d'un Compteur Mod-N en Verilog : Module Paramétré et Testbench
- Module Compteur Gray en Verilog – Générateur de Code Gray 4 bits
- Prévenir le windup de réinitialisation PID : stratégies pour un contrôle de processus fiable