Pull to refresh

Элемент задержки на VHDL

Programming microcontrollers *
Sandbox
При проектировании различных цифровых устройств, в частности, контроллеров, требуется организовать задержку подачи одного и того же сигнала на различные выводы ПЛИС или на другие элементы внутри ПЛИС.

Для начала рассмотрим подобную ситуацию с дискретной логикой. Обычно, если у разработчика имеется микросхема с шестью вентилями НЕ (например ,155ЛН1), в качестве элемента задержки (величиной 10…20 наносекунд) он использует последовательное соединение двух элементов. Иногда между ними он вставляет RC-цепь, с помощью которой можно сделать время задержки от 10 до 150 нс.

В микросхеме ПЛИС задержку таким способом организовать НЕЛЬЗЯ. Всё дело в особенностях синтеза проекта. Программа синтеза воспринимает двойное отрицание как лишнее звено (как ошибку) и устраняет его. На RC – цепях так же нельзя организовывать задержку, потому что ПЛИС плохо терпит емкостную нагрузку. Поэтому для организации задержки я рекомендую следующий способ. Эскизно это выглядит так:
image
Сигнал Сt – это тот же самый сигнал С, только задержанный на 100 нс.

Сигнал опорного времени – это импульсный сигнал с определенной частотой, который нам нужно использовать в элементе задержки. Период этого сигнала представляет собой минимально возможное время, на которое мы можем задержать сигнал Сt относительно С. В нашем случае период сигнала опорного времени равен 50 нс (частота равна 20 MГц).

Теперь представляю Вашему вниманию «железную» структуру элемента задержки:
image
В этой структуре присутствует только один непонятный элемент голубого цвета “?”. На самом деле он представляет собой всего лишь продукт комбинаторной логики. Расшифровывать структуру этого элемента я не буду, приведу лишь его таблицу истинности:
image
Элемент Т – обыкновенный D- триггер с синхронизацией по фронту сигнала С. Элемент СТ – счетчик импульсов опорной частоты (времени) REFTIME. Помимо входа синхросигнала CLK он имеет разрешающий вход СЕ. Для формирования времени задержки в 100 нс счетчик должен завершить счет, досчитав до двух (50 x 2 = 100). Этот параметр необходимо впоследствии указать в VHDL-коде счетчика. Элемент розового цвета – 3-ИЛИ. Буфер BUF необходим для разделения выходного сигнала Сt и внутреннего сигнала CLR.

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

Внешний сигнал REFTIME с частотой 20 МГц подается на счетчик СТ постоянно. Вход “D” триггера T постоянно привязан к логической единице. При подаче на вход CLK триггера фронта сигнала С на входе элемента 3-ИЛИ появляется первая единица. Этот элемент тут же разрешает счетчику счет. Как только счетчик досчитал до 2х, тут же происходит сброс D-триггера в состояние логического нуля и вместе со следующим импульсом REFTIME на его выходах появляются логические нули. Одновременно с этим запрещается счет.

Особенность данной схемы заключается в том, что сигнал С не только задерживается на 100 нс, но и до кучи его длительность также укорачивается до 50 нс (т.е. до периода опорного сигнала). В большинстве случаев такая особенность не критична и на нее просто можно не обращать внимания. Но эту особенность можно использовать и целенаправленно для формирования длительности импульса.

Представляю Вашему вниманию текст VHDL-программы элемента задержки:
image

Процесс с меткой p1 описывает поведение D-триггера, в то время как процесс с меткой p2 – счетчика.
Tags:
Hubs:
Total votes 6: ↑4 and ↓2 +2
Views 20K
Comments Comments 10