边沿检测电路漏检原因分析
常用结构如下:
c
module edge_detect1(
input clk,
input signal,
output pe, //上升沿
output ne, //下降沿
output de //双边沿
);
reg reg1;
always@(posedge clk) begin
reg1 <= signal;
end
assign pe = (~reg1) & signal;
assign ne = reg1 & (~signal);
assign de = pe | ne; // 或 reg1 ^ signal
endmodule
对应的电路结构如下
该结构的边沿检测模块,仅使用到1个寄存器,其边沿输出通过信号 signal 与前一时刻的 signal 做逻辑运算得到,正因此,其一旦signal信号发生变动,其边沿信号也会随之改变,其优点是边沿信号响应迅速,而缺点是边沿信号高电平时间小于一个 clk 周期,因此容易出现漏检。尤其是当信号和时钟边沿很接近时,会出现高电平的时间非常短,从而出现误判
改进方法1:加入寄存器,2级缓存
c
module edge_detect3(
input clk,
input signal,
output pe, //上升沿
output ne, //下降沿
output de //双边沿
);
reg reg1,reg_2;
always@(posedge clk) begin
reg1 <= signal;
reg2 <= reg1;
end
assign pe = reg1 & (~reg2);
assign ne = (~reg1) & reg2;
assign de = reg1 ^ reg2;
endmodule
用这种方式的缺点是会造成检测边沿信号延迟一个时钟周期。