想达成效果是触摸一次灯一直亮,再触摸一次灯就灭掉,再触摸一次灯又一直亮。
下面是框图和波形,touch_key就代表触摸信号
下面是波形,这里touch_key1是把touch_key同步到上升沿时钟信号。touch_key2是touch_key1延迟一拍的信号,目的是为了跟touch_key1进行比较,方便采集touch_key1的边沿信号。touch_flag是组合逻辑下采集的touch_key1的下降沿信号,组合逻辑没有延迟。
nedge是时序逻辑下采集的touch_key1的下降沿信号,相比于touch_flag会有一拍的延迟。
podge是时序逻辑下采集的touch_key1的上升沿信号,也会有一拍的延迟。
led信号受touch_flag控制。
下面是rtl代码,外面assign的是touch_falg信号,注释里面的我只写了时序逻辑下的下降沿采集nedge信号。
module touch_ctrl_led
(
input sys_clk,
input sys_rst_n,
input touch_key,
output reg led
);
reg touch_key1;
reg touch_key2;
wire touch_flag;
//边沿检测,利用慢一拍的效果可以