D Loquet
Une bascule capture des données à son entrée sur le front positif ou négatif d'une horloge. La chose importante à noter est que tout ce qui arrive aux données après le front d'horloge jusqu'au prochain front d'horloge ne sera pas reflété dans la sortie. Un loquet d'autre part, ne capture pas au bord d'une horloge, à la place la sortie suit l'entrée tant que la broche d'activation est affirmée.
Conception
Dans cet exemple, nous allons construire un verrou qui a trois entrées et une sortie. L'entrée d représente des données qui peuvent être 0 ou 1, rstn signifie active-low reset et en signifie enable qui est utilisé pour verrouiller les données d'entrée sur la sortie. La réinitialisation étant active-basse signifie simplement que l'élément de conception sera réinitialisé lorsque cette entrée passe à 0 ou, en d'autres termes, la réinitialisation est active lorsque sa valeur est basse. La valeur de la sortie q est dicté par les entrées d , fr et rstn .
module d_latch ( input d, // 1-bit input pin for data
input en, // 1-bit input pin for enabling the latch
input rstn, // 1-bit input pin for active-low reset
output reg q); // 1-bit output pin for data output
// This always block is "always" triggered whenever en/rstn/d changes
// If reset is asserted then output will be zero
// Else as long as enable is high, output q follows input d
always @ (en or rstn or d)
if (!rstn)
q <= 0;
else
if (en)
q <= d;
endmodule
Notez que la liste de sensibilité au always
bloc 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 de sensibilité changera de valeur. Aussi q obtiendra la valeur de d uniquement lorsque en est élevé, et donc est positif loquet.
Schéma
Banc de test
module tb_latch;
// Declare variables that can be used to drive values to the design
reg d;
reg en;
reg rstn;
reg [2:0] delay;
reg [1:0] delay2;
integer i;
// Instantiate design and connect design ports with TB signals
d_latch dl0 ( .d (d),
.en (en),
.rstn (rstn),
.q (q));
// This initial block forms the stimulus to test the design
initial begin
$monitor ("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q);
// 1. Initialize testbench variables
d <= 0;
en <= 0;
rstn <= 0;
// 2. Release reset
#10 rstn <= 1;
// 3. Randomly change d and 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 nos signaux d'assertion et d'invalidation de testbench soient plus aléatoires, nous avons déclaré un reg
variable appelée délai de taille 3 bits pour qu'il puisse prendre n'importe quelle valeur de 0 à 7. Puis le délai la variable est utilisée pour retarder l'affectation de d et fr pour obtenir des modèles différents dans chaque boucle.
Sortie
Journal de simulationncsim> 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