В настоящее время я создаю проект с несколькими объектами, в котором все объекты имеют синхронизирующую синхронизацию архитектуру (без поведенческих характеристик), и большинство объектов работают с производными часами.
Я использую DE0 Nano, поэтому мой тактовый генератор составляет 50 МГц, и у меня есть 4 производных тактовых сигнала: 1 МГц, 500 кГц, 10 Гц и 1 Гц.
Disclamer: хотя я осознаю, что такие действия гораздо менее энергоэффективны, мне было интересно, можно ли что-нибудь сделать, чтобы хоть как-то это исправить (я открыт для идей).
Теперь в сущности верхнего уровня у меня есть «обработчик событий», который может решить, какие сущности должны работать в любой данный момент.
Поэтому мне пришла в голову идея подключить переключатель часов включения / выключения для полученных входных сигналов часов к объектам более низкого уровня и отключить некоторые из них (входы часов), когда мне не нужен определенный объект для работы некоторое время. (как я понимаю, это должно помешать их процессам запускаться в течение этого времени).
Поскольку у меня нет простого способа проверить эту идею (я предполагаю, что это потребует умеренного объема работы и времени, особенно настройки измерения энергопотребления), я хотел спросить, пробовал ли кто-нибудь что-то подобное и / или знает стоит ли выстрел?
К вашему сведению, в настоящее время, когда сущности находятся в "спящем" режиме, их процессы запускаются по каждому нарастающему фронту тактовой частоты, проверяют внутреннее состояние или помечают переменную / сигнал и останавливаются, например ::
process (1MHz clock) is
variable ...
begin
if rising_edge(clk) then
if state = ready and enable = '1' then
...
end if;
end if;
end process;
Или, может быть, есть другой, лучший способ сделать это?