Найти тему
IT. Как это работает?

Гонка сигналов - бич цифровой электроники

Оглавление

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

Просто подаем тактовые импульсы на вход конструкции и наблюдаем за состоянием внутренностей.

Моделирование с виду показывает корректность схемы
Моделирование с виду показывает корректность схемы

На двух верхних линиях замедленные тактовые сигналы (_slowtick, _tick). Верхний медленный на запись, нижний побыстрее на чтение. Блок записи дошел до ячейки 8 (addrWrite), блок чтения приступил к выборке данных из младшей половинки адресного пространства (addrReadFull). Сигнал установки прерывания (interrupt) установлен вместе с адресом 8. Это самая первая ячейка в старшей банке. Сигнал прерывания interrupt продержится пока блок чтения не считает сколько положено и сам себе его не уберет сигналом сброса (res). Это происходит когда на счетчике адреса произошло переполнение и обнуление.

На линиях сигнала к сегментам (segment) индикатора происходит движение. Нулевой уровень сигнала последовательно зажигает сегменты индикатора.

Считывание данных со старшей банки
Считывание данных со старшей банки

Проблема гонки сигналов

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

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

А тут еще длина линии сигнала тактовых импульсов не вполне понятна и еще большой вопрос в какой именно момент возникает передний фронт. На нашей модели проекта передние фронты тактов как раз приходятся на границу смены состояния шин.

Ошибочный вариант проектирование устройства, приводящий к гонке сигналов
Ошибочный вариант проектирование устройства, приводящий к гонке сигналов

Это иногда становится кошмаром для начинающих разработчиков. Когнитивный диссонанс между тем, что в модели и тем что наблюдаем при эксперименте. У всего этого есть название гонка сигналов. По счастью, рецепт один на все времена.

В идеале фронт тактового сигнала должен приходиться на середину между сменой состояния на шинах.

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

Видео-обзор с канала YouTube

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

Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.