我是VHDL的新手,我有一个按钮,当它被按下时,我想要检测它的信号,这意味着当它被按下时,我想要检测信号按钮的上升沿?
我做了研究,所有我发现的都是关于检测clk的上升边缘。
我的问题是,当按钮被按下时,按钮的信号变为1,并一直保持在1,直到另一次事件发生,所以当按钮的信号上升时,我更感兴趣。
发布于 2015-10-13 03:10:36
你用地道的英语提问:
我是VHDL语言的新手,我有一个按钮,当我按下这个按钮时,我想检测出它是一个上升沿。
我做了一些研究,所有我发现的都是关于检测时钟上升沿的。
当按钮被按下时,按钮的信号变为'1‘,并保持在'1’,直到另一个事件发生。
如何检测按钮上升沿事件?
与其说这是一个VHDL问题,不如说这是一个数字设计问题。VHDL在用VHDL实现解决方案时起着重要作用。
参见sonicwave对问题VHDL - Incrementing Register Value on Push Button Event的回答,它提供了一个边缘检测器。
但是,tens of milliseconds (有关开关反弹的Maxim web文章)可能会发生开关反弹,这可能会产生多个事件,这取决于交换机,而纠正措施也取决于采样时钟频率。

请注意,Maxim网页上的文章提到,膜开关可以在新的和随着时间的推移而降级的情况下自由反弹,并且反弹特性不可重复。
一些FPGA供应商在按钮之间提供了施密特触发缓冲器,并声称薄膜瞬时开关随后被“去抖动”。Maxim网站的文章声称,薄膜开关在其使用寿命内可能不会保持清洁。这些和其他类型的瞬时开关可能需要去抖动。
去抖动
当FPGA板不提供去抖动功能时,其想法是以数字方式过滤掉所有这些弹跳,并生成单个事件,显示按钮已被按下。这需要一个时钟。
首先将按钮信号放入时钟域
这需要亚稳态滤波,这是通过最小化两个连续触发器之间的延迟来实现的,以便当第一触发器看到建立或保持时间违规时,最大化对第一触发器的亚稳态区域内发生的事件的免疫力。
第一触发器的输入是按钮信号,第二触发器的输入是第一触发器的输出。
当不超过由两个触发器之间的布线延迟加上触发器的亚稳态恢复时间组成的时钟速率表示周期时,第二触发器的输出在时钟域中是无亚稳态的。
在FPGA中,触发器的亚稳态恢复时间通常由最大时钟速率周期来表示。
过滤出退回
当该按钮无效时,将该亚稳态滤波按钮信号作为复位馈送到计数器。当您松开按钮时,计数器将被清除。
计数器的大小取决于时钟频率和开关跳动的长度,您可能需要数十毫秒。
终端计数表示有效的按钮事件,也用于停止计数器。(Terminal count FALSE为计数器启用)。
停止计数器以提供单个按钮事件。
还请注意,当按钮输入是亚稳态过滤时,它充当同步复位。
边缘检测
边沿检测是通过一个触发器和一个双输入门完成的,触发器将终端计数信号作为输入,门的类型及其输入的极性可以用来选择检测到事件的哪个边沿(可能两者都使用XOR门)。一个输入来自触发器的门,另一个是来自计数器的终端计数。
如果您认为FPGA电路板设计提供了足够的去抖动,您可以在不使用去抖动计数器的情况下组合亚稳态滤波和边缘检测。
Maxim的应用笔记
如果你有一个商业生产的FPGA电路板,你不应该担心数字信令电平以外的电压瞬变,Maxim文章向电路板设计者推广他们的保护设备。
该web文章提供了有关开关弹跳和弹跳波形的权威参考。
FPGA电路板供应商
一些FPGA板厂商提供了去抖动电路参考设计代码。他们会这样做,因为计数器的大小取决于参考时钟速率,并且使用的时钟可能是由DPLL导出的。
发布于 2015-10-12 14:25:57
取决于你是否想要进行亚稳定的安全检查,做一个移位寄存器,并在时钟上移位你的输入信号,看看有什么不同。下面的代码非常简单,并且考虑到您的系统中有一个时钟。
signal edge_detect : std_logic_vector( 1 downto 0 );
process (clk_i) is
begin
if rising_edge(clk_i) then
edge_detect <= edge_detect(0) & input_signal;
if edge_detect = "01" then
-- do stuff on rising_edge
elsif edge_detect = "10" then
-- do stuff on falling_edge
end if;
end process;但是,根据信号的上升/下降时间与时钟的关系,如果出现误报问题,您可能还需要研究元稳定性。
https://stackoverflow.com/questions/33072002
复制相似问题