(VHDL)编写双触发器以解决与异步输入数据相关的元稳定性

(VHDL)编写双触发器以解决与异步输入数据相关的元稳定性,vhdl,fpga,flip-flop,Vhdl,Fpga,Flip Flop,背景 我是VHDL新手,正在尝试理解如何编写双触发器来处理与用户按下fpga板(Cyclone V)上的按钮相关联的亚稳态。我理解使用双触发器稳定数据背后的逻辑,但不确定如何用VHDL实现。(来源:,) 问题 我不知道如何编写双触发器(请参阅下面的尝试)。有人能提供显示双触发器工作的示例代码吗 我尝试双触发器的示例代码 --input is std_logic; input <= key(0) -- user pressed key =1, key can be pressed and h

背景

我是VHDL新手,正在尝试理解如何编写双触发器来处理与用户按下fpga板(Cyclone V)上的按钮相关联的亚稳态。我理解使用双触发器稳定数据背后的逻辑,但不确定如何用VHDL实现。(来源:,)

问题

我不知道如何编写双触发器(请参阅下面的尝试)。有人能提供显示双触发器工作的示例代码吗

我尝试双触发器的示例代码

--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;
——输入为标准逻辑;
输入这里有一个翻转:

process (clock)
begin
   if rising_edge(clock) then
      inputFF <= input;
   end if;
end process;
进程(时钟)
开始
如果上升沿(时钟),则

inputFF您的代码只有一个FF。要使用双寄存器,需要分配两个信号,一个来自输入,另一个来自第一个FF。请记住,第一个FF有可能是亚稳态的,因此您只能安全地阅读链中的第二个FF。@谢谢您的回复。这正是我迷路的地方。你是说我需要发出第二个信号(inputFF2)。分配inputFF2我没想到在它自己的进程中放入双FF。当然,这会使代码更具可读性。谢谢你的洞察力!我建议将双触发器放在它自己的实体中,不要管它自己的过程。我将在顶层实例化该实体,而不是在另一个块中。任何异步的东西(就像这样)都应该让你在晚上保持清醒。想象一个QA审核员审核您的项目。如果他们问时钟域交叉点在哪里,你应该能够拿出一个列表并依靠“这里,这里和这里”。如果您回答“啊……好问题。嗯……我想在这个区块内可能有一个12层的层次结构……呃……”,那么所有都将丢失。对于Altera FPGA,您应该应用匹配的SDC约束和
同步器\u标识
属性。一行仅使用2个FF不足以创建一个好的双FF同步器。请参阅@paebels的完整代码,该代码听起来很合理。将同步器放在单独的层次结构层中的另一个原因是(希望)布局工具将触发器放在一起。(尽管我总是和布局工程师核实触发器的布局是否正确。)
process (clock)
begin
   if rising_edge(clock) then
      inputFF2 <= inputFF;
   end if;
end process;
process (clock)
begin
   if rising_edge(clock) then
      inputFF  <= input;
      inputFF2 <= inputFF;
   end if;
end process;