Implémenter la logique séquentielle avec les blocs 'always' Verilog
Article précédent montrait exemples bloc always pour logique combinatoire. Bloc always aussi principalement utilisé pour logique séquentielle avec éléments mémoire comme bascules retenant valeurs.
Bascule JK
Bascule JK stocke valeurs avec 2 entrées données j, k, reset rstn, horloge clk. Table de vérité ci-dessous, typiquement implémentée avec portes NAND.
| rstn | j | k | q | Commentaires |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | Reset actif -> sortie toujours 0 |
| 1 | 0 | 0 | Hold | j=k=0 -> sortie inchangée |
| 1 | 0 | 1 | 1 | k=1 -> sortie devient 1 |
| 1 | 1 | 0 | 0 | k=0 -> sortie devient 0 |
| 1 | 1 | 1 | Toggle | j=k=1 -> sortie bascule |
Code Verilog comportemental pour bascule JK :
module jk_ff (input j, k, rstn, clk, output reg q);
always @ (posedge clk or negedge rstn) begin
if (!rstn) q <= 0;
else q <= (j & ~q) | (~k & q);
end
endmodule
Testbench
Déclarer variables testbench, démarrer horloge avec bloc always simple, instancier design, connecter ports. q type wire (connecté sortie design qui le pilote activement). Autres entrées type reg pour pilotage dans bloc procédural initial.
Stimulus : initialise entrées à 0, désactive reset après délai. Boucle for pour piloter j, k valeurs aléatoires à moments aléatoires. Attendre puis finir simulation.
module tb; reg j, k, rstn, clk; wire q; integer i; reg [2:0] dly;
always #10 clk = ~clk;
jk_ff u0 (.j(j), .k(k), .clk(clk), .rstn(rstn), .q(q));
initial begin {j, k, rstn, clk} <= 0; #10 rstn <= 1;
for (i = 0; i < 10; i = i+1) begin dly = $random; #(dly) j <= $random; #(dly) k <= $random; end #20 $finish; end
endmodule
Voir onde simulation : au front montant clk, sortie q change selon état j, k comme table vérité.

Compteur Modulo-10
Compteurs MOD-N comptent jusqu'à N-1 puis rebouclent à zéro. Nécessitent log2N bascules. Code Verilog compteur MOD-10 comptant à chaque horloge tant que reset désactivé. Paramètres Verilog permettent compteur MOD-N plus évolutif.
module mod10_counter (input clk, input rstn, output reg[3:0] out);
always @ (posedge clk) begin
if (!rstn) out <= 0;
else begin if (out == 10) out <= 0; else out <= out + 1; end
end
endmodule
Testbench
Variables déclarées, module instancié, horloge modélisée avec always. Stimulus : valeurs par défaut à 0ns, désactive reset après 10ns, design tourne un moment.
module tb; reg clk, rstn; reg [3:0] out;
mod10_counter u0 (.clk(clk), .rstn(rstn), .out(out));
always #10 clk = ~clk;
initial begin {clk, rstn} <= 0; #10 rstn <= 1; #450 $finish; end
endmodule
Compteur compte 0 à 9, reboucle à 0, recommence.

Registre à décalage gauche 4-bit
Registre à décalage gauche 4-bit : entrée d dans LSB, tous bits décalés gauche de 1. Ex: d=0, valeur initiale 0011 -> 0110 au front suivant.
module lshift_4b_reg (input d, input clk, input rstn, output reg [3:0] out);
always @ (posedge clk) begin
if (!rstn) out <= 0;
else out <= {out[2:0], d};
end
endmodule
Testbench
Template similaire : variables, instanciation, horloge, stimulus. Boucle for 20 itérations valeurs aléatoires pour d.
module tb; reg clk, rstn, d; wire [3:0] out; integer i;
lshift_4b_reg u0 (.d(d), .clk(clk), .rstn(rstn), .out(out));
always #10 clk = ~clk;
initial begin {clk, rstn, d} <= 0; #10 rstn <= 1;
for (i = 0; i < 20; i=i+1) begin @(posedge clk) d <= $random; end #10 $finish; end
endmodule
Chaque bit décalé gauche de 1, nouvelle valeur d appliquée au LSB.

Verilog
- Maîtriser VHDL et Verilog : écrire une logique combinatoire et séquentielle propre
- Circuit avec interrupteur : guide pratique des circuits électriques de base
- Circuits intégrés : fondamentaux des portes logiques numériques
- Automates programmables (PLC) : commande numérique moderne pour systèmes industriels
- Comprendre l'algèbre de Boole : des fondements logiques aux circuits numériques
- Maîtriser la simplification logique avec les cartes de Karnaugh
- 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
- Obtenir des finitions parfaites avec les machines de rectification de précision Okamoto