AFON // радиотехник affonya@mail.ru
← Проекты на VHDL

Проект 05. Двоичный счётчик с разрешением

Счётчик 0…255 со сбросом, разрешением счёта и сигналом переполнения. Проект вводит арифметику над векторами и правильное приведение типов.

Задача

Считать тактовые импульсы и выдавать сигнал переполнения.

Тип схемы: Синхронный счётчик с асинхронным сбросом и разрешением.
Модуль: counter8. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования. Теорию по языку смотрите в статье VHDL — язык описания аппаратуры, по самим микросхемам — на странице ПЛИС.

Алгоритм

  1. Подключить ieee.numeric_std — она даёт арифметику над векторами.
  2. Объявить внутренний сигнал типа unsigned.
  3. По фронту такта при разрешении увеличивать его на единицу.
  4. На выход подать значение с приведением к std_logic_vector.

Код на VHDL

Код проверен компилятором GHDL: проходит анализ и элаборацию без ошибок и предупреждений. Скачать: v05.vhd

--=====================================================
-- Проект 05. Двоичный счётчик с разрешением
-- Счётчик 0..255 со сбросом, разрешением счёта
-- и сигналом переполнения.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;                               -- арифметика над векторами

entity counter8 is
    port (
        clk     : in  std_logic;
        rst     : in  std_logic;
        en      : in  std_logic;                        -- разрешение счёта
        count   : out std_logic_vector(7 downto 0);
        carry   : out std_logic                         -- переполнение
    );
end entity counter8;

architecture rtl of counter8 is
    signal cnt : unsigned(7 downto 0) := (others => '0');
begin
    process (clk, rst)
    begin
        if rst = '1' then
            cnt <= (others => '0');
        elsif rising_edge(clk) then
            if en = '1' then
                cnt <= cnt + 1;                         -- переполнение произойдёт само
            end if;
        end if;
    end process;

    count <= std_logic_vector(cnt);                     -- приведение типа для выхода
    carry <= '1' when cnt = 255 and en = '1' else '0';
end architecture rtl;

Пояснения

  • Над std_logic_vector арифметика напрямую невозможна: это просто набор бит. Для сложения его приводят к unsigned или signed.
  • Библиотека numeric_std — стандартная и переносимая; устаревшую std_logic_arith в новых проектах не применяют.
  • Счётчик переполняется автоматически: после максимума значение обнуляется, дополнительная проверка не нужна.

Что дальше

Следующие проекты — в разделе проекты на VHDL. Сравнить подход с языком Verilog можно в статье Verilog, а разобраться в устройстве самих кристаллов — в статье ПЛИС: FPGA и CPLD.