📜  Verilog D闩锁

📅  最后修改于: 2021-01-11 15:09:14             🧑  作者: Mango

Verilog D闩锁

触发器在时钟的负或正沿捕获其输入处的数据。重要的是,在时钟沿之后直到下一个时钟沿的任何数据变化都不会反映在输出中。

锁存器不会在时钟的边缘捕获;相反,只要声明输出,输出就会跟随输入。

D锁存器用于存储一位数据。 D锁存器本质上是门控SR锁存器的修改。

下图显示了Verilog中D锁存器的参数。输入D是要存储的数据。输入G用于控制存储。输出Q和Qn分别是存储的数据和存储的数据的补码。

在此示例中,我们有一个具有三个输入和一个输出的锁存器。输入d表示数据,可以为0或1, rstn表示低电平有效复位,而en表示使能,用于使输入数据锁存至输出。

复位为低电平有效意味着该输入变为0时将复位设计元素,或当其值为低电平时复位为有效。输出q的值由输入d,enrstn决定

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.