Первое, что я вижу, это то, что вы игнорируете тот факт, что сигнал count
постоянно считается.Когда вы нажимаете reset, ваш count
возвращается к `x" 00000 ", это единственная причина, по которой он работает.
Но когда вы нажимаете кнопку вверх / вниз, вы меняете значение countDiv
с
countDiv <= b"00000000000000110010"; --0.4s cycle
до
countDiv <= b"00000000000000011001"; --0.2s cycle
но что, если в момент нажатия кнопки count
будет b"00000000000000100000"
?Условие count = countDiv
не было поймано ранее и никогда не будет поймано.Счет начнет отсчитываться бесконечно, и любые дальнейшие изменения countDiv
не изменят этот факт (возможно, если вы нажмете другую кнопку достаточно быстро и, конечно, ожидаете кнопку reset
).clkout
остановится на текущем значении, и дисплей будет зависать, пока, конечно, count
не переполнится.
Конечно, самым простым разрешением будет изменение count = countDiv
на count >= countDiv
, но такое сравнение требует ресурсов, так что это не очень хороший способ дизайна fpgas.Вам следует сбрасывать значение count
на ноль каждый раз, когда вы чегеете countDiv
, или даже лучше, вести обратный отсчет до нуля, начиная с countDiv
.Тогда временное перенапряжение тока countDiv
не должно быть проблемой.У вас есть много возможностей.
Например:
wheelDivider : process(clk, reset)
begin
if(reset = '1') then --reset clock count if reset pushed
count <= b"00000000000001001011";
temp <= '0';
elsif(rising_edge(clk)) then
if(count = x"00000") then --set clk counter value to zero
count <= countDiv;
temp <= not temp;
else
count <= count - 1; --keep decrementing count until zero
temp <= temp;
end if;
end if;
end process;
Я не уверен, что это пока единственная проблема.Надеюсь, что это так.