[Перевод] Временной анализ FPGA или как я осваивала Timeqwest

Доброго времени суток, уважаемые хабравчане.На самом деле я инженер-радиофизик и программирование ПЛИС не является моей непосредственной деятельностью, но в один момент понадобилось написать программу для синхронизации нескольких осцилографических модулей и пришлось осваивать эту науку. О том какие у меня возникли с этим проблемы в под кате.

4993b327f82742dfa865f88f2c27d869.png

Многие Надеюсь хотя бы один из вас программировал под FPGA на уровне выше чем моргание светодиодом. Если такое было, то вы могли бы заметить что иногда что-то работает не так. Возникают проблемы с таймингами подобного рода: с повышение частоты, система становится нестабильной, битики начинают залипать, данные пропадают и проект не работает.Эта перефраз статьи о том, откуда эти проблемы берутся и как с ними бороться. Автор поста использует ALTERA и софт для разработки той же фирмы (Quartus II).Что бы лучше понять суть проблемы рассмотрим простейшую модель 8 ми битной ячейки памяти.

module habr111( input [7:0] data, input clk, output[7:0] out );

reg [7:0] count; always @ ( posedge clk ) count <= data;

assign out = count;

endmodule

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

9fbf7f1ac91d4136bb01be4d33f10d32.png

Все дело в том, что д-триггер цифровое устройство только в первом приближении. То есть по сути это набор аналоговых транзисторов, имеющие свое время нарастания фронтов. Бывает, что clock ловит момент, когда сигнал дорастает до напряжения перехода между 0 и 1. Это называется метастабильным состоянием и что будет сформировано на выходе не очевидно.Так же каждый бит имеет свою задержку: какие-то биты приходят раньше, какие-то позже. Если переключение данных происходит в момент переключения clocka, то из-за вышеописанного эффекта, на выход идет мешанина старых и новых битов.

Что бы проект работал корректно, необходимо избавиться от этих эффектов. Для этого надо самостоятельно считать те самые времена. В Quartus II этим занимается программа timeqwest. Спрашивается: зачем нам это знать?

Схема по которой timeqwest обсчитывает тайминги состоит из двух регистров. Если все их параметры известны, она посчитает и сделает правильную разводку. Но если есть некий внешний регистр, о котором у timeqwest никакой информации нет, то разработчику необходимо посчитать и ввести все самостоятельно. Как это делается описывается в этой статье.

мой вольный перевод

Надеюсь кому-нибудь это поможет так же, как помогло и мне.

© Habrahabr.ru