Перемещение данных между процессами в Spartan 3

У меня есть два процесса A и B, каждый со своим собственным тактовым входом.

Тактовые частоты немного отличаются, поэтому и не синхронизированы.

Процесс A берет данные из IC, эти данные необходимо передать процессу B, который затем должен записать эти данные в другой IC.

Мое текущее решение использует несколько простых сигналов рукопожатия между процессами A и B. Память была объявлена ​​​​как распределенная RAM (128 байт в виде массива std_logic_vector (7 до 0)) внутри процесса A (не блочная память).

Я использую Spartan 3AN от Xilinx и ISE Webpack.

Но правильный ли это способ?

Я где-то читал, что Spartan 3 имеет двухпортовую блочную память, поддерживающую два такта, так будет правильнее?

Причина, по которой я спрашиваю, в том, что мой дизайн ведет себя непредсказуемо, и в таких случаях я просто ненавижу магию. :-)


person JakobJ    schedule 27.09.2012    source источник


Ответы (3)


За исключением очень специфических исключительных случаев, единственным правильным способом перемещения данных между двумя независимыми доменами часов является использование асинхронного FIFO (также более правильно называемого многоскоростным FIFO).

Почти во всех FPGA (включая используемые вами части Xilinx) вы можете использовать FIFO, созданные поставщиком — в случае Xilinx вы делаете это, создавая себя FIFO с помощью инструмента CoreGen.

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

Вы также можете подумать, нужно ли вашему проекту действительно иметь несколько доменов часов. Иногда это абсолютно необходимо, но это гораздо, НАМНОГО реже, чем думает большинство начинающих. Например, даже если вам нужна логика, работающая на нескольких частотах, вы часто можете справиться с этим, используя одиночный тактовый сигнал и соответствующим образом сгенерированный синхронный тактовый сигнал.

person wjl    schedule 27.09.2012

Волшебство, которое вы испытываете, скорее всего, связано с тем, что вы либо неправильно ограничили свой дизайн в синтезе, либо неправильно выполнили рукопожатие. У вас есть два варианта:

  1. ФИФО

Используйте многоскоростной FIFO, как указано wjl, что является очень распространенным решением, работает всегда (если все сделано правильно) и требует огромных ресурсов. Большим плюсом этого решения является то, что вам не нужно заботиться о реальных проблемах пересечения доменов часов, и вы получите максимальную пропускную способность между двумя доменами. Никогда не пытайтесь создать асинхронный FIFO в VHDL, потому что это не сработает; даже в VHDL есть некоторые вещи, которые вы просто не можете сделать должным образом; используйте соответствующие генераторы от Xilinx, я думаю, что это CoreGen

  1. Подтверждение связи

Имейте как минимум два регистра для ваших данных в двух доменах и создайте полную логику запроса/подтверждения установления связи, она не будет работать должным образом, если вы не включите их. Убедитесь, что логика квитирования правильно синхронизирована, добавив как минимум два регистра для сигналов квитирования в принимающем домене, потому что в противном случае вы, скорее всего, получите непредсказуемое поведение из-за проблем с метастабильностью.

person BennyBarns    schedule 28.09.2012
comment
С VHDL (наряду с ограничением по времени для ограничения перекоса между сигналами, которые пересекают домены синхронизации) вполне возможно построить правильный асинхронный FIFO. - person Forrest Voight; 15.04.2015

Чтобы получить набор флагов «действителен/подтвержден» для доменов часов, вы можете посмотреть Flancter и вот его применение

Но в общем случае использование FIFO с двумя часами является повседневным. Написание собственного будет интересным упражнением, но проверка всех потенциальных случаев синхронизации часов — это кошмар. Это одно из немногих мест, где я буду создавать экземпляр блока Coregen.

person Martin Thompson    schedule 28.09.2012