如何用VHDL语言来避免FPGA上PUSH按钮对电路产生的电平毛刺(抖动)?

来源:百度知道 编辑:UC知道 时间:2024/09/24 22:45:07
最近在Xilinx的Spartan2上做实验,而实验板上有PUSH按钮,不过该按钮按下去的时候会出现抖动,也可以理解为毛刺吧,导致输入的电平十分地不稳定。
怎样才能通过编写VHDL来消除这种现象???

我对VHDL语言还不是很熟,用了不少办法,还是不太行。想利用延迟来做,但很不现实。

如果用采样来做呢?譬如用一个基准信号对按钮的电平不断采样,只要前一个采样和现在这个采样一致为低的话,就使输出为低。其他例如高高,高低,低高情况都一概忽略。

我们可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输
出每次只有一位跳变,消除了竞争冒险的发生条件,避免了毛刺的产生。
毛刺并不是对所有的输入都有危害,例如 D 触发器的 D 输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害,我们可以说 D 触发
器的 D 输入端对毛刺不敏感。 根据这个特性,我们应当系统中尽可能采用同步电路,这是因为同步电路信号的变化都发生在时钟沿,只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间,就不会对系统造成危害。 (由于毛刺很短,多为几纳秒,基本上都不可能满足数据的建立和保持时间)
去除毛刺的一种常见的方法是利用 D 触发器的 D 输入端对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号,这种方法类似于将异步电路转化为同步电路。如前所述,优秀的设计方案,如采用格雷码计数器,同步电路等,可以大大减少毛刺,但它并不能完全消除毛刺。 毛刺并不是对所有输入都有危害,例如 D触发器的 D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害。
因此我们可以说 D触发器的 D输入端对毛刺不敏感。但对于 D触发器的时钟端,置位端,清零端,则都是对毛刺敏感的输入端,任何一点毛刺就会使系统出错,但只要认真处理,我
们可以把危害降到最低直至消除。

不管是用verilog还是VHDL语言,去毛刺都是很简单的几句程序,例如:在同步电路设计中,有时候可以用同步置位的办法来替代异步清 0。在用硬件描述语言
的设计中可以用如下的方式来描述:
异步清 0 的描述方法:
process(rst,clk)
begin
if rst=’1’ then
count<=(others=>’0’);
elsif clk’event and clk=’1’ then
count<=count+1;
end if;
end pro