Причиной наблюдаемого поведения является то, что назначение сигнала внутри процесса не сразу меняет значение сигнала. Вместо этого транзакция запланирована на сигнал, который вступит в силу, когда процесс приостанавливается (то есть когда достигнут конец процесса или оператор wait
).
В вашемпервый пример, если cnt_intern
равен -74 в начале процесса, первый оператор if планирует как транзакцию, это означает, что изменение значения сигнала на -69 произойдет в конце процесса, если нет других графиков назначениятранзакция на cnt_intern
. Однако фактическое значение cnt_intern
остается -74 до конца процесса. Таким образом, второе утверждение if будет оцениваться как ложное и ничего не делать. В конце процесса значение -69 присваивается cnt_intern
.
Эта концепция кажется запутанной, если вы начинаете работать с языками описания аппаратного обеспечения, но она необходима.
Выможет использовать вспомогательную переменную, чтобы обойти эту проблему и обеспечить читабельность кода:
process(clk)
variable v_cnt_intern : integer;
begin
if rising_edge(clk) then
v_cnt_intern := cnt_intern;
if((v_cnt_intern + 5) <= 248) then
v_cnt_intern := v_cnt_intern + 5;
end if;
if (v_cnt_intern = -69) then
v_cnt_intern := v_cnt_intern + 5;
end if;
cnt_intern <= v_cnt_intern;
end if;
end process;
Другие решения похожи на код во втором примере, который выглядит хорошо.