Задача
Запомнить значение входа по фронту тактового сигнала.
Тип схемы: Последовательностная схема: один триггер и восьмиразрядный регистр со сбросом.
Модуль: dff_reg. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования.
Теорию по языку смотрите в статье VHDL — язык описания аппаратуры,
по самим микросхемам — на странице ПЛИС.
Алгоритм
- Объявить тактовый вход, сброс, информационные входы и выходы.
- В списке чувствительности указать только такт и асинхронный сброс.
- Сначала проверить сброс, затем фронт функцией
rising_edge(clk). - Внутри ветви фронта выполнить защёлкивание данных.
Код на VHDL
Код проверен компилятором GHDL: проходит анализ и элаборацию без ошибок и предупреждений. Скачать: v04.vhd
--=====================================================
-- Проект 04. D-триггер и регистр
-- Первая последовательностная схема: значение
-- защёлкивается по фронту тактового сигнала.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;
entity dff_reg is
port (
clk : in std_logic; -- тактовый сигнал
rst : in std_logic; -- асинхронный сброс
d : in std_logic; -- вход триггера
q : out std_logic; -- выход триггера
din : in std_logic_vector(7 downto 0); -- вход регистра
dout : out std_logic_vector(7 downto 0) -- выход регистра
);
end entity dff_reg;
architecture rtl of dff_reg is
begin
-- одиночный D-триггер
process (clk, rst)
begin
if rst = '1' then -- сброс вне такта
q <= '0';
elsif rising_edge(clk) then -- фронт такта
q <= d;
end if;
end process;
-- восьмиразрядный регистр — тот же шаблон для шины
process (clk, rst)
begin
if rst = '1' then
dout <= (others => '0');
elsif rising_edge(clk) then
dout <= din;
end if;
end process;
end architecture rtl;
Пояснения
- Шаблон «if сброс … elsif rising_edge(clk)» — канонический для синхронных схем; любой синтезатор распознаёт его как триггер с асинхронным сбросом.
- В тактовом процессе данные не включают в список чувствительности: схема реагирует только на фронт такта.
- Присваивание сигналу внутри процесса вступает в силу не мгновенно, а в конце дельта-цикла — именно поэтому регистр защёлкивает старое значение, а не новое.
Что дальше
Следующие проекты — в разделе проекты на VHDL. Сравнить подход с языком Verilog можно в статье Verilog, а разобраться в устройстве самих кристаллов — в статье ПЛИС: FPGA и CPLD.