В предыдущей статье мы научились создавать проект в среде Quartus II и конфигурировать ПЛИС. В этой статье мы познакомимся с логическими элементами.
Нам нужно изучить основные логические функции, чтобы понимать, как работает цифровая электроника, в основы которой они заложены. Как мы уже говорили логическая единица — это случай, когда в проводе есть напряжение и лампочка горит, логический ноль – это его отсутствие, провод соединен с землей и лампочка не светит. Мы уже создали простой проект, в котором просто соединили кнопку со светодиодом, при этом питание подавалось с подтягивающего резистора (pullup), а кнопка закорачивала светодиод на землю. Теперь добавим в проект друге элементы.
Выбираем на панели инструментов «Symbol Tools», Altera/…/libraries-> primitives-> logic-> not
Рис. 1 — Окно Symbol Tools
Отрицание, инвертор, not
меняет напряжение на противоположное, его таблица истинности:
Вход
Выход
0
1
1
0
Элемент «И», and
выполняет логическую функцию «И», его таблица истинности:
Вход 1
Вход 2
Выход
0
0
0
1
0
0
0
1
0
1
1
1
Элемент «ИЛИ», or
Вход 1
Вход 2
Выход
0
0
0
1
0
1
0
1
1
1
1
1
Элемент «ИСКЛЮЧАЮЩЕЕ-ИЛИ», xor
Вход 1
Вход 2
Выход
0
0
0
1
0
1
0
1
1
1
1
0
Разместим данные элементы согласно схеме:
Рис. 2 — Схема с основными логическими элементами
Компилируем и конфигурируем чип. Читателю также предлагается инвертировать сигнал с кнопок перед тем как подавать на элементы (не забываем, что нажатие кнопки — это логический ноль, а отсутствие нажатия — единица), без этого схема работает не совсем наглядно.
Существуют также другие элементы, с инверсным входом, с инверсным выходом, с большим числом входов, читатель может сам разобраться с этими элементами. Промышленные микросхемы стараются исполнить именно на инверсных элементах, потому что их непосредственная реализация на транзисторах несколько проще.
Триггер
Так как у нас остались не задействованные светодиоды, попробуем сделать что-нибудь интересное, например RS-триггер. Добавим два элемента ИЛИ-НЕ (nor).
Рис. 3 — Схема с основными логическими элементами и реализация RS-триггера
Обратите внимание, на Рисунке 3, два элемента НЕ на входе RS-триггера нужны для наглядности при нажатии на кнопки, будем считать, что нажатие на кнопку подает на триггер единичку, а отсутствие нажатия – нолик (вам предлагается сделать это для всех элементов). RS-триггер состоит из 2-х элементов ИЛИ-НЕ, один выход является прямым, второй инверсный. Данная схема интересна тем, что она выдает уровень в зависимости от своего предыдущего состояния, то есть обладает памятью! Все элементы до этого не обладали памятью, просто передавали сигнал дальше, оказав на него воздействие согласно своей таблице истинности.
Вход S триггера устанавливает его в активное состояние, вход R сбрасывает.
Таблица истинности RS-триггера
Вход, R
Вход, S
Выход в прошлом, Q
Выход сейчас, Q
0
0
0
0
0
0
1
1
0
1
0
1
0
1
1
1
1
0
0
0
1
0
1
0
1
1
не важно
не определено
Как видно из таблицы, подача высокого уровня на оба входа ведет к неопределенному состоянию, не зависящего от предыдущего, именно поэтому мы установили инверторы на входы (но еще, что бы было нагляднее). Изначально, при подаче питания состояние триггера может быть любым (зависит от ого какое плече сильнее, идеализированно логические элементы это усилители с бесконечным коэффициентом усиления), именно по этому необходимо прорабатывать схемы сброса и инициализации.
Двоичный счетчик, модули Entity
Создадим новый модуль, «Block Diagram / Schematic file», скопируем в него RS-триггер, добавим порты ввода-вывода, с именами R, S, Q, nQ, сохраняем, выбираем меню «File-> Create / Update -> Create Symbol Files for Current File», сохраняем.
Рис. 4 — Создаем новый модуль, помещаем туда RS-триггер и создаем Symbol File
Переключаемся на верхний модуль (самый главный) заменяем триггер на вновь созданный (его значек должен появиться в Symbol Tools)
Рис. 5 — Символ для RS-триггера
Компилируем, конфигурируем и убеждаемся, что все работает.
Аналогичным образом создадим модуль D-триггера.
Рис. 6 — Схема D-триггера
D-триггер интересен тем, что он принимает значение на пине D лишь при наличии разрешающего сигнала E.
Таблица истинности D-триггера
Вход, D
Вход, E
Выход, Q
0
1
0
1
1
1
не важно
0
предыдущее состояние
Вообще говоря, собирать схему из логических примитивов утомительное занятие, тем более что в Qaurtus есть готовые модули, в том числе и триггеры.
Добавим в проект готовый счетчик «Symbol Tools -> Altera -> megafunctions -> arithmetic-> LPM_COUNTER»
Для работы нам нужен тактовый сигнал (clock), который мы возьмем с кварцевого резонатора, установленного на плате. Для этого откроем «Assignment Editor» и укажем пин 25, с которого «идет клок»:
Рис. 7 — Assignment Editor с тактовым сигналом — clock
И собственно получившаяся схема верхнего уровня, обратите внимание на параметры счетчика.
Рис. 8 — Схема верхнего уровня, с готовым счетчиком
Теперь по нажатии кнопки 1, будет происходить инкремент внутреннего регистра, диоды при этом будут соответствовать его самым старшим разрядам, разрядность регистра подобрана специально для кварца в 25 МГц (период ). Компилируем, конфигурируем, смотрим, что вышло. Далее будем использовать данный счетчик как делитель частоты.
Создадим составной D-триггер, тактируемый по обоим фронтам тактового сигнала.
Рис. 9 — Составной D-триггер, тактируемый по обоим фронтам
На рисунке 9 изображен составной D-триггер, его особенность в том, что первый триггер меняет свое состояние при наличии тактового сигнала, второй при его отсутствии, тем самым достигается изменение состояния при смене с 0 на 1 и далее на 0. Это необходимо для того, что бы схемы не работали беспорядочно и не переключались по своему желанию.
Создадим свой собственный 4-разрядный счетчик на наших тактируемых D-триггерах.
Рис. 10 — Прямой двоичный счетчик на тактируемых D-триггерах
Обратите внимание на название проводов, провода соединяются не графической линией, а своим названием, при этом в шине индекс (номер) проводника имеет решающее значение.
Модуль верхнего уровня выглядит как:
Рис. 11 — Схема модуля верхнего уровня
Не забываем создавать символьный файл при создании нового модуля и изменении выводов или их разрядности, меню «Create Symbol Files for Current File». Компилируем, конфигурируем, смотрим)
Читателю рекомендуется реализовать сброс счетчика, в качестве подсказки его проще сделать асинхронным, изменив D-триггер.
Прикрепленные файлы:
- test1.zip (3169 Кб)