Счетчики с простым обратным отсчетом и целое число без знака - PullRequest
0 голосов
/ 22 октября 2019

Вместо того чтобы строить счетчики следующим образом -

signal my_counter : unsigned(3 downto 0) := to_unsigned(9, 4);
signal reset_value : unsigned(3 downto 0) := to_unsigned(9, 4);
--...
--...
process(clk)
begin
    if rising_edge(clk) then
        counter <= counter - 1;
        if counter = 0 then
            counter <= reset_value;
            -- raise flag telling other logic to do stuff
        end if;
    end if;
end process;

Не могли бы вы сделать это с целочисленным обратным отсчетом в диапазоне? и, следовательно, вам не нужно иметь reset_value? Может ли это выглядеть примерно так ...

signal my_counter_int : integer range 0 to 9 := 9;
--...
--...
process(clk)
begin
    if rising_edge(clk) then
        counter <= counter - 1;
        if counter = 0 then
            -- raise flag telling other logic to do stuff
        end if;
    end if;
end process;

Я просто смотрю, можно ли выполнить косвенный переход к 9 с целым числом с заданным диапазоном.

1 Ответ

0 голосов
/ 22 октября 2019

Создайте свой собственный подтип из целого числа с правильным диапазоном (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 вручную.

...