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
- Recharger, réinitialiser, reconfigurer
- Compteur binaire 3 bits
- Compteurs synchrones
- Module de compteur
- Convergence IT/OT :une opportunité pour une réinitialisation culturelle
- Compteur Python dans les collections avec exemple
- Compteur Verilog Mod-N
- Comptoir gris Verilog
- Erreurs PID :Réinitialiser Windup