Как создать асинхронный Edge Detector в VHDL? - PullRequest
0 голосов
/ 24 марта 2019

Я новичок в VHDL. Я хотел бы создать Edge Detector, который работает асинхронно (без использования тактового сигнала).

Я использую простую схему для этого:

edge detector

В Quartus II (Altera / Intel) у меня есть этот код:

----
signal MyInput_Change : std_logic;
----
process (MyInput)   
begin

  MyInput_Change<= not(not (MyInput)) xor MyInput;  --edge detector
  if ( MyInput_Change = '1' ) then 
       --change state of FSM
  end if;

Но этот код не работает.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Объявить сигналы:

signal I    : std_logic;         -- input
signal I_d  : std_logic := '0';  -- input delayed by 1 cycle
signal I_re : std_logic;         -- rising edge
signal I_fe : std_logic;         -- falling edge
signal I_ch : std_logic;         -- changed

Задержка входного сигнала:

I_d <= I when rising_edge(Clock);

Обнаружение нарастания фронта:

I_re <= not I_d and I;  -- old = 0, new = 1 => rising edge

Обнаружение падения края:

I_fe <= I_d and not I;  -- old = 1, new = 0 => falling edge

Обнаружение края / изменения:

I_ch <= I_d xor I;      -- old <> new       => changed
0 голосов
/ 25 марта 2019

Мне повезло с атрибутом syn_keep (поочередно продолжайте в зависимости от вашего инструмента синтеза).

signal A1, A2, A3, A4 : std_logic ;
attribute syn_keep : boolean ;
attribute synkeep of A1 : signal is true ;   
attribute synkeep of A2, A3, A4 : signal is true ;   -- should be able to group them, but if not do it as A1
. . . 

A1 <= not A ; 
A2 <= not A1 ; 
A3 <= not A2 ; 
A4 <= not A3 ; 

EdgePulse <= A xor A4 ; 

Это работает для многих вещей, но некоторые инструменты синтеза - и даже некоторые инструменты места и маршрута могут быть в состоянии удалить их.

Удачи. Дайте нам знать, как оно идет.

...