В прошлый раз нам удалось собрать множество модулей в единый организм, способный продемонстрировать возможности двухпортовой памяти, работающей в качестве буфера данных. Пришло время провести моделирование работы основных узлов.
Просто подаем тактовые импульсы на вход конструкции и наблюдаем за состоянием внутренностей.
На двух верхних линиях замедленные тактовые сигналы (_slowtick, _tick). Верхний медленный на запись, нижний побыстрее на чтение. Блок записи дошел до ячейки 8 (addrWrite), блок чтения приступил к выборке данных из младшей половинки адресного пространства (addrReadFull). Сигнал установки прерывания (interrupt) установлен вместе с адресом 8. Это самая первая ячейка в старшей банке. Сигнал прерывания interrupt продержится пока блок чтения не считает сколько положено и сам себе его не уберет сигналом сброса (res). Это происходит когда на счетчике адреса произошло переполнение и обнуление.
На линиях сигнала к сегментам (segment) индикатора происходит движение. Нулевой уровень сигнала последовательно зажигает сегменты индикатора.
Проблема гонки сигналов
Рано или поздно приходится думать о физических основах распространения сигналов. Моделирование показывает идеальную картинку, но если проникнуть внутрь полупроводникового кристалла ПЛИС, то непременно возникает множество вопросов. Есть две линии замедленных тактовых сигналов и две шины адреса, одна шина данных. Все эти линии проходят по лабиринту матрицы коммутации ПЛИС и совершенно нормально, что их итоговая длина будет разной. Разная длина линий шины в момент установления нового значения на ней приводит к некоторому периоду неопределенности.
В определенный момент часть линий уже приняли новое значение, часть в процессе.
А тут еще длина линии сигнала тактовых импульсов не вполне понятна и еще большой вопрос в какой именно момент возникает передний фронт. На нашей модели проекта передние фронты тактов как раз приходятся на границу смены состояния шин.
Это иногда становится кошмаром для начинающих разработчиков. Когнитивный диссонанс между тем, что в модели и тем что наблюдаем при эксперименте. У всего этого есть название гонка сигналов. По счастью, рецепт один на все времена.
В идеале фронт тактового сигнала должен приходиться на середину между сменой состояния на шинах.
Так мы максимально защитимся от неопределенного состояния. Конечно, с ростом тактовых частот проектов проблема встает все острее, границы смен состояния на шинах все ближе и ближе ко фронту тактового импульса даже если он будет в самой середине. В-общем, вы поняли. Бесконечно увеличивать тактовую частоту не получится и держите фронты как можно ближе к середине. Если инвертировать замедленный тактовый сигнал, то его возрастающий фронт немного сместится дальше от границы смены состояния на шине. Это то-же самое как работать по заднему фронту. И сейчас мы увидим как все тот час же изменится:
Видео-обзор с канала YouTube
В двух последних выпусках мы познакомились с таким ресурсом ПЛИС как блочная память, научились ее использовать в качестве буфера данных между двумя потребителями. Еще мы ознакомились с простейшим механизмом использования банков памяти и получили один из самых важных уроков. Держите голову в холоде, ноги в тепле, а фронты тактовых импульсов подальше от границы смены состояния линий на шине.
Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.