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

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 :

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

  1. Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
  2. Maîtriser la concaténation Verilog : Guide pratique
  3. Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
  4. Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
  5. Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
  6. Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
  7. Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
  8. Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
  9. Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage