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

compteur 4 bits

Le compteur 4 bits commence à s'incrémenter de 4'b0000 à 4'h1111, puis revient à 4'b0000. Il continuera à compter tant qu'il est fourni avec une horloge en cours d'exécution et que la réinitialisation est maintenue élevée.

Le roulement se produit lorsque le bit le plus significatif de l'ajout final est supprimé. Lorsque le compteur est à une valeur maximale de 4'b1111 et reçoit une autre demande de comptage, le compteur essaie d'atteindre 5'b10000 mais comme il ne peut prendre en charge que 4 bits, le MSB sera rejeté, ce qui donnera 0.

	0000
	0001
	0010
	...
	1110
	1111
	       rolls over
	0000
	0001
	...

La conception contient deux entrées, une pour l'horloge et une autre pour une réinitialisation active-basse. Une réinitialisation active-basse est une réinitialisation dans laquelle la conception est réinitialisée lorsque la valeur de la broche de réinitialisation est 0. Il existe une sortie 4 bits appelée qui fournit essentiellement les valeurs du compteur.

Conception de compteur électronique

  
  
module counter (  input clk,               // Declare input port for clock to allow counter to count up
                  input rstn,              // Declare input port for reset to allow the counter to be reset to 0 when required
                  output reg[3:0] out);    // Declare 4-bit output port to get the counter values

  // This always block will be triggered at the rising edge of clk (0->1)
  // Once inside this block, it checks if the reset is 0, if yes then change out to zero
  // If reset is 1, then design should be allowed to count up, so increment counter
  always @ (posedge clk) begin
    if (! rstn)
      out <= 0;
    else 
      out <= out + 1;
  end
endmodule

  

Le module le compteur a une horloge et une réinitialisation active-basse (indiquée par n ) comme entrées et la valeur du compteur comme sortie 4 bits. Le always le bloc est toujours exécuté chaque fois que l'horloge passe de 0 à 1, ce qui signifie un front montant ou un front positif. La sortie est incrémentée uniquement si la réinitialisation est maintenue haute ou 1, obtenue par le if-else bloquer. Si la réinitialisation s'avère faible sur le front positif de l'horloge, la sortie est réinitialisée à une valeur par défaut de 4'b0000.

Banc de test

Nous pouvons instancier la conception dans notre module de banc d'essai pour vérifier que le compteur compte comme prévu.

Le module testbench est nommé tb_counter et les ports ne sont pas nécessaires puisqu'il s'agit du module supérieur de la simulation. Cependant, nous avons besoin de variables internes pour générer, stocker et piloter l'horloge et la réinitialiser. Pour cela, nous avons déclaré deux variables de type reg pour l'horloge et la réinitialisation. Nous avons également besoin d'un wire tapez net pour établir la connexion avec la sortie de la conception, sinon il s'agira par défaut d'un réseau scalaire 1 bit.

L'horloge est générée via always bloc qui donnera une période de 10 unités de temps. Le initial Le bloc est utilisé pour définir les valeurs initiales de nos variables internes et piloter la valeur de réinitialisation à la conception. La conception est instanciée dans le testbench et connecté à nos variables internes, de sorte qu'il obtiendra les valeurs lorsque nous les piloterons depuis le testbench. Nous n'avons pas de $display déclarations dans notre testbench et donc nous ne verrons aucun message dans la console.

  
  
module tb_counter;
  reg clk;                     // Declare an internal TB variable called clk to drive clock to the design
  reg rstn;                    // Declare an internal TB variable called rstn to drive active low reset to design
  wire [3:0] out;              // Declare a wire to connect to design output

  // Instantiate counter design and connect with Testbench variables
  counter   c0 ( .clk (clk),
                 .rstn (rstn),
                 .out (out));

  // Generate a clock that should be driven to design
  // This clock will flip its value every 5ns -> time period = 10ns -> freq = 100 MHz
  always #5 clk = ~clk;

  // This initial block forms the stimulus of the testbench
  initial begin
    // 1. Initialize testbench variables to 0 at start of simulation
    clk <= 0;
    rstn <= 0;
    
    // 2. Drive rest of the stimulus, reset is asserted in between
    #20   rstn <= 1;                   
    #80   rstn <= 0;
    #50   rstn <= 1;
    
    // 3. Finish the stimulus after 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 se réinitialise à 0 lorsque la réinitialisation active-bas devient 0, et lorsque la réinitialisation est annulée à environ 150 ns, le compteur commence à compter à partir de la prochaine occurrence du front positif de l'horloge.

Schéma du matériel


Verilog

  1. Recharger, réinitialiser, reconfigurer
  2. Compteur binaire 3 bits
  3. Compteurs synchrones
  4. Module de compteur
  5. Convergence IT/OT :une opportunité pour une réinitialisation culturelle
  6. Compteur Python dans les collections avec exemple
  7. Compteur Verilog Mod-N
  8. Comptoir gris Verilog
  9. Erreurs PID :Réinitialiser Windup