文章目录
一、边沿检测的简述
我们通常会把边沿检测用在按键输入的检测,这一检测手段并不唯一(单片机也可以实现)。按键按下时,输入信号key出现一个下降沿,抬起后又变为一个上升沿。如果输入信号是不存在毛刺和抖动的理想信号,边沿检测就显得尤为重要,当然能够滤除毛刺与抖动的优化的检测电路也在本篇博客的讨论范围之内。
二、上升沿与双边沿的检测方法
1.上升沿的检测方法(下降沿方法自行类比)
(1)设计思路
*******检测电路其侧重电路的设计而非代码的书写能力*******
我们的设计目标是能够在一个时钟周期内(两个上升沿之间)检测到输入信号的上升沿(即由0到1的跳变)。因此要明确:电路中至少要有时序逻辑电路的存在才让输入的前后状态实现比较。设计步骤如下:
-
先用一个D触发器来记录之前的输入的状态(last_state);
-
把之前输入的状态和当前的状态(current_state)进行组合逻辑来实现在last_state == 0&& current_state == 1时电路的输出positive_edge=1;画出真值表可以发现:这一组合逻辑电路通过:assign positive_edge=~last_state¤t_state
这一条连续赋值语句就可以达到我们的目标(可参考以下真值表); -
到现在为止,理论上,我们已经可以检测到一个周期内的边沿变化;
(2)实现与功能评估
根据上述思路编写代码。编写时注意:上述思路中的last_state就是下述代码片中的din;current_state对应的就是代码片中的输入端口in。代码如下::
module top_module (
input clk,
input [7:0] in,
output [7:0] positive_edge
);
reg [7:0]din;
always @(posedge clk) begin
din<= in;
end
assign positive_edge=~din∈
endmodule
波形仿真结果(为了便于便于直观体现输出特性,笔者在粘贴代码时对输出端口的命名进行了修改,