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

Проект 04. D-триггер и регистр

Схема запоминает состояние: значение защёлкивается по фронту тактового сигнала. Отсюда начинается вся синхронная логика — счётчики, автоматы, память.

Задача

Запомнить значение входа по фронту тактового сигнала.

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

Алгоритм

  1. Объявить тактовый вход, сброс, информационные входы и выходы.
  2. В списке чувствительности указать только такт и асинхронный сброс.
  3. Сначала проверить сброс, затем фронт функцией rising_edge(clk).
  4. Внутри ветви фронта выполнить защёлкивание данных.

Код на 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.