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

Проект 13. Синхронизатор тактовых доменов

Любой сигнал извне приходит вразрез с тактовой сеткой и способен ввести триггер в метастабильное состояние. Цепочка триггеров делает его безопасным для схемы.

Задача

Безопасно ввести асинхронный сигнал в тактовый домен схемы.

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

Алгоритм

  1. Объявить цепочку триггеров, длина задаётся параметром.
  2. По каждому фронту сдвигать сигнал по цепочке.
  3. Забирать значение с последней ступени.
  4. Использовать только синхронизированную версию сигнала.

Код на VHDL

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

--=====================================================
-- Проект 13. Синхронизатор тактовых доменов
-- Внешний асинхронный сигнал заводится в схему
-- через цепочку триггеров — иначе возможен сбой.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;

entity synchronizer is
    generic (
        STAGES : integer := 2                           -- число ступеней
    );
    port (
        clk      : in  std_logic;
        rst      : in  std_logic;
        async_in : in  std_logic;                       -- асинхронный вход
        sync_out : out std_logic                        -- сигнал в домене clk
    );
end entity synchronizer;

architecture rtl of synchronizer is
    signal chain : std_logic_vector(STAGES-1 downto 0) := (others => '0');
begin
    process (clk, rst)
    begin
        if rst = '1' then
            chain <= (others => '0');
        elsif rising_edge(clk) then
            -- сдвигаем сигнал по цепочке триггеров
            chain <= chain(STAGES-2 downto 0) & async_in;
        end if;
    end process;

    sync_out <= chain(STAGES-1);
end architecture rtl;

Пояснения

  • Метастабильность — реальное явление: при нарушении времени установки триггер может на неопределённое время зависнуть между нулём и единицей.
  • Две ступени снижают вероятность сбоя до пренебрежимо малой; на высоких частотах ставят три.
  • Многоразрядную шину так синхронизировать нельзя — разряды придут в разное время. Для шин применяют FIFO или сигнал готовности.

Что дальше

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