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

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

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

Как видите нам понадобились 4 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

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

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий

  1. Алексей

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

    Ответить
    1. lamazavr

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

      Ответить
  2. Артем

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

    Ответить
    1. lamazavr

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

      Ответить