Вы должны управлять сигналом только одного процесса. Просто поместите свою функцию сброса в счетчик процессов, и она должна работать. Например:
process(clk) -- Process for horizontal counter
begin
if(rising_edge(clk)) then
if(rst = '1') then
h_count <= 0;
else
if h_count = 799 then
h_count <= (others => '0');
else
h_count <= h_count + 1;
end if;
end if;
end if;
end process;
Несколько других заметок:
Как вы видите, я использовал синхронный сброс в приведенном выше фрагменте. Если вам абсолютно не нужна асинхронная перезагрузка, используйте вместо нее синхронную перезагрузку. Это помогает синтезатору, так как есть некоторые специальные конструкции, которые недоступны при асинхронном сбросе, и помогает предотвратить проблемы, когда ваш проект становится большим (и триггеры внезапно начинают сбрасываться в разное время из-за перекоса сигнала).
Кроме того, не проверяйте ничего, кроме ребер (или сброса) в исходном операторе if синхронизированного процесса. Для вашего вертикального счетчика у вас есть чек для h_count = 799. Вместо этого выполните следующее:
process(clk)
begin
if(rising_edge(clk)) then
if(h_count = 799) then
(...)
Это намного понятнее и не так подвержено ошибкам.
Наконец, я изменил clk'event and clk=1
на более современный способ, rising_edge(clk)
. Это не должно иметь большого значения (если только не при определенных условиях в симуляции), но rising_edge
имеет несколько дополнительных встроенных проверок, чтобы убедиться, что у вас действительно есть преимущество.