边沿检测的底层逻辑就是把上一时刻的值与当前时刻的值进行比较。若上一时刻的值为0,当前时刻的值为1,则为上升沿;同理,上一时刻的值为1,当前时刻的值为0,则为下降沿。
最常用的实现边沿检测的方法就是连接两级D触发器,如图所示:
这种方法适用于大多数情况的边沿检测,代码如下:
reg data;
reg [1:0] edge_reg;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
edge_reg <= 2'd0;
else begin
edge_reg <= {edge_reg[0],data};
end
wire pedge_flag;
assign pedge_flag= (edge_reg== 2'b01);
wire nedge_flag;
assign nedge_flag= (edge_reg== 2'b10);
当然,为了减轻亚稳态对边沿检测时的干扰,还可以用三级D触发器互相连接来进行边沿检测,如图所示:
这种方法稳定性会更强一些,代码如下:
reg data;
reg [2:0] edge_reg;
always@(posedge Clk)
edge_reg<= {edge_reg[1:0],data};
wire pedge_flag;
wire nedge_flag;
assign pedge_flag= (pedge_flag[2:1] == 2'b01);
assign nedge_flag= (nedge_flag[2:1] == 2'b10);