Задача
Считать тактовые импульсы и выдавать сигнал переполнения.
Тип схемы: Синхронный счётчик с асинхронным сбросом и разрешением.
Модуль: counter8. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования.
Теорию по языку смотрите в статье VHDL — язык описания аппаратуры,
по самим микросхемам — на странице ПЛИС.
Алгоритм
- Подключить
ieee.numeric_std— она даёт арифметику над векторами. - Объявить внутренний сигнал типа
unsigned. - По фронту такта при разрешении увеличивать его на единицу.
- На выход подать значение с приведением к
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.