[an error occurred while processing this directive]
|
Хочу добавить. Все сказанное верно, НО! Бывает (редко, но все же бывает) никак не обойтись без чего-либо асинхронного. В этом случае, особенно если сигнал формируется логической операцией из тактовой частоты и какого либо другого сигнала (например мультиплексор тактовой частоты, или формирование сигнала записи для асинхронного ОЗУ) надо обязательно четко себе представить соотношение времянок, и, если надо, задержать один из сигналов при помощи вставления в исходник примитивов из технологической библиотеки. В либах ASIC'ов для этого сущемствуют специальные элементы с нормированной задержкой. В условиях FPGA сложнее. Для альтеры в качестве этого выступает LCELL, CASCADE, EXP, и т.п. Для хилинха не знаю.
Вот два примера (в конце) - первый будет глючить, второй - нет.
В первом получается так, что в зависимости от того, как развелось, сигнал (!clock) будет приходить в большинстве случаев разводки раньше сигнала с выхода my_reg. Как результат - в момент переключения my_reg с 1 в 0 будет на выходе глитч, с длительностью, зависящей от маппера, рутера, и прочей фазы луны.
Во втором случае - задержка сигнала (!clock) цепочкой из 4-х буферов будет точно больше, чем время установления сигнала на выходе регистра. Следовательно и глитча не будет. Если рассчитать длину линии задержки так, что-бы при любом расположении на кристалле требуемая времянка выполнялась, или (если позволяет синтезатор-роутер) законстрейнить эти пути и по min_delay, и по max_delay, то глюков, вызванных на таких "сопливых" участках глитчами не будет при любом рероутинге.
-----------------
my_reg:dff;
my_reg.clk = clock;
asyn_out = (!clock) & my_reg;
-----------------
asyn_out = LCELL(LCELL(LCELL(LCELL(!clock)))) & my_reg;
ЗЫ
Число LCELL'ов 4 я взял от фонаря, ничего не считая. На самом деле их может быть и меньше, и больше :-)
ЗЗЫ
Естественно вставлять технологические ячейки можно не только в AHDL. В верилоге этим тоже пользуюсь, если надо. Про VHDL не знаю.
ЗЗЗЫ
Вот для асиков можно сгенерить SDF для любой заданной рабочей температуры и напряжения питания. А для FPGA с этим как? Как раз для вычисления необходимых задержек это очень помогло бы.
E-mail: info@telesys.ru