Исторически сложилось так, что для описания цифровых схем используются некоторые
элементы, содержащие в себе сразу оба типа логики, и комбинаторную, и регистровую.
Поэтому хорошо-бы, с одной стороны, знать их функциональность, с другой, знать во что они будут откомпилированы квартусом.
Рассмотрим простой пример, синхронный "SR"-триггер описываемый примитивом "SRFF":
Результат компиляции этого проекта можно посмотреть в "RTL Viewer" среды Quartus II:
Как мы видим, компилятор реализовал этот компонент из D-триггера и некой комбинаторной логики. В свою очередь, реализованная логическая функция - уже известный нам мультиплексор 2х1, адресным входом которого является выход триггера, один из коммутируемых входов это сигнал "S", другой - инверсия от сигнала "R". Таким образом можно понять , как работает этот элемент.
При наличии активного сигнала на входе "S" , на выходе , по фронту клока, будет установлена "1".
При наличии активного сигнала на входе "R", на выходе , по фронту клока, будет установлен "0".
При наличии одновременно двух сигналов , по каждому клоку, триггер будет менять свое состояние на противоположное. При отсутствии обоих сигналов, состояние на выходе триггера меняться не будет.
Примерно такая же комбинаторная логика и для такой-же цели (ситуационная установка регистра в определенное состояние) будет добавлена компилятором в мегафункцию "LPM_DFF", если в свойствах элемента добавить входы "sset" и "sclr" (синхронная установка и синхронный сброс ):
При наличии сигнала на входе "sset" , все триггера , по фронту клока, будет установлены в "1".
При наличии сигнала на входе "sclr" , все триггера , по фронту клока, будет установлены в "0".
При отсутствии обоих сигналов в регистр будут фиксироваться входные данные.
При наличии одновременно двух сигналов "sset" и "sclr", в отличие от примитива "SRFF",
приоритет имеет "sclr", и все триггера будет установлены в "0".
Еще один пример комбинированной логики - счетчик.
Если использовать уже знакомые нам конструкции , простой четырехразрядный
счетчик можно изобразить так:
Как видно из схемы, работает он следующим образом, функция "LPM_ADD_SUB" к имеющемуся на выходе регистра "LPM_DFF" числу прибавляет константу "1". Таким образом, по каждому клоку тактовой частоты, в регистр "LPM_DFF" будет заноситься значение, на 1 превышающее предыдущее. То есть, будет подсчитываться количество клоков. Реализовать точно-такую же функциональность можно с помощью мегафункции "LPM_COUNTER":
Поскольку счетчик - очень часто используемый элемент, опишу некоторые свойства
мегафункции "LPM_COUNTER" более подробно:
Входы:
- "sset" и "sclr" имеют такое- же действие, как и в случае "LPM_DFF" , т.е. установка или сброс всех триггеров.
- "sload" используется вместе с "data[]" и устанавливает все триггера в состояние, имеющееся на входе "data[]".( Если вход "data[]" отсутствует, то по "sload" будут загружаться "0"). Из этих трех входов максимальный приоритет имеет "sclr", затем "sload", минимальный - "sset".
- "updown" - управление направлением счета. В случае если "updown" - "1", то по каждому счетному циклу значение счетчика будет увеличиваться , если "0" - уменьшаться. Если этот вход отсутствует, направление счета можно задать в параметре "LPM_DIRECTION" ( по умолчанию - "UP").
- "clk_en" разрешение клока. Отсутствие активного сигнала на этом входе запрещает любые операции с триггерами.
- "cnt_en" и "cin" равноценные входы. Управляют только счетными циклами и не влияют на операции"sload","sset" и "sclr".
- Выходы "q[]" - собственно , биты счетчика. Их количество (разрядность) указывается в "LPM_WIDTH"
- Выход "cout" - перенос. В случае если параметр "LPM_MODULUS" отсутствует или равен "0", сигнал "cout" будет активен, если на выходе счетчика все "1".
Если параметр "LPM_MODULUS" имеет какое-то значение, то "cout" будет активен при достижении счетчиком значения на 1 меньше чем в "LPM_MODULUS" и на следующем счетном цикле в счетчик будет загружен "0".
В заключении хочу сказать, что, на мой взгляд, информации, содержащейся в этом небольшом цикле статей достаточно для реализации любого проекта для платы Марсоход.
Подробнее...