📅  最后修改于: 2021-01-11 15:09:14             🧑  作者: Mango
触发器在时钟的负或正沿捕获其输入处的数据。重要的是,在时钟沿之后直到下一个时钟沿的任何数据变化都不会反映在输出中。
锁存器不会在时钟的边缘捕获;相反,只要声明输出,输出就会跟随输入。
D锁存器用于存储一位数据。 D锁存器本质上是门控SR锁存器的修改。
下图显示了Verilog中D锁存器的参数。输入D是要存储的数据。输入G用于控制存储。输出Q和Qn分别是存储的数据和存储的数据的补码。
在此示例中,我们有一个具有三个输入和一个输出的锁存器。输入d表示数据,可以为0或1, rstn表示低电平有效复位,而en表示使能,用于使输入数据锁存至输出。
复位为低电平有效意味着该输入变为0时将复位设计元素,或当其值为低电平时复位为有效。输出q的值由输入d,en和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 the 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
注意:Always块的灵敏度列表包含更新输出所需的所有信号。
每当灵敏度列表中的任何信号更改其值时,都会触发此块。同样,仅当en高时q才得到d的值,因此是正锁存器。
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
为了使测试台以更随机的方式断言和置低信号,我们声明了一个名为delay的reg变量,大小为3位,以便它可以取0到7之间的任何值。然后使用delay变量来延迟d的赋值和连接在每个循环得到不同的图案。
上面的代码产生以下输出,例如:
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.