📜  Verilog | D触发器

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

D触发器

D触发器是在时钟给定边沿跟随输入引脚d的顺序元件。 D触发器是数字逻辑电路中的基本组件。

实现了两种类型的D型触发器:上升沿D型触发器和下降沿D型触发器。

D触发器是一个边沿触发的存储设备,当其时钟输入发生有效边沿跳变时,会将其D输入上的信号值传输到Q输出。然后,输出值一直保持到下一个有效时钟周期为止。

使用边沿触发的always语句来推断触发器。通过在事件列表中包含posegenegedge子句,可以始终触发always语句。以下是一些顺序Always语句的示例,例如:

always @(posedge Clock)
always @(negedge Clock)
always @(posedge Clock or posedge Reset)
always @(posedge Clock or negedge Reset)
always @(negedge Clock or posedge Reset)
always @(negedge Clock or negedge Reset)

如果异步复位触发器被建模,需要在语句的事件列表中的第二posedgenegedge条款。同样,大多数综合工具都要求必须在Always语句之后的if语句中或在begin之后(如果它位于顺序的begin-end块中)使用reset。

//Active low asynchronous reset
       always @(posedge Clock or negedge Reset)
       begin
            if (!Reset)
            …….
            ……..
end

设计1:具有异步低电平有效复位

module dff (input d,
              input rstn,
              input clk,
              output reg q);

    always @ (posedge clk or negedge rstn)
       if (!rstn)
          q <= 0;
       else
          q <= d;
endmodule

硬件原理图

试验台

module tb_dff;
    reg clk;
    reg d;
    reg rstn;
    reg [2:0] delay;

    dff  dff0 ( .d(d),
                .rsnt (rstn),
                .clk (clk),
                .q (q));

    // Generate clock
    always #10 clk = ~clk;

    // Testcase
    initial begin
        clk <= 0;
        d <= 0;
        rstn <= 0;

        #15 d <= 1;
        #10 rstn <= 1;
        for (int i = 0; i < 5; i=i+1) begin
            delay = $random;
            #(delay) d <= i;
        end
    end
endmodule

设计2:具有同步低电平有效复位

module dff (input d,
              input rstn,
              input clk,
              output reg q);

    always @ (posedge clk)
       if (!rstn)
          q <= 0;
       else
          q <= d;
endmodule

硬件原理图

试验台

module tb_dff;
    reg clk;
    reg d;
    reg rstn;
    reg [2:0] delay;

    dff  dff0 ( .d(d),
                .rsnt (rstn),
                .clk (clk),
                .q (q));

    // Generate clock
    always #10 clk = ~clk;

    // Testcase
    initial begin
        clk <= 0;
        d <= 0;
        rstn <= 0;

        #15 d <= 1;
        #10 rstn <= 1;
        for (int i = 0; i < 5; i=i+1) begin
            delay = $random;
            #(delay) d <= i;
        end
    end
endmodule