如何理解D触发器

D触发器在FPGA里用得很多,但我经常无法理解D触发器为什么能对数据延迟一个时钟周期(打一拍)。下面从信号处理的角度来谈一下我的理解。如发现理解有误,烦请留言指正。

D触发器形如:

`timescale 1ns/1ps
module d_flip_flop(
    input clk,
    input rst_n,
    input d,
    output reg q
  );

    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
        begin
            q <= 1'b0;
        end else begin
            q <= d;
        end
    end
endmodule

时序图如下:

如何理解D触发器_第1张图片

解读如下:

        D触发器在时钟CLK上升沿采样,数据D在建立保持时间Tsu和Th内需要稳定不变,否则出现亚稳态!我们在这个时间“窗口”内采样到的数据即为D触发器采样到的数据,经过Tco(其中Tco < Th)的时间后,D触发器就会输出上述采样到的数据D,并且该数据会保持一个时钟周期T不变。

       为什么会有延迟一个时钟周期(打一拍)的效果呢?原因是,如果两个D触发器分别对D和D’这两个数据采样,则这两个触发器输出的结果将会一致的,即均为上图的Q!对比D’和Q会发现:Q比D’延迟了一个时钟,所以才会说对信号D延迟了一个时钟周期。

      D触发器是无法识别数据D在时钟上升沿后肆意变化的那部分(因为D触发器在非触发沿时是保持输出不变,而不会再采样数据的),所以才导致在D触发器看来D和D’是一模一样的信号!!      

      最后,有如下结论:
            1.数据D在建立保持时间窗口内必须保持稳定,D触发器采样到的就是该稳定数据。
            2.D触发器采样后,经过Tco时间后即可输出到Q
            3.保持时间过后,如果数据变化了,D触发器无法感知
            4.Tco < Th,且 Th很小,均由fpga器件型号决定                                                                                                                            根据前3条,我们可以在仿真时认为,D触发器一直对CLK上升沿左边的信号进行采样,并保持一个时钟周期T的时间,因为一直采样的是前一刻(上一个T)数据D的值,并且保持T,所以长远来看,D触发器对数据D延迟了一个时间周期!

 

你可能感兴趣的:(FPGA)