失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > FPGA实现边沿检测电路(上升沿 下降沿)

FPGA实现边沿检测电路(上升沿 下降沿)

时间:2023-02-22 10:09:43

相关推荐

FPGA实现边沿检测电路(上升沿 下降沿)

1、什么是边沿检测

边沿检测用于检测信号的上升沿或下降沿,通常用于使能信号的捕捉等场景。

2、采用1级触发器的边沿检测电路设计(以下降沿为例)

2.1、设计方法

设计波形图如下所示:

各信号说明如下:

sys_clk:基准时钟信号(这里设定为50MHz,周期20ns)sys_rst_n:低电平有效的复位信号in:输入信号,需要对其进行下降沿检测~in:输入信号的反相信号in_d1:对输入信号寄存一拍in_neg:得到的下降沿指示信号,该信号为 ind1 && ~in

对上图进行分析:

信号in是我们需要对其进行下降沿检测的信号信号~in是将信号in反向信号in_d1是使用寄存器寄存in信号,即对其进行打拍,或者说是同步到系统时钟域下输入信号开始为高电平,在L2处变为低电平,产生第1个下降沿,在L5出产生第2个下降沿A处为产生的第1个下降沿指示信号,B处为产生的第2个下降沿指示信号

由此我们可以推导出边沿检测信号产生的一般方法:

将需要检测的信号寄存一拍,同步到系统时钟域下,得到信号 in_d1将需要检测的信号反向,得到信号 ~in将信号 in_d1 反向,得到信号 ~in_d1通过组合逻辑电路可以得到下降沿信号 in_neg:assign in_neg = ~in &&in_d1同样通过组合逻辑电路可以得到上升沿信号 in_pos:assign in_pos = in && ~in_d1双边沿检测就是将上两条加(或运算)起来就可以了,化简后有:双边沿信号 in_both = in ^ ind1

2.2、Verilog实现

根据上文分析不难编写Verilog代码如下:

//使用1级寄存器的下降沿检测电路module detect_1(inputsys_clk,//时钟(设定为 50MHz)inputsys_rst_n,//复位信号(n 表示低电平有效)inputin,//需要进行下降沿检测的输入信号outputin_neg//输出的下降沿指示信号);//reg 定义regin_d1;//寄存一拍的信号assign in_neg = ~in && in_d1;//组合逻辑得到下降沿//上升沿: assign in_pos = in && ~in_d1;//双边沿: assign in_pos = in ^ in_d1;//寄存模块,将输入信号打一拍always@(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)in_d1 <= 1'b0;//复位清零else in_d1 <= in;//寄存一拍endendmodule

2.3、RTL电路

上图为生成的RTL电路:该电路由一级D触发器+与逻辑门构成。

2.4、Testbench

Testbench文件需要例化刚刚设计好的模块,并设置好激励。

`timescale 1ns/1ns//时间刻度:单位1ns,精度1nsmodule tb_detect_1();//仿真模块//输入reg 定义regsys_clk;reg sys_rst_n;reg in;//输出wire定义wire in_neg;//设置初始化条件和输入激励initial beginsys_clk = 1'b0;//初始时钟为0sys_rst_n <= 1'b0;//初始复位in <= 1'b0;//初始化输入信号/*****以下部分为设置的激励,以产生2个下降沿*******/#10//10个时间单位后sys_rst_n <= 1'b1; //拉高复位(此时复位无效)in <= 1'b1;//拉高输入#20//20个时间单位后in <= 1'b0; //拉低输入,制造第1个下降沿#80//80个时间单位后in <= 1'b1; //拉高输入#60//60个时间单位后in <= 1'b0; //拉低输入,制造第2个下降沿end//always代表重复进行,#10代表每10个时间单位//每10个时间单位反转时钟,即时钟周期为20个时间单位(20ns)always #10 sys_clk = ~sys_clk;//例化被测试模块detect_1 detect_1_inst(.sys_clk (sys_clk ), .sys_rst_n (sys_rst_n ), .in(in),.in_neg (in_neg) );endmodule

2.5、仿真结果

使用ModelSim执行仿真,仿真出来的波形如所示:

从波形图可以看到:

10ns后停止复位在第1条参考线处输入信号 in 产生了第1个下降沿信号在第3条参考线处输入信号 in 产生了第2个下降沿信号在第1条参考线和第2条参考线之间的产生了一个周期的下降沿指示信号 in_neg在第3条参考线和第4条参考线之间的产生了一个周期的下降沿指示信号 in_neg

3、采用2级触发器的边沿检测电路(以下降沿为例)

3.1、设计方法

设计波形图如下所示:

各信号说明如下:

sys_clk:基准时钟信号(这里设定为50MHz,周期20ns)sys_rst_n:低电平有效的复位信号in:输入信号,需要对其进行下降沿检测in_d1:对输入信号寄存1拍in_d2:对输入信号寄存2拍~in_d1:in_d1信号的反相信号in_neg:得到的下降沿指示信号,该信号为 ~ind1 && ind2

对上图进行分析:

信号in是我们需要对其进行下降沿检测的信号信号in_d1是使用寄存器寄存in信号,即对其打1拍信号in_d2是使用寄存器寄存in_d1信号,即对其打1拍信号~in_d1是将信号in_d1反向输入信号开始为高电平,在L2处变为低电平,产生第1个下降沿,在L5出产生第2个下降沿A处为产生的第1个下降沿指示信号,B处为产生的第2个下降沿指示信号输出的下降沿指示信号落后下降沿一个时钟周期,这是因为对输入信号进行了寄存以消除亚稳态

由此我们可以推导出边沿检测信号产生的一般方法:

将需要检测的信号分别寄存1拍、2拍,同步到系统时钟域下,得到信号 in_d1、in_d2将in_d1信号反向,得到信号 ~in_d1将in_d2信号反向,得到信号 ~in_d2通过组合逻辑电路可以得到下降沿信号 in_neg:assign in_neg = ~in_d1 && in_d2同样通过组合逻辑电路可以得到上升沿信号 in_pos:assign in_pos = in_d1 && ~in_d2双边沿检测就是将上两条加(或运算)起来就可以了,化简后有:双边沿信号 in_both = in_d1 ^ in_d2

3.2、Verilog实现

根据上文分析不难编写Verilog代码如下:

//使用1级寄存器的下降沿检测电路module detect_2(inputsys_clk,//时钟(设定为 50MHz)inputsys_rst_n,//复位信号(n 表示低电平有效)inputin,//需要进行下降沿检测的输入信号outputin_neg//输出的下降沿指示信号);//reg 定义regin_d1;//寄存1拍的信号regin_d2;//寄存2拍的信号assign in_neg = ~in_d1 && in_d2;//组合逻辑得到下降沿//上升沿: assign in_pos = in && ~in_d1;//双边沿: assign in_pos = in ^ in_d1;//寄存模块,将输入信号打1拍、打2拍always@(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginin_d1 <= 1'b0;//复位清零in_d2 <= 1'b0;endelse beginin_d1 <= in;//寄存1拍in_d2 <= in_d1;//寄存2拍endendendmodule

3.3、RTL电路

上图为生成的RTL电路:该电路由2级D触发器+与逻辑门构成。

3.4、Testbench

Testbench文件同2.4章。

3.5、仿真结果

使用ModelSim执行仿真,仿真出来的波形如所示:

从波形图可以看到:

10ns后停止复位在第1条参考线处输入信号 in 产生了第1个下降沿信号在第4条参考线处输入信号 in 产生了第2个下降沿信号在第2条参考线和第3条参考线之间的产生了一个周期的下降沿指示信号 in_neg在第5条参考线和第6条参考线之间的产生了一个周期的下降沿指示信号 in_neg两级寄存器构成的边沿检测电路可以有效的防止亚稳态的产生,产生的使能信号会落后一个时钟周期。

4、参考

【从零开始走进FPGA】你想干嘛——边沿检测技术

FPGA的边沿检测

FPGA基础入门篇(四) 边沿检测电路

如果觉得《FPGA实现边沿检测电路(上升沿 下降沿)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。