Registre à Décalage Bidirectionnel N bits en Verilog – Conception et Implémentation
En électronique numérique, un registre à décalage est une cascade de bascules où la broche de sortie q d'une bascule est connectée à l'entrée de donnée (d) de la suivante. Comme toutes les bascules travaillent sur la même horloge, le tableau de bits stocké dans le registre à décalage se décalera d'une position. Par exemple, si un registre à décalage vers la droite de 5 bits a une valeur initiale de 10110 et que l'entrée est reliée à 0, le motif suivant sera 01011, puis 00101.
Conception
Cette conception de registre à décalage a cinq entrées et une sortie de n bits, et est paramétrée via parameter MSB pour signifier la largeur du registre. Si n est 4, il devient un registre à décalage 4 bits ; si n est 8, un registre 8 bits.
Ce registre à décalage possède quelques caractéristiques clés :
- Peut être activé ou désactivé en pilotant la broche
ende la conception - Peut décaler vers la gauche ainsi que vers la droite lorsque
direst piloté - Si
rstnest mis à bas, il réinitialisera le registre et la sortie deviendra 0 - La valeur de donnée d'entrée du registre peut être contrôlée par la broche
d
module shift_reg #(parameter MSB=8) (
input d, // Entrée de donnée pour la première bascule du registre
input clk, // Horloge pour toutes les bascules du registre
input en, // Activation pour activer/désactiver le registre
input dir, // Direction de décalage : gauche ou droite
input rstn, // Réinitialisation pour remettre le registre à une valeur par défaut
output reg [MSB-1:0] out // Sortie pour lire la valeur courante de toutes les bascules
);
// Ce bloc always est déclenché au front montant de l'horloge
// Vérifie d'abord si la réinitialisation est 0, si oui réinitialise le registre
// Sinon, vérifie si le registre est activé
// Si non => maintient la sortie précédente. Si oui, décale selon la direction demandée
always @ (posedge clk)
if (!rstn) out <= 0;
else begin
if (en) case (dir)
0 : out <= {out[MSB-2:0], d}; // Décalage vers la droite
1 : out <= {d, out[MSB-1:1]}; // Décalage vers la gauche
endcase
else out <= out;
end
endmodule
Schéma matériel
Testbench
Le testbench est utilisé pour vérifier la fonctionnalité de ce registre à décalage. La conception est instanciée dans le module module de niveau supérieur et les entrées sont pilotées avec différentes valeurs. Le comportement de la conception pour chacune des entrées peut être observé à la broche de sortie out.
module tb_sr;
parameter MSB = 16; // [Optionnel] Paramètre pour représenter le nombre de bits du registre
reg data; // Variable pour piloter l'entrée d de la conception
reg clk; // Variable pour piloter l'horloge
reg en; // Variable pour piloter l'activation
reg dir; // Variable pour piloter la direction du décalage
reg rstn; // Variable pour piloter la réinitialisation
wire [MSB-1:0] out; // Wire pour capturer la sortie de la conception
// Instanciation de la conception (registre à décalage 16 bits) en passant MSB
shift_reg #(MSB) sr0 (
.d (data), .clk (clk), .en (en), .dir (dir), .rstn (rstn), .out (out)
);
// Génération d'horloge : période = 20ns, fréquence => 50MHz
always #10 clk = ~clk;
// Initialisation des variables à leurs valeurs par défaut à l'instant 0
initial begin
clk <= 0;
en <= 0;
dir <= 0;
rstn <= 0;
data <= 'h1;
end
// Stimulus principal pour vérifier le fonctionnement
initial begin
// 1. Applique la réinitialisation et la désactive après un certain temps
rstn <= 0;
#20 rstn <= 1;
en <= 1;
// 2. Pendant 7 cycles d'horloge, pilote des valeurs alternatives sur la broche data
repeat (7) @ (posedge clk) data <= ~data;
// 4. Change la direction et pilote des valeurs alternatives pendant 7 autres cycles
#10 dir <= 1;
repeat (7) @ (posedge clk) data <= ~data;
// 5. Ne pilote rien pendant les 7 cycles suivants, laisse le registre simplement décaler
repeat (7) @ (posedge clk);
// 6. Termine la simulation
$finish;
end
// Surveille les valeurs de ces variables et les affiche dans le fichier log pour le débogage
initial $monitor ("rstn=%0b data=%b, en=%0b, dir=%0b, out=%b", rstn, data, en, dir, out);
endmodule
Le moment où le registre à décalage est activé est mis en surbrillance en vert dans le journal ci-dessous. Le moment où il change de direction est mis en surbrillance en jaune. Le moment où la broche d'entrée de données reste constante est mis en surbrillance en bleu.
Journal de simulation
ncsim> run rstn=0 data=1, en=0, dir=0, out=xxxxxxxxxxxxxxxx rstn=0 data=1, en=0, dir=0, out=0000000000000000 rstn=1 data=1, en=1, dir=0, out=0000000000000000 rstn=1 data=0, en=1, dir=0, out=0000000000000001 rstn=1 data=1, en=1, dir=0, out=0000000000000010 rstn=1 data=0, en=1, dir=0, out=0000000000000101 rstn=1 data=1, en=1, dir=0, out=0000000000001010 rstn=1 data=0, en=1, dir=0, out=0000000000010101 rstn=1 data=1, en=1, dir=0, out=0000000000101010 rstn=1 data=0, en=1, dir=0, out=0000000001010101 rstn=1 data=0, en=1, dir=1, out=0000000001010101 rstn=1 data=1, en=1, dir=1, out=0000000000101010 rstn=1 data=0, en=1, dir=1, out=1000000000010101 rstn=1 data=1, en=1, dir=1, out=0100000000001010 rstn=1 data=0, en=1, dir=1, out=1010000000000101 rstn=1 data=1, en=1, dir=1, out=0101000000000010 rstn=1 data=0, en=1, dir=1, out=1010100000000001 rstn=1 data=1, en=1, dir=1, out=0101010000000000 rstn=1 data=1, en=1, dir=1, out=1010101000000000 rstn=1 data=1, en=1, dir=1, out=1101010100000000 rstn=1 data=1, en=1, dir=1, out=1110101010000000 rstn=1 data=1, en=1, dir=1, out=1111010101000000 rstn=1 data=1, en=1, dir=1, out=1111101010100000 rstn=1 data=1, en=1, dir=1, out=1111110101010000 rstn=1 data=1, en=1, dir=1, out=1111111010101000 Simulation complete via $finish(1) at time 430 NS + 0
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
- Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage