Edge detection of signal in VHDL

本小妞迷上赌 提交于 2019-12-24 05:56:35

问题


I am new on VHDL, I have a push button which I want to detect the it signal when it is pushed, meaning i want to detect the raising edge of the signal push button when it is pressed?

I did research and all what I found was about the detecting the raising edge of a clk.

the problem that I have is that when the push button is pressed the the signal for the push button goes to 1 and stay at 1 until until another even happen so I am interested more when the signal of the push button raise?


回答1:


Your question in idiomatic English:

I am new to VHDL and have a push button that I want to detect as a rising edge when pressed.

I did some research and all what I found was about the detecting the rising edge of a clock.

When the push button is pressed the signal for the push button goes to '1' and stay at '1' until until another event occurs.

How do I detect the push button rising edge event?

This isn't so much of a VHDL question as it is a digital design question. VHDL comes into play for implementing a solution in VHDL.

See sonicwave's answer to the question VHDL - Incrementing Register Value on Push Button Event which provides an edge detector.

However switch bounce can occur for tens of milliseconds (Maxim web article on switch bounce), potentially generating multiple events, is switch dependent and corrective action also depends on sampling clock rate.

Notice the Maxim web page article mentions membrane switches can be bounce free when new and degrade over time and bounce characteristics are not repeatable.

Some FPGA vendors provide a Schmidt trigger buffer between buttons and claim membrane momentary switches are then 'debounced'. The Maxim web article claims membrane switches may not remain clean over their useful lifetime. These and other types of momentary switches can require debouncing.

debouncing

When debouncing is not provided by the FPGA board the idea is to filter out all these bounces digitally and generate a single event showing the button has been depressed. This requires a clock.

first get the button signal into your clock domain

This requires metastability filtering, which is accomplished by minimizing the delay between two successive flip flops to maximize immunity to events occurring within the metastability region of the first flip flop when the first flip flop sees a setup or hold time violation.

The input to the first flip flop is the button signal, the input to the second flip flop is the output of first flip flop.

The output of the second flip flop is in the clock domain, metastability free when not exceeding the a clock rate representing period comprised of the routing delay between the two flip flops plus the metastability recovery time of the flip flop.

The metastability recovery time of the flip flop is usually represented by the maximum clock rate period in an FPGA.

filtering out bounces

Feed the metastability filtered button signal to a counter as a reset when the button is invalid. When you release the button the counter is cleared.

The size of the counter depends on the clock rate and length of switch bounce, you can require tens of milliseconds.

A terminal count signifies a valid button event and also is used to stop the counter. (Terminal count FALSE is an enable for the counter).

The counter is stopped to provide a single button event.

Also note that when the button input is metastability filtered it acts as a synchronous reset.

Edge detection

Edge detection is done with a flip flop with the terminal count signal as an input and a two input gate, the type of gate and polarity of it's inputs can be used to select which edge of the event (potentially both with an XOR gate) you detect. One input to the gate from the flip flop, the other the terminal count from the counter.

If you've deemed debounce is provided adequately by the FPGA board design you can combine metastability filtering and edge detection without using a debounce counter.

Maxim's application note

If you have a commercially produced FPGA board you shouldn't have to worry about voltage transients outside digital signalling levels, the Maxim article is promoting their protective devices to board designers.

The web article provides an authoritative reference on switch bounce and the bounce waveforms.

FPGA board vendors

Some FPGA board vendors provide debounce circuit reference design code. They'll do this because the counter size is dependent on the reference clock rate, and potentially the clock used is derived by a DPLL.




回答2:


Depended on if you want safety check for meta-stability or not make a shift register and shift your input signal on a clock and look when there is a difference. The code below is very simple and takes into account that you have a clock in your system.

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;

But depended on rising/ falling time of your signal vs. your clock you might want to look into meta-stability also if you get problems with false positives.



来源:https://stackoverflow.com/questions/33072002/edge-detection-of-signal-in-vhdl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!