失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 数字电路专题:边沿检测(上升沿 下降沿 双边沿)

数字电路专题:边沿检测(上升沿 下降沿 双边沿)

时间:2022-06-13 20:12:06

相关推荐

数字电路专题:边沿检测(上升沿  下降沿 双边沿)

边沿检测

1、上升沿检测

代码如下:

module signal_pos(input i_clk, //时钟输入input i_rst_n, //复位信号input i_signal, // 输入信号 待检测信号output pos_pulse //输出脉冲信号);reg signal_reg0;reg signal_reg1;always @(posedge clk)beginif(!i_rst_n)beginsignal_reg0 <= 1'b0;signal_reg0 <= 1'b0; endelsebeginsignal_reg0 <= i_signal;signal_reg1 <= signal_reg0 ; endendassign pos_pulse = ~signal_reg1 & signal_reg0 //上升沿脉冲 宽度:一个时钟周期endmodule

时序分析如下:

D 为输入原始信号:i_signal

2、下降沿检测

代码如下:

module signal_neg(input i_clk, //时钟输入input i_rst_n, //复位信号input i_signal, // 输入信号 待检测信号output neg_pulse //输出脉冲信号);reg signal_reg0;reg signal_reg1;always @(posedge clk)beginif(!i_rst_n)beginsignal_reg0 <= 1'b0;signal_reg0 <= 1'b0; endelsebeginsignal_reg0 <= i_signal;signal_reg1 <= signal_reg0 ; endendassign neg_pulse = signal_reg1 & (~signal_reg0) //下降沿脉冲 宽度:一个时钟周期endmodule

时序分析如下:

D 为输入原始信号:i_signal

3、双边沿检测

代码如下:

module signal_neg_pos(input i_clk, //时钟输入input i_rst_n, //复位信号input i_signal, // 输入信号 待检测信号output neg_pos_pulse //输出脉冲信号);reg signal_reg0;reg signal_reg1;always @(posedge clk)beginif(!i_rst_n)beginsignal_reg0 <= 1'b0;signal_reg0 <= 1'b0; endelsebeginsignal_reg0 <= i_signal;signal_reg1 <= signal_reg0 ; endendassign neg_pos_pulse = signal_reg1 ^ signal_reg0 //上升沿、下降沿脉冲 宽度:一个时钟周期endmodule

时序分析如下:

D 为输入原始信号:i_signal

边沿检测还可以这么写

这里有给出了一种检测边沿的方法,代码大同小异。

module signal_neg_pos(input i_clk, //时钟输入input i_rst_n, //复位信号input i_signal, // 输入信号 待检测信号output negedge_pulse, //检测下降沿 输出脉冲信号output posedge_pulse, //检测上升沿 输出脉冲信号output both_edge_pulse //检测双边沿 输出脉冲信号); reg [1:0]signal_edge;always @(posedge clk)beginif(!i_rst_n)beginsignal_edge <= 2'b0; endelsebeginsignal_edge <= {signal_edge[0],i_signal} //输入信号从低位进入,左移,bit1为旧状态,bit0 为新状态endend//双边沿沿:旧状态bit1 与 新状态bit0 异或需为1,故需 signal_edge[0] ^ signal_edge[1] == 1//上升沿:旧状态bit1应为 0,新状态bit0应为 1,故需 signal_edge[1:0] == 2‘b01//下降沿:旧状态bit1应为 1,新状态bit0应为 0,故需 signal_edge[1:0] == 2‘b10assign both_edge_pulse = signal_edge[0] ^ signal_edge[1] //双边沿 宽度:一个时钟周期assign posedge_pulse = (signal_edge[1:0] == 2'b01) ; //上升沿 宽度:一个时钟周期assign negedge_pulse = (signal_edge[1:0] == 2'b10) ; //下降沿 宽度:一个时钟周期//类似前一种方案,还可以这样写//assign both_edge_pulse = signal_edge[0] ^ signal_edge[1] //双边沿 宽度:一个时钟周期//assign posedge_pulse = ~signal_edge[1] & signal_edge[0] ; //上升沿 宽度:一个时钟周期//assign negedge_pulse = signal_edge[1] & ~signal_edge[0] ; //下降沿 宽度:一个时钟周期endmodule

亚稳态解决

避免亚稳态,只需要将输入信号打几拍即可

方案1:

跟上面边沿检测一个思路

module signal_buff_out(input i_clk, //时钟输入input i_rst_n, //复位信号input i_signal, // 输入信号 待检测信号output out_buff // 打拍缓冲输出信号); reg [15:0] signal_reg;reg [3:0] bit_num;always @(posedge clk)beginif(!i_rst_n)beginsignal_reg <= 16'b0; endelsebeginsignal_edge <= {signal_reg[14:0],i_signal} endendassign out_buff = signal_edge[bit_num]; //根据需要,选择输入信号打拍次数 :0-15 ,0:打一拍endmodule

方案2:

这种方法使用打拍次数较少的场合

module signal_buff_out(input i_clk, //时钟输入input i_rst_n, //复位信号input i_signal, // 输入信号 待检测信号output out_buff // 打拍缓冲输出信号); reg signal_reg0;reg signal_reg1;reg signal_reg2;always @(posedge clk)beginif(!i_rst_n)beginsignal_reg0 <= 1'b0; signal_reg1 <= 1'b0; signal_reg2 <= 1'b0; endelsebeginsignal_reg0 <= i_signal; signal_reg1 <= signal_reg0 ; signal_reg2 <= signal_reg1 ; endend//assign out_buff = signal_reg0 ; //固定为1拍//assign out_buff = signal_reg1 ; //固定为2拍assign out_buff = signal_reg2 ; //固定为3拍endmodule

细究下边沿检测原理

我将结合时序图 ,并以这段代码为例逐步分析下是如何实现上升沿检测的

module signal_pos(input i_clk, //时钟输入input i_rst_n, //复位信号input i_signal, // 输入信号 待检测信号output pos_pulse //输出脉冲信号);reg signal_reg0;reg signal_reg1;always @(posedge clk)beginif(!i_rst_n)beginsignal_reg0 <= 1'b0;signal_reg0 <= 1'b0; endelsebeginsignal_reg0 <= i_signal;signal_reg1 <= signal_reg0 ; endendassign pos_pulse = ~signal_reg1 & signal_reg0 //上升沿脉冲 宽度:一个时钟周期endmodule

看下面这两句话:

signal_reg0 <= i_signal;signal_reg1 <= signal_reg0 ;

为了看着方便,我将输入信号 i_signal 替换为 in, signal_reg0 替换为reg0, signal_reg1 替换为reg1

reg0 <= in;reg1 <= reg0 ;

下面这样图,把打拍的实际电路呈现了出来,打了两排,实际上就是让数据IN经过了两个D触发器缓冲输出,这种打拍方式也用于将数据跟时钟信号同步

至于为上升沿为啥是:~reg1 & reg0 ,根据这张图,不妨这样理解:

1、先把这两个串联的D触发器理解成一个移位寄存器;

2、上升沿的跳变0 —>1,看成两个进入移位寄存器的数据 :0进入移位寄存器,1后进入移位寄存器;

3、经历一定的时钟周期后,先进入移位寄存器的0,进入了reg1寄存器,后进入的 1,进入了reg0寄存器;

4、reg1中保存的是老状态0,reg0中保存的是新状态1,当检测到相邻的两个D触发器中的数据不同时,说明有跳变沿,所以上升沿就是 ~reg1 & reg0 = 1;

5、因为是采用的相邻的两个D触发器中的数据检测变化,所以4中产生的 ~reg1 & reg0 = 1 也只有一个时钟周期的宽度。

6、要想让检测到的上升沿脉冲信号宽一点,如果你理解了的话,应该知道怎么做了,哈哈!看下图

应该懂了吧!!

还可以以下图的方式来理解,前提是要对阻塞赋值和非阻塞赋值有比较深刻的理解:

结合流程图时序图可以清楚的看到,上升沿脉冲是在2、3之间产生的。

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

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