简介
边沿检测指的是检测一个信号的上升沿或者下降沿,如果发现上升沿或者下降沿,则给出一个信号指示出来。
边沿检测电路分为:上升沿检测电路,下降沿检测电路,双沿检测电路。
实现方法
- 直接上图分析,例:上升沿检测电路
检测信号data的上升沿,即data_posedge。把信号data寄存一拍,得到data_delay,然后取反在与data相与得到data_posedge:
assign D_posedge = Data & (~data1);//检测上升沿
同理:
assign D_negedge = ~Data & (data1);//检测下降沿
assign D_po_ne = Data ^ data1;//检测双沿
- 比方法1更容易理解,本质一样:使用两级寄存器,第二级寄存器(由D触发器组成)锁存某一时钟沿有效时的输入电平,第一级寄存器锁存住下一时钟沿有效时对应的输入电平。若两次锁存信号不一样,说明检测到了边沿。
具体是上升沿/下降沿/双沿 同样由组合逻辑实现
assign data_posedge = (data1 && ~data2) ? 1 : 0;//上升沿
assign data_negedge = (~data1 && data2) ? 1 : 0; //下降沿
assign data_posedge = {(data1 && ~data2) | (~data1 && data2)} ? 1 : 0;//双沿
设计代码(法1)
module edge_detect(Clk,Rst_n,Data,D_posedge,D_negedge,D_po_ne);
input Clk;
input Rst_n;
input Data;
output D_posedge;
output D_negedge;
output D_po_ne;
reg data1;
always@(posedge Clk or negedge Rst_n)begin
if(!Rst_n)
data1 <= 1'b0;
else
data1 <= Data; //一级触发器
end
assign D_posedge = Data & (~data1);
assign D_negedge = ~Data & (data1);
assign D_po_ne = Data ^ data1;
endmodule
测试代码
`timescale 1ns/1ps
module edge_detect_tb();
reg clk;
reg rst;
reg dat;
wire D_po;
wire D_ne;
wire D_po_ne;
initial begin
clk = 1'b0;
rst = 1'b0;
dat = 1'b0;
#200 rst = 1'b1;
#100 dat = 1'b1;
#100 dat = 1'b0;
#100 dat = 1'b1;
#100
$stop;
end
always #10 clk = ~clk;
edge_detect u1(
.Clk(clk),
.Rst_n(rst),
.Data(dat),
.D_posedge(D_po),
.D_negedge(D_ne),
.D_po_ne(D_po_ne)
);
endmodule
仿真结果
法2 参考:边沿检测
注意
实现异步信号边沿检测电路打两拍时,若输入信号data变化刚好发生在clk的建立时间与保持时间之间,第一级寄存器输出可能进入亚稳态,进而影响整个电路。
又因为进入亚稳态到稳定时间不会超过一个周期,所以第二级寄存器会采集到稳定电平,此时增加第三级寄存器,由第二级,第三级寄存器锁存的结果进行边沿检测,这样系统更稳定!
应用
在复杂的逻辑系统设计中,许多情况需检测信号的跳变;如果某个信号跳变,给出一个指示,这个指示用来触发其他动作(类似中断),此时需要一个边沿检测电路。
- 捕获信号的突变(UART,SPI等信号使能突变)。
- 逻辑分析仪中信号的边沿检测。
- 将时钟边沿使能转换为边沿检测使能,使时钟同步化。