Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Начинаем работать с FPGA или ПЛИС это просто. Часть 2

В предыдущей статье мы научились создавать проект в среде Quartus II и конфигурировать ПЛИС. В этой статье мы познакомимся с логическими элементами.

Нам нужно изучить основные логические функции, чтобы понимать, как работает цифровая электроника, в основы которой  они заложены. Как мы уже говорили логическая единица — это случай, когда в проводе есть напряжение и лампочка горит, логический ноль – это его отсутствие, провод соединен с землей и лампочка не светит. Мы уже создали простой проект, в котором просто соединили кнопку со светодиодом, при этом питание подавалось с подтягивающего резистора (pullup), а кнопка закорачивала светодиод на землю. Теперь добавим в проект друге элементы.

Выбираем на панели инструментов «Symbol Tools», Altera/…/libraries-> primitives-> logic-> not

Окно Symbol Tools
Рис. 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).

Схема с основными логическими элементами и реализация RS-триггера
Рис. 3 - Схема с основными логическими элементами и реализация RS-триггера

Обратите внимание, на Рисунке 3, два элемента НЕ на входе RS-триггера нужны для наглядности при нажатии на кнопки, будем считать, что нажатие на кнопку подает на триггер единичку, а отсутствие нажатия – нолик (вам предлагается сделать это для всех элементов). RS-триггер состоит из двух элементов ИЛИ-НЕ, один выход является прямым, второй инверсный. Данная схема интересна тем, что она выдает уровень в зависимости от своего предыдущего состояния, то есть обладает памятью! Все элементы до этого не обладали памятью, просто передавали сигнал дальше, оказав на него воздействие согласно своей таблице истинности.

Вход 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», сохраняем.

Создаем новый модуль, помещаем туда RS-триггер и создаем Symbol File
Рис. 4 - Создаем новый модуль, помещаем туда RS-триггер и создаем Symbol File

Переключаемся на верхний модуль (самый главный) заменяем триггер на вновь созданный (его значек должен появиться в Symbol Tools)

Символ для RS-триггера
Рис. 5 - Символ для RS-триггера

Компилируем, конфигурируем и убеждаемся, что все работает.

Аналогичным образом создадим модуль D-триггера.

Схема 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, с которого «идет клок»:

Assignment Editor с тактовым сигналом - clock
Рис. 7 - Assignment Editor с тактовым сигналом - clock

И собственно получившаяся схема верхнего уровня, обратите внимание на параметры счетчика.

Схема верхнего уровня, с готовым счетчиком
Рис. 8 - Схема верхнего уровня, с готовым счетчиком

Теперь по нажатии кнопки 1, будет происходить инкремент внутреннего регистра, диоды при этом будут соответствовать его самым старшим разрядам, разрядность регистра подобрана специально для кварца в 25 МГц (период ). Компилируем, конфигурируем, смотрим, что вышло. Далее будем использовать данный счетчик как делитель частоты.

Создадим составной D-триггер, тактируемый по обоим фронтам тактового сигнала.

Составной D-триггер, тактируемый по обоим фронтам
Рис. 9 - Составной D-триггер, тактируемый по обоим фронтам

На рисунке 9 изображен составной D-триггер, его особенность в том, что первый триггер меняет свое состояние при наличии тактового сигнала, второй при его отсутствии, тем самым достигается изменение состояния при смене с 0 на 1 и затем на 0. Это необходимо для того, что бы схемы не работали беспорядочно и не переключались по своему желанию.

Создадим свой собственный 4-разрядный счетчик на наших тактируемых D-триггерах.

Прямой двоичный счетчик на тактируемых D-триггерах
Рис. 10 - Прямой двоичный счетчик на тактируемых D-триггерах

Обратите внимание на название проводов, провода соединяются не графической линией, а своим названием, при этом в шине индекс (номер) проводника имеет решающее значение.

Модуль верхнего уровня выглядит как:

Схема модуля верхнего уровня
Рис. 11 - Схема модуля верхнего уровня

Не забываем создавать символьный файл при создании нового модуля и изменении выводов или их разрядности, меню «Create Symbol Files for Current File». Компилируем, конфигурируем, смотрим)

Читателю рекомендуется реализовать сброс счетчика, в качестве подсказки его проще сделать асинхронным, изменив D-триггер. 

Прикрепленные файлы:

Теги:

Опубликована: 0 1
Я собрал 0 3
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 3 чел.

Комментарии (5) | Я собрал (0) | Подписаться

+1
viktor26 #
После данной статьи понял, что ПЛИС это вообще не сложно, особенно если до этого работал с логикой. Вся трудность заключается именно в языке программирования, и то это для тех кто хочет именно кодить, а кто не хочет, для тех придумали графический редактор. Эмоции на взлете, особенно от того что ПЛИС может параллельно выполнять "код" что не скажешь про МК.
Автору респект!
Ответить
+1
Vascom #
Верно. Однако "кодить", например на Verilog гораздо проще, чем графически добавлять и соединять логические элементы, особенно если их число переваливает за десяток. FPGA как раз позволяет использовать тысячи и сотни тысяч логических элементов.
Ответить
0
Антон #
Запрогал, но после отключения питания вся прошивка обнуляется, погуглив вроде понял, что данная ПЛИСина относится к тем, которые прошивку не сохраняют в энергонезависимой памяти, верно ли это? Или корявая плисина или в программе надо где-то доп флажок ставить? И есть ли статьи на тему подключения флэш памяти и автомотической прошивки при подаче питания?
Ответить
0
Vascom #
Флешка для сохранения конфигурации там есть. На обратной стороне микросхема EPCS4. Её надо лишь добавить в программер, а в квартусе сгенерировать прошивку.
Грузить конфигурации можно будет как напрямую в ПЛИС, так и во флешку.
Ответить
0
Andy #
Thank you, very much. It's the best introductory FPGA post on the Web!
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
iMAX B6 - зарядное для Lion, LiPo, LiFe, Pb, NiCd и NiMH аккумуляторов Модуль измерения тока на ACS712 (30А)
вверх