Счетчик выполняет последовательное увеличение или уменьшение своего выходного значения по каждому тактовому импульсу. Простейшийвариантсчетчикапоказанниже:
architectureBehavioralofcounteris
-- локальное объявление сигнала для счетчика
signalcnt : std_logic_vector (7 downto 0);
begin
process(clk)
begin
ifrising_edge(clk) then
cnt<= cnt + 1;
end if;
end process;
endBehavioral;
Поскольку для хранения значения счетчика выбрано 8 разрядов, счетчик будет осуществлять циклическое приращение своего значения от 0 до 255, после чего операция 255+1 опять сделает значение cnt равным 0.
Для счетчиков используются следующие возможности:
– разрешение счета;
– регулируемое направление счета (up/down);
– возможность сброса;
– возможность загрузки.
Счетчик с регулируемым направлением счета приведен в следующем примере:
architecture Behavioral of counter is
-- локальноеобъявлениесигналадлясчетчика
signalcnt : std_logic_vector (7 downto 0);
begin
process(clk)
begin
ifrising_edge(clk) then
ifup_down = ‘1’ then
cnt<= cnt + 1;
else
cnt<= cnt - 1;
end if;
end if;
end process;
end Behavioral;
Счетчик имеет дополнительный управляющий вход up_down. Высокий логический уровень на этом входе означает счет на увеличение значения счетчика, а низкий – на уменьшение.
Счетчик с загрузкой имеет дополнительные входы – разрешение загрузки и загружаемые данные. Если на входе разрешения загрузки присутствует активный уровень, то счетчик принимает значение, заданное внешней шиной. Таким образом, с помощью этого интерфейса можно принудительно задать требуемое значение счетчика.
Пример счетчика с синхронным сбросом и загрузкой:
architecture Behavioral of counter is
-- локальноеобъявлениесигналадлясчетчика
signalcnt : std_logic_vector (7 downto 0);
begin
process(clk)
begin
ifrising_edge(clk) then
if reset = ‘1’ then
cnt<= (others => ‘0’);
elsif load = ‘1’ then
cnt<= d_in;
else
cnt<= cnt + 1;
end if;
end if;
end process;
end Behavioral;
Как и для остальных цифровых модулей на базе ПЛИС, рекомендуется использовать синхронный сброс вместо асинхронного.
Двоичное кодирование является не единственно возможным алгоритмом работы счетчика. Вместо последовательного перебора двоичных значений в процессе работы возможно использование и других кодировок. Например, код Грея (Graycode) имеет то свойство, что для перехода к следующему значению достаточно изменить значение единственного разряда. Это полезно при обработке сигналов, в которых существует вероятность сдвига по времени между отдельными разрядами. Например, при переходе от двоичного состояния 0111 (710) к 1000 (810) из-за неодновременной смены разрядов может появиться состояние 0000, 1111 (или любое другое, в зависимости от порядка смены разрядов). В то же время подобный эффект при использовании кода Грея приведет к максимальной ошибке, равной 1.