(VHDL) Написать двойной триггер для разрешения метастабильности, связанной с асинхронными входными данными - PullRequest
0 голосов
/ 15 октября 2018

Справочная информация

Я новичок в VHDL и пытаюсь понять, как кодировать двойной триггер для обработки метастабильности, связанной с тем, что пользователь нажимает кнопку на моей плате fpga (Cyclone V).).Я понимаю логику использования двойного триггера для стабилизации данных, но не знаю, как реализовать в VHDL. (Источники: связанный с StackOverflow вопрос , eetimes article )

Вопрос

Я не уверен, как кодировать двойной триггер (см. Мою попытку ниже).Может ли кто-нибудь предоставить пример кода, который показывает работающий двойной триггер?

Пример кода моей попытки сделать двойной триггер

--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;

Мои мысли: Я не уверен, что оператор if действует как двойной триггер или нет.Я передаю входные данные на inputFF по восходящему краю, а затем проверяю, равны ли input и inputFF 1.

1 Ответ

0 голосов
/ 15 октября 2018

Вот один триггер:

process (clock)
begin
   if rising_edge(clock) then
      inputFF <= input;
   end if;
end process;

Вот еще один:

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;

Единственный безопасный сигнал для использования - inputFF2.Так что, если вы хотите отложить это еще больше (например, чтобы обнаружить ребро на нем), вам понадобится больше триггеров.

...