Синтезируемый асинхронный проект fifo к FPGA

Мне нужен совет о том, как проектировать асинхронный FIFO. Я понимаю проблему метастабильности при захвате данных в другой тактовый домен. Мой вопрос заключается в том, как использование сдвигового регистра с двумя триггерами помогает синхронизировать указатель записи и значения указателя чтения для вычисления полного и пустого флага. Когда регистр захватывает данные из другого домена, существует вероятность, что он может войти в метастабильное состояние и может установить неизвестное значение, так как эффективно решить эту проблему.

Спасибо

2 ответа

Решение

Ваши указатели чтения и записи должны использовать кодировку серого цвета при передаче из одного часового домена в другой. Как вы должны знать, только 1 бит серого счетчика отличается между двумя последовательными значениями. Таким образом, метастабильность может влиять только на один изменяющийся бит. После повторной синхронизации переданный указатель будет либо обновленным указателем, либо его предыдущим значением.

В любом случае, это не проблема и приведет только к пессимистическим флагам / счетчику для вашего FIFO.

Я использую обычный счетчик для моего указателя чтения / записи и использую следующие функции для преобразования их в серый код. Они в VHDL, но вы должны понять:

function bin_to_gray(a: unsigned) return unsigned is
begin
    return a xor ('0' & a(a'left downto 1));
end function bin_to_gray;

function gray_to_bin(a: unsigned) return unsigned is
    variable ret   : unsigned(a'range);
begin
    ret(a'left) := a(a'left);
    for i in a'left-1 downto 0 loop
        ret(i) := ret(i+1) xor a(i);
    end loop;
    return ret;
end function gray_to_bin;

Джонатан объяснил это хорошо. Я просто хотел бы добавить несколько моментов: во-первых, помимо ваших двухступенчатых регистров синхронизатора, у вас также должен быть исходный регистр. Вы никогда не сможете подавать сигналы от комбинационной логики в свой двухступенчатый синхронизатор, поскольку комбинационная логика приводит к сбоям.

Вы также должны знать, что Verilog и VHDL не имеют встроенной поддержки пересечений часового домена и метастабильности. Даже если вы создадите надлежащий двухступенчатый синхронизатор для передачи указателей с серым кодом, нет гарантии, что инструмент синтеза не изменит ваши синхронизаторы таким образом, чтобы сделать его неэффективным для защиты от метастабильности. Некоторые инструменты синтеза пытаются обнаружить синхронизаторы и оставить их в покое. Некоторые нет. И в любом случае, вы не должны полагаться на это. Для полностью правильного пересечения часового домена необходимо ограничить синхронизатор и исходный регистр, используя атрибуты, специфичные для поставщика, и временные ограничения SDC.

Другие вопросы по тегам