Избавление от нарушения времени удержания (Xilinx HDL)

Я внедряю контроллер DSO в FPGA, и у меня возникают проблемы со слишком большим количеством нарушений времени удержания (пока лучший результат P&R был 3 ошибки времени удержания где-то около -2 нс).

Суть моей проблемы в том, что у меня есть буфер FIFO с вводом от дециматора выборки АЦП, а затем вывод на синхронный FT245 (60 МГц). Прореживатель входного сигнала может быть настроен на прореживание в степени 2 (например, 1, 2, 4, 8, 16 ...), что также делит тактовую частоту выборок АЦП (150 МГц).

И теперь мой подход заключается в том, что я предоставляю разделенную (или прямую, если коэффициент прореживания 0) тактовую частоту для буфера, когда я захватываю данные, а затем я переключаюсь на подачу тактовой частоты 60 МГц от FT245, когда я отправляю образцы на ПК. В симуляции он работает отлично, но проблема заключается в размещении и маршруте, этот маршрутизатор выдаст эту ошибку:

Route:466 - Unusually high hold time violation detected among 226 connections. The top 20 such instances are printed below. The
   router will continue and try to fix it

Затем он сжимается в течение 10-15 минут, пока не выдаст мне отчет о времени, информирующий меня, что все временные ограничения настройки были соблюдены и что есть 3 нарушения времени удержания для часов 150 МГц (часы 60 МГц в порядке).

Я читал, что проблема может заключаться в использовании стробируемых часов, что FPGA не может правильно распределять часы, но я попытался использовать подход вместо стробирующих часов FIFO, я подключил часы 150 МГц непосредственно к FIFO, и я стробировал данные в FIFO с помощью dataReady (это фактически закончился тем же сигналом, что и ранее стробированные часы), тогда у меня было гораздо больше (50-60) нарушений времени удержания, чем сейчас.

Есть ли какой-нибудь известный хороший подход для многочастотного FIFO? Не два (их много даже в примерах в Xilinx ISE). Или идея прореживания отсчетов АЦП в ПЛИС не годится?

Целевая ПЛИС - Spartan 6 LX25, класс скорости -2 (к сожалению, мне не удалось достать оценку скорости -3).

Вот пример слабости, которую он мне дает:

Slack (hold path):      -2.031ns (requirement - (clock path skew + uncertainty - data path))
  Source:               decimator_clock_divisor/decimationRatio_0 (FF)
  Destination:          trigger_analog1/previousValue_2 (FF)

Упомянутый источник - это сигнал (и все нарушения, которые он мне дает), который не меняется очень часто, он фактически контролируется графическим интерфейсом, поэтому я не знаю, как там могло быть нарушение времени удержания. Это путь от соотношения дециматора к буферу триггера (или моему буферу FIFO при другом нарушении).

По сути, мой вопрос в том, стоит ли мне вообще заботиться об этих нарушениях?

Потому что после изменения коэффициента прореживания могут пройти тысячи тактов, прежде чем я фактически начну использовать результаты прореживания в триггере.

Я знаю, что маршрутизатор не может знать, как часто я меняю асинхронный сигнал (он асинхронный, поскольку я устанавливаю его из области тактовой частоты 60 МГц) и сколько времени мне потребуется, чтобы использовать результат какого-либо модуля. Проблема в том, что я не знаю, когда он показывает мне эти 3 нарушения после завершения PAR, окончательно ли, что нет других нарушений, которые были просто затенены этими 3 нарушениями?

Можно ли опубликовать симуляцию PAR, чтобы проверить, будет ли она работать на борту? Я бы попробовал его на плате, но мне нужно подождать 2 недели до пайки BGA, и у меня осталось всего 4 недели, чтобы закончить диссертацию, поэтому я хочу быть уверен, что мой дизайн будет работать.


person Bruno Kremel    schedule 09.04.2013    source источник


Ответы (1)


FIFO может действовать как асинхронный. Граничный мост между двумя основными тактовыми доменами 60 МГц и 150 МГц. Строго разделите логику обоих тактовых доменов. Для связи должно быть только несколько известных медленных управляющих сигналов (достаточно медленных, чтобы можно было применить временные ограничения ложных трактов). Например, графический интерфейс записывает частоту тактовой частоты в регистр на стороне 60 МГц. Затем он сигнализирует быстрой стороне о новом значении. Быстрая сторона фиксирует это значение через несколько циклов после получения уведомления (например, обнаружение нарастающего фронта с некоторой дополнительной осторожностью для метастабильности). Функциональная логика на быстрой стороне всегда использует вывод этого теневого регистра, который также находится на быстрой стороне.

Для разделения часов на стороне быстрого АЦП вы можете использовать полную частоту и включить, как вы описали (и я бы тоже предпочел), или вы можете разделить часы самостоятельно. При разделении часов обязательно следуйте примерам из документации Xilinx. Например, иногда для распределения часов требуется буфер часов.

Если есть оставшиеся нарушения пути удержания, посмотрите на часы и время прибытия часов исходного и целевого FF. Иногда, когда часы захвата целевого FF задерживаются, данные поступают слишком рано. Маршрутизатор может исправить это, просто отложив передачу данных. Он не может исправить это, если требование настройки не допускает дальнейшей задержки (может быть случай, когда неопределенность между двумя часами слишком высока).

person deepsubmicron    schedule 09.04.2013
comment
Я принимаю это как ответ, потому что благодаря вашим предложениям мне удалось получить PAR с показателем времени 0. - person Bruno Kremel; 10.04.2013