Счетчик в ПЛИС

При разработке для ПЛИС всегда есть два варианта, либо разрабатывать цифровое устройство схематически (путем составления его схемы из готовых элементов) или описание на его посредством языков вроде VHDL, Verilog.
Исключением не является и проектирование счетчиков.
Счетчики - одно из простейших цифровых устройств. Счетчики делят на суммирующие (с прямым счетом) и вычитающие (с обратным счетом). Другим не маловажным параметром является разрядность счетчика.
В данной статье речь пойдет о четырехразрядном суммирующем счетчике.

Сначала рассмотрим метод описания счетчика путем описания его схемы на D-триггерах:

Схема счетчика на D-триггерах

Как видите нам понадобились 4 D-триггера. В идеале нужны триггеры с двумя выводами (прямым и инверсным). У меня в библиотеке таких не нашлось, поэтому я взял еще четыре элемента НЕ (инвертора). Данную схему можно назвать классической, ею пользуются уже много лет. Тем не менее она не теряет свою актуальность.
Вот так выглядят временные диаграммы работы сего устройства:

Временная диаграмма работы счетчика на D-триггерах

Все просто и без лишней возни. В схеме присутствует сигнал сброса счетчика CLRN.
Недостатком такого метода можно назвать разве что плохую переносимость (ну и конечно для большей разрядности надо больше триггеров, что не всегда удобно). К примеру если вы захотите сменить производителя ПЛИС, вам придется заново набирать схему в новой среде разработки.

Второй метод (описание счетчика при помощи VHDL кода) лишен данного недостатка, но предполагает наличие хотя бы начальных знаний в области программирования на VHDL.
Код счетчика четырехразрядного счетчика с прямым счетом на VHDL:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity count is
	port
	(
		clk		: in std_logic;
		reset	: in std_logic;
		q		: out integer range 0 to 15
	);
end entity;

architecture rtl of count is
begin
	process (clk)
		variable   cnt	: integer range 0 to 15;
	begin
		if (rising_edge(clk)) then
			if reset = '1' then
				-- сбрасываем счетчик в 0
				cnt := 0;
			else
				-- инкрементируем счетчик
				cnt := cnt + 1;
			end if;
		end if;
		
		-- устанавливаем текущее значение на выводы
		q <= cnt;
	end process;

end rtl;

Такой подход безусловно более выгоден. Вы можете наращивать значение счетчика простым изменением разрядности переменных cnt и q.
Смысл этого кода в том, что по приходу на вход CLK импульса, увеличивается переменная хранящая значение счетчика - cnt.
При установке 1 на вход reset, счетчик сбрасывается.

Временная работы счетчика описанного на VHDL:

Временная диаграмма работы счетчика на VHDL

Как видите все работает. Милости прошу вопросы в комментарии.

Просмотров:   9542

Комментарии

пн, 08/10/2015 - 19:34
Алексей

Я новичок ! скажите пожалуйста, вот у Вас переменная clk и reset имеют тип std_logic, а переменная q -integer. Каким образом можно значение q вывести на выводы ПЛИС? Ведь на выводы можно вывести только переменные типа std_logic или std_logic_vector. Может я в чем то ошибаюсь?

сб, 08/15/2015 - 10:39

Это только представление сигнала, в любом случае это будут битовые сигналы. Если Вы создадите integer выход из блока он будет представлен в виде шины, которую можно назначить на выходы.

пн, 12/14/2015 - 16:56
Артем

А как добавить q[0], q[1], q[2], q[3]?

пт, 12/18/2015 - 11:44

Мы определили q как целое число до 15. При синтезе оно будет представлено 4битной шиной q[0..3]. Ничего добавлять не нужно.

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!