
Результаты работы логических функций, входные или конечные данные нужно где-то хранить — в общем нужны регистры.
Если провести аналогию работы нашего чипа с кухней, то, например, чистка картошки, наливание в кастрюлю воды и т.д. - логические функции. А кастрюля, тарелки, ложки и т.д - средства хранения промежуточных или конечных результатов работы этих функций.
Как уже было сказано в предыдущей статье, для реализации регистровой логики в каждом "LE" (логическом элементе) есть D-триггер. Он имеет один выход и три входа - вход данных (data), клок (clk) и разрешение записи (enable).
Работает он следующим образом. Если присутствует сигнал разрешения записи, то по фронту клока, входные данные появляются на выходе и далее будут оставаться неизменными до следующего фронта клока (т.е. храниться).
При отсутствии разрешения записи данные на выходе меняться не будут. Это, собственно , и есть регистр на 1 бит.
Для реализации в схемотехническом дизайне в среде Altera Quartus II можно использовать примитив "DFFE", или его частный случай (когда запись разрешена всегда) "DFF":

Так же, как и во всех предыдущих случаях, чтобы не заниматься вырисовыванием каждого триггера в отдельности, можно использовать мегафункции.
Мегафункция LPM_DFF - параллельный регистр:
Здесь "data[]" - входы всех триггеров, "q[]" их выходы, а сигналы клока и разрешения записи для всех триггеров общие.
Мегафункция LPM_SHIFTREG - сдвиговый (последовательный) регистр:

В отличие от параллельного регистра , здесь "shiftin" является входом для самого младшего триггера, а выход этого триггера является входом для следующего и т.д. Сигналы клока и разрешения записи, так-же как и в параллельном регистре, для всех триггеров общие.
Ну и далее , некоторые рекомендации (на этот раз - настоятельные):
- Не используйте в качестве клока выход комбинаторной логики. Какой-бы простой не была функция, реализуемая этой логикой, на ее выполнение необходимо какое-то время, в течении которого на выходе будет неопределенное состояние и может произойти ложное срабатывание триггера. Клок можно взять с входного пина (если к нему с наружи подключен тактовый генератор), с внутреннего тактового генератора или с выхода какого-то другого триггера.
- Не используйте в проектах асинхронные сигналы (на примитивах это входы с кружочками сверху и с низу, а на мегафункциях сигналы "aclr" и "aset"), за одним исключением, на котором я хочу остановиться подробнее.
Наш чип ( да, наверное, и все другие ПЛИС ), кроме самой программируемой логики, содержат в себе еще ряд служебных функций. Одна из них "Power-On Reset". Подробно обо всем этом написано в документации, а здесь хочу отметить, что одно из действий, которые эта функция выполняет - установка всех триггеров программируемой логики в одно начальное состояние(в "0"). Поэтому, хочу особо отметить, что стартовать ваш проект, после включения питания, всегда будет с "нулевым" начальным состоянием всех регистров. Для корректного старта вашего проекта это нужно обязательно учитывать. Бывают случаи, когда проект ( или какой-то его фрагмент ) разрабатывается для дальнейшего использования, например , в ASIC или вообще не известно где, а ПЛИС используется только для его отладки. В этом случае, позаботится о начальном состоянии регистров нужно в самом проекте. Обычно это реализуется объединением асинхронных сбросов всех тригеров проекта в один общий сигнал, какой-нибудь "GLOBAL_RESET".
В следующей статье - Часть4. Элементы комбинированной логики. Счетчик.

шины на входе и выходе была одинаковой.
Ок, спасибо, помогло, а я думал это я что-то не то делаю.
Значит клок подключаем к любой ножке выделенной для клок(обозначени е в пин планер в виде меандра в квадрате), при этом не использованные ножки ввода тактовой частоты можем использовать как обычные ин-ауты?
Назначения выводов к конкретным ножкам микросхемы делаются в меню Assignments => Assignment Editor. В графическом редакторе можно сделать клик правой кнопкой мыши на выводе, в выпадающем меню Locate => Locate in Assignment Editor. Если пункт меню не доступен - сперва откомпилируйте проект (ИМХО - это баг квартуса).
А заодно как в этом графическом дизайне назначить подключение входов-выходов к конкретным ножкам микросхемы...
Спасибо.
В нашем предмете "Теория автоматов" многие моменты были рассмотрены... И триггеры, и асинхронная логика, и всякие там счетчики-регист ры и прочие "ужасы" аля автомат Мура =)
Спасибо сайту =) Это он дал мне пинок к моему дальнейшему изучению данной темы =) Я-то думал, что этот предмет достаточно бесполезный для меня, однако, попробовав поработать с ПЛИС, понял, что на самом деле без него никуда =)
Вы правы, я как-то невнятно выразился, конечно я имел ввиду асинхронные входы триггеров.
А по теме - в среде разработчиков ПЛИС бытует понятие "синхронный дизайн". Что это
такое , что в нем можно , а что нельзя и почему - тема отдельной ( и не маленькой ) статьи.
А поскольку данный цикл статей "для начинающих" то к "синхронному дизайну" следует
привыкать "с детства".