Как действовать на обоих фронтах сигнала (коммуникационных часов) в VHDL? - PullRequest
0 голосов
/ 23 апреля 2020

Интересно, что было бы «лучшим» или, по крайней мере, «хорошим» способом реализации процесса, который действует на оба конца на шине или на часах связи.

Предположим, вы хотите обслуживать FiFo, который может отправлять и получать данные. Обычно полученные данные назначаются на «падающем» фронте его шины «com_clk», где данные, которые отправляются, должны быть обновлены на нарастающем фронте «com_clk», чтобы быть наиболее стабильными, когда аналог назначает данные на спад.

Для этого сценария я могу придумать несколько способов реализации, но я не могу оценить, насколько они "хороши" с точки зрения использования оборудования, надежности или способности к синтезу, и при этом я не знаю хорошего ресурса чтобы выглядеть примерно так.

Мои подходы выглядят примерно так, с обычной структурой, конечно:

Подход 1:

wait until rising_edge(com_clk);
  if reading='1' then 
    wait until com_clk='0';
    internal_mem <= bus_data;  --read the data from the bus
  else
    bus_data <= internal_mem ; --write the data to the bus
  end if;

Подход 2:

wait until rising_edge(sys_clk);   --should be much faster than "clk" i guess about 10x(?)
  if reading='1' then 
    wait until com_clk='0';        --wait for the com_clk to become '0'
    internal_mem <= bus_data;      --read the data from the bus
  else
    wait until com_clk='1';        --wait for the com_clk to become '1'
    bus_data <= internal_mem ;     --write the data to the bus
  end if;

Вывод решения 2 будет состоять в том, чтобы создать детектор контуров для «com_clk» и использовать этот сигнал для «ожидания до» или в «предложении if». Так какой же будет «хороший» или «лучший» подход к обоим краям сигнала com_clk и как я могу оценить это самостоятельно?

1 Ответ

1 голос
/ 24 апреля 2020

По сути, вы хотите удвоить скорость передачи данных на ПЛИС.

Ужасный способ : вы можете выполнить два процесса, один из которых работает на переднем фронте, а другой - на заднем. Это может или не может синтезировать в зависимости от вашей технологии, и это может или не может синтезировать, чтобы использовать аппаратный триггер.

Плохой способ : Вы не можете ваши часы и использовать передний фронт обоих. По сути, вы здесь работаете с двумя часовыми доменами. Если у вас нет времени, вы можете получить метастабильность. Вам нужно будет выполнить обычную схему обработки метастабильности здесь.

Лучший способ : генерировать более медленные часы. Создайте восходящие и падающие импульсы с ваших часов. Эти импульсы будут подаваться в порт включения ваших триггеров.

...