Счетчик выполняет последовательное увеличение или уменьшение своего выходного значения по каждому тактовому импульсу. Простейшийвариантсчетчикапоказанниже:

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.

  =  Перейти к содержанию  =