FPGA学习(二):边沿检测电路

边沿检测:其实就是检测输入信号的跳变,即上升沿和下降沿的检测。

一、采用一个触发器的边沿检测电路:

1.主程序

module edge_detect(
input clk, rst_n, data, //输入端口
output posedge0,negedge0		//输出端口
);

//one regester
reg data_1;

always@(posedge clk or negedge rst_n)
begin
    if (! rst_n)			//置位
    begin
        data_1 <= 1'b0;
    end
    else
    begin
        data_1 <= data;	//触发器
    end
end

assign negedge0 = data_1 & (~data); 		//下降沿检测
assign posedge0 = (~data_1) & data;     	//上升沿检测
endmodule

2.仿真代码

`timescale 1ns / 1ps
module tb_test(
    );

reg clk,rst_n,data;
wire posedge0, negedge0;

//模块调用
edge_detect u1(
.clk(clk),
.rst_n(rst_n),
.data(data),
.posedge0(posedge0),
.negedge0(negedge0)
);

//initial
initial begin
clk = 0;
rst_n = 0;
#10
rst_n = 1;
data = 0;
#13
data = 1; 	//上升沿
#20
data = 0;		//下降沿
#15
data = 1;		//上升沿
#10
data = 0;		//下降沿
end

//clk 信号
always #5 clk = ~clk;

endmodule

3.时序图

可以看到 检测到信号的边沿时,例如第一个data上升沿时,距离下一个的时钟沿的到来时间太短,可能会导致建立时间不够,从而导致毛刺的长生。

为此,我们采用两个触发器来检测

二、两个触发器检测

1.主程序

module edge_detect(
input clk, rst_n, data, //输入端口
output posedge0,negedge0		//输出端口
);

//one regester
reg data_1,data_2;

always@(posedge clk or negedge rst_n)
begin
    if (! rst_n)			//置位
    begin
        data_1 <= 1'b0;
        data_2 <= 1'b0;
    end
    else
    begin
        data_1 <= data;	//触发器
        data_2 <= data_1;	//触发器
    end
end

assign negedge0 = data_2 & (~data_1); 		//下降沿检测
assign posedge0 = (~data_2) & data_1;     	//上升沿检测
endmodule

2.仿真

`timescale 1ns / 1ps
module tb_test(
    );

reg clk,rst_n,data;
wire posedge0, negedge0;

//模块调用
edge_detect u1(
.clk(clk),
.rst_n(rst_n),
.data(data),
.posedge0(posedge0),
.negedge0(negedge0)
);

//initial
initial begin
clk = 0;
rst_n = 0;
#10
rst_n = 1;
data = 0;
#13
data = 1; 	//上升沿
#20
data = 0;		//下降沿
#15
data = 1;		//上升沿
#10
data = 0;		//下降沿
end

//clk 信号
always #5 clk = ~clk;

endmodule

3.时序图

 可以看到时钟沿信号产生了一个周期,消除了毛刺的产生,但同时检测信号的延迟增大。

三、总结

没有十全十美的东西,也没有十全十美的电路、代码;边沿检测技术亦如此。有如下缺陷:

(1)增大CLK信号可以增强边沿检测的效率,但不能滤去跳变的杂波。

(2)减少CLK可以有效滤去跳变的杂波,但不能及时检测到边沿跳变。

(3)增加DFF能更好的滤除杂波,寄存信号,但同时检测延时大。
 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值