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

от автора

Доброго времени суток, уважаемые хабравчане.

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


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

<code> 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 </code>   

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

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

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

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

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

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

ссылка на оригинал статьи http://habrahabr.ru/post/232599/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *