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