
文章来自微信公众号:数字芯片设计
特别备注:作者参加HW实习生要求在5-10分钟写出边沿检测代码
从多级延迟触发器到边沿检测
本文记录一下关于延迟触发器链与它的常用用法(即边沿检测。多级延迟的触发器应该是比较常用的,当我们需要对信号信号进行延时,这个时候我们就用到了延迟触发器链。下面就来记录一下吧。
一、多级延迟触发器(或延迟触发器链)
(1)多级延迟触发器电路
多级延迟触发器,顾明思议就是多个触发器串在一起,对信号进行打拍,一个触发器就延时了一拍,也就是延迟了一个时钟周期。
多级触发器的代码如下所示:
module DFF_N #(parameter N=3)(
input clk,
input reset,
input [N-1:0] D,
output reg [N-1:0] Q
);
reg [N-1:0]d0;
reg [N-1:0]d1;
always@(posedge clk or negedge reset)
if(!reset)begin
d0 <= 0; //异步清 0,低电平有效
d1 <= 0; //异步清 0,低电平有效
Q <= 0; //异步清 0,低电平有效
end
else begin
d0 <= D;
d1 <= d0;
Q <= d1;
end
endmodule
d0 是 D 的延迟一级采样或者称为 D 的延迟一拍信号,同样 d1 是 D 的延迟两拍信号,而 Q 则是 延迟三拍信号。一方面可以通过修改N来改变对多少位的信号的进行延时;另一方面,可以用通过修改部分代码,添加或者减少延迟计数。
代码综合得到的电路(综合之后)如下所示:

电路中显示出三级延时,可以延时三个时钟节拍(也就是三个时钟周期),需要说明的是,上述每一级触发器都包含了3个触发器(对三位数据总线进行延时)。(2)多级延迟触发器的主要用法①简单的延时
多级延迟触发器最原始的作用单纯的对 D 信号做延迟操作,这里就不进行详述。②降低亚稳态往后级传输的概率
如果 D 信号相对 clk 属于不稳定信号,则 Q 和 d1 输出相对 clk 属 于稳定信号,这样就有效地降低了亚稳态往后级传输的概率,多级延时触发器链有时也称为同步器。
可以通过 d1 和 Q 信号获取 D 信号的上升沿或者下降沿,具体介绍如下第二大点所示。二、边沿检测电路
边沿检测,顾名思义,就是检查信号的边沿,当信号的上升沿或者下降沿到来时,获取一个脉冲信号,时序图如下所示:

上图的检测信号同时输出上升沿检测和下降沿检测。那么这个波形怎么来的呢,我们来看看下面几组波形:

可以发现:原始信号与延迟一拍的信号 d0 的反向信号相与,就是上升沿脉冲;
而原始信号取反,然后与延迟一拍信号d0相与就是下降沿脉冲。
如果担心采样不稳定,可以利用延迟两拍的 d1 信号进行相 与。如果担心不定态,还可以将脉冲信号进行锁存。
代码如下所示:
module Shift_Pluse(
input Clk,
input Rstn,
input Shift_In,
output P_Pluse,
output N_Pluse
);
reg Shift_In_1;
reg Shift_In_2;
always@(posedge Clk or negedge Rstn)
begin
if(!Rstn)begin
Shift_In_1 <= 1'b0;
Shift_In_2 <= 1'b0;
end
else begin
Shift_In_1 <= Shift_In;
Shift_In_2 <= Shift_In_1;
end
end
assign P_Pluse = (!Shift_In_2)&Shift_In_1;
assign N_Pluse = (!Shift_In_1)&Shift_In_2;
endmodule
测试代码:
module Shift_Pluse_tb;
reg Clk;
reg Rstn;
reg Shift_In;
wire P_Pluse;
wire N_Pluse;
Shift_Pluse u_Shift_Pluse(
.Clk(Clk),
.Rstn(Rstn),
.Shift_In(Shift_In),
.P_Pluse(P_Pluse),
.N_Pluse(N_Pluse)
);
initial Clk = 1;
always #5 Clk = ~Clk;
initial
begin
Shift_In = 1'b0;
Rstn = 1'b1;
#200;
Rstn = 1'b0;
#100;
Rstn = 1'b1;
#300;
Shift_In = 1'b1;
#300;
Shift_In = 1'b0;
#300;
$finish();
end
endmodule
(反入与延上升沿:取反输入信号之后,再与延迟一拍的输出相与就得到了上升沿) 综合得到的电路如下所示:

这个电路把代码中的Q触发器优化掉了。两个输出信号D_rising_edge 、D_falling_edge分别输出上升沿检测信号脉冲和下降沿检测信号脉冲。
仿真结果

作者:雨人 和 IC_learner
作者博客链接:从多级延迟触发器到边沿检测
