Maîtriser les verrous D : Conception, Fonctionnement et Différences Clés
Une bascule capture la donnée à son entrée au front positif ou négatif d'une horloge. L'important est que ce qui arrive aux données après le front d'horloge jusqu'au prochain front ne se reflétera pas à la sortie. Un verrou (latch), en revanche, ne capture pas au front d'horloge ; au lieu de cela, la sortie suit l'entrée aussi longtemps que la broche d'activation est assertée.
Conception
Dans cet exemple, nous allons construire un verrou avec trois entrées et une sortie. L'entrée d représente la donnée (0 ou 1), rstn signifie réinitialisation active basse et en signifie activation, utilisée pour verrouiller la donnée d'entrée sur la sortie. Une réinitialisation active basse signifie simplement que l'élément de conception sera réinitialisé lorsque cette entrée passe à 0, c'est-à-dire que la réinitialisation est active lorsque sa valeur est basse. La valeur de la sortie q est dictée par les entrées d, en et rstn.
module d_latch (
input d, // Broche d'entrée 1 bit pour la donnée
input en, // Broche d'entrée 1 bit pour activer le verrou
input rstn, // Broche d'entrée 1 bit pour réinitialisation active basse
output reg q // Broche de sortie 1 bit pour la donnée de sortie
);
// Ce bloc always est "toujours" déclenché chaque fois que en/rstn/d change
// Si la réinitialisation est assertée, la sortie sera zéro
// Sinon, tant que l'activation est haute, la sortie q suit l'entrée d
always @ (en or rstn or d)
if (!rstn) q <= 0;
else if (en) q <= d;
endmodule
Notez que la liste de sensibilité du bloc always contient tous les signaux nécessaires pour mettre à jour la sortie. Ce bloc sera déclenché chaque fois que l'un des signaux de la liste change de valeur. De plus, q prendra la valeur de d seulement lorsque en est haut, ce qui en fait un verrou positif.
Schéma
Testbench
module tb_latch;
// Déclaration des variables pour piloter les valeurs vers la conception
reg d;
reg en;
reg rstn;
reg [2:0] delay;
reg [1:0] delay2;
integer i;
// Instanciation de la conception et connexion des ports avec les signaux TB
d_latch dl0 (
.d (d),
.en (en),
.rstn (rstn),
.q (q)
);
// Ce bloc initial forme le stimulus pour tester la conception
initial begin
$monitor ("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q);
// 1. Initialisation des variables du testbench
d <= 0;
en <= 0;
rstn <= 0;
// 2. Libération de la réinitialisation
#10 rstn <= 1;
// 3. Changement aléatoire de d et enable
for (i = 0; i < 5; i=i+1) begin
delay = $random;
delay2 = $random;
#(delay2) en <= ~en;
#(delay) d <= i;
end
end
endmodule
Pour que notre testbench affirme et désaffirme les signaux de manière plus aléatoire, nous avons déclaré une variable reg appelée delay de 3 bits afin qu'elle puisse prendre toute valeur de 0 à 7. Ensuite, la variable delay est utilisée pour retarder l'affectation de d et en afin d'obtenir différents motifs à chaque boucle.
Sortie
Journal de simulation
ncsim> run [0] en=0 d=0 q=0 [11] en=1 d=0 q=0 [18] en=0 d=0 q=0 [19] en=0 d=1 q=0 [20] en=1 d=1 q=1 [25] en=1 d=0 q=0 [27] en=0 d=0 q=0 [32] en=0 d=1 q=0 [33] en=1 d=1 q=1 [34] en=1 d=0 q=0 ncsim: *W,RNQUIE: Simulation is complete.
Cliquez sur l'image pour l'agrandir.
Verilog
- Amplificateur à émetteur commun : Conception, mesure et techniques de rétroaction
- Construction d'un amplificateur différentiel à gain élevé fonctionnant comme un amplificateur opérationnel
- Fondamentaux C# : Entrées et sorties essentielles
- Maîtriser l'entrée/sortie en C++ : Guide pratique
- Maîtriser l'entrée/sortie en C : scanf() et printf() expliqués
- Maîtriser les E/S et l'importation de modules en Python : Guide pratique
- Maîtriser l'entrée/sortie Java : Afficher, lire et formater vos données
- Maîtriser les flux C++ : cout, cin, cerr, clog – Guide pratique
- Maîtriser les entrées/sorties en C : Fonctions standards et fichiers