Background
I'm new to VHDL and trying to understand how to code a double flip flop to handle metastability associated with a user pressing a button on my fpga board (Cyclone V). I understand the logic behind using a double flip flop to stabilize the data, but unsure how to implement in VHDL.(Sources: related StackOverflow question, eetimes article)
Question
I'm not sure how to code the double flip flop (see my attempt below). Can someone please provide sample code that shows a working double flip flop?
Example code of my attempt at a double flip flop
--input is std_logic;
input <= key(0) -- user pressed key =1, key can be pressed and held
process(input)
signal inputFF : std_logic;
begin
if rising_edge(clock) then
inputFF<= input;
if input = '1' and inputFF = '1' then
-- enter if-statement: user pressed the key and the data was
-- synchronized by going through a double flip flop?
end if;
end if;
end process;
My thoughts: I'm not sure if the if-statement is acting as a double flip flop or not. I pass the input to the inputFF on the rising_edge and then check if the input and inputFF are equal to 1.
Here's one flip-flip:
process (clock)
begin
if rising_edge(clock) then
inputFF <= input;
end if;
end process;
Here's another:
process (clock)
begin
if rising_edge(clock) then
inputFF2 <= inputFF;
end if;
end process;
Most people would save some lines of code by combining them like this:
process (clock)
begin
if rising_edge(clock) then
inputFF <= input;
inputFF2 <= inputFF;
end if;
end process;
The only safe signal to use is inputFF2
. So, if you want to delay that further (for example to detect an edge on it) then you'll need more flip-flops.