Создайте свой собственный подтип из целого числа с правильным диапазоном (0–9) и определите переменную counter
для этого типа:
subtype MY_COUNTER_TYPE is integer range 0 to 9;
signal counter : MY_COUNTER_TYPE := 9;
Объявите функцию «скользящего декремента» для своего собственногоподтип, который сбрасывает значение обратно до максимально возможного значения в диапазоне, если декремент уменьшит значение в диапазоне:
function r_decrement(val : MY_COUNTER_TYPE) return MY_COUNTER_TYPE is
begin
if val = MY_COUNTER_TYPE'LOW then
return MY_COUNTER_TYPE'HIGH;
else
return val - 1;
end if;
end function;
Теперь вы можете использовать функцию скользящего декремента типа, не беспокоясь осброс счетчика вручную или проверка, приведет ли уменьшение к выходу сигнала из допустимого диапазона:
if rising_edge(clk) then
counter <= r_decrement(counter); -- "rolling" decrement
if counter = 0;
-- raise flag telling other logic to do stuff
end if;
end if;
Так что да, это возможно. И если вы используете в своем дизайне множество таких счетчиков, вы можете избежать написания большого количества избыточного кода при проверке пределов счетчиков и сбросе значения обратно на reset_value
вручную.