Интересно, что было бы «лучшим» или, по крайней мере, «хорошим» способом реализации процесса, который действует на оба конца на шине или на часах связи.
Предположим, вы хотите обслуживать 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 и как я могу оценить это самостоятельно?