Первый проект на FPGA Altera и подключение USB-Blaster в Linux

663c898c6ff74b21bd83ba59165365ec.JPG

Продолжаем осваивать FPGA Altera. В первой части я описал процесс установки программного обеспечения Altera Quartus под CentOS7. Теперь уже наконец попробуем что-то сделать «железное», например светодиодики позажигаем. Но прежде небольшое вступление.

Одним из направлений моей деятельности является преподавание в кружке робототехники в небольшом городке Беларуси. Окунувшись во всю эту кухню и поучаствовав в разных конкурсах не только как тренер команды, но и как судья, я пришел к выводу, что ардуино в частности и микроконтроллеры в целом не самая лучшая база для конкурсных роботов (про лего вообще молчу). Многие задачи эффективней решать на уровне голой электроники. Кроме того 90% процентов кружков и «школ» робототехники не дают даже базовых знаний именно электроники, сосредоточившись чисто на «обучении» программированию готовых конструкций. Но чисто электронные роботы (например незаслуженно забытые BEAM) заточены под конкретную задачу и изменение условий конкурса приведет к необходимости существенной перестройки робота, что не всегда возможно. Вот тут я и вспомнил про программируемую логику. В результате поиска информации о применении ПЛИС в обучении я наткнулся на блог Юрия Панчула YuriPanchul. Пользуясь случаем я хочу публично выразить ему свою благодарность. Благодаря ему наш кружок совершенно бесплатно получил плату TerasIC DE0-CV c Altera Cyclone V на борту.

Собственно эта и последующие публикации будут представлять собой реальный учебный материал, который мы реализовываем на кружке. И я буду благодарен за конструктивную критику и замечания, так как применение ПЛИС на кружках для школьников — нехоженая пока область.

Итак, начинаем. В этой публикации будут описаны первые шаги в Quartus, описание элементарной цифровой логики на языке Verilog и загрузка конфигурации в FPGA Altera Cyclone V. Работать мы будем с платой TerasIC DE0-CV, которая имеет на борту встроенный USB-Blaster. Так же затронем и вопрос «запуска» USB-Blaster под Linux.

Запускаем Quartus:

5b3dcc6b0c4448c4a2e9ccc121e5bfde.png

Выбираем «Create a New Project». Запускается диалог мастера создания проекта. Тут просто нажимаем Next.

3b33624a32894ac09063e2db22403a6c.png

А теперь нам надо выбрать рабочую директорию для проекта (не забываем про права доступа!). Придумываем название проекта:

f58a2533fae74f2b9b7850049a2200e5.png

На следующем шаге нам предлагают добавить в проект дополнительные файлы. На данном этапе нам это не нужно, но в будущем для облегчения работы стоит добавлять как минимум файл назначения выводов.

956b80e83235413d96ea5a62e844d430.png

Теперь настало время важных настроек. На этом шаге нам надо выбрать кристалл, под который пишется проект. В принципе если вы ошибетесь или захотите перекомпиллировать проект под другое устройство — это можно будет исправить позже.

888ea2d44e874c01ba3dc4de78afa105.png

Здесь нам предлагают выбрать дополнительные инструменты. Мы пока оставляем все как есть и жмем Next.

eecdf4ce6b7a465a9ab978b45b1348d5.png

Ну вот, мы выполнили первоначальные настройки и создали проект. Жмем Finish.

11c7119cd2544cdcb654d5afe00f46fe.png

Теперь нам нужно создать файл, описывающий логику проекта. Заходим в меню File/New, появляется диалог в котором требуется выбрать тип файла. В принципе логику можно нарисовать в специальном графическом редакторе, но сейчас мы выбираем Verilog HDL File:

190d88022be64fcdb8feb57ecb88d39e.png

Файл создан, пишем текст нашей программы, описывающей элементы NO, AND, OR, XOR. В качестве входов используем, имеющиеся на плате переключатели (key*), а состояние выхода индицируем светодиодами (led*). Небольшая ремарка: производитель платы предлагает создать конфигурационный файл для входов-выходов в специальной программе, работающей только под Windows. Если пойти этим путем, то надо следить чтобы имена «проводов» и «регистров» в программе совпадали с таковыми в конфигурационном файле. Но мы сейчас будем делать все вручную, поэтому вольны выбрать любые имена.

cda54d481e6a4febb064a097a8444757.png

Теперь сохраняем файл. Важный момент — для корректной работы необходимо, чтобы имя файла совпадало с именем модуля, описываемого в программе (В нашем примере basic_logic).

image

Теперь необходимо сделать ряд настроек для успешной компиляции проекта. Во-первых укажем, какой модуль у нас главный явным образом. Конкретно в этом проекте это не актуально, но для сложных проектов с множеством модулей этот шаг обязателен. Заходим в меню Project/Set As Top Level Entity. Готово. Далее надо сделать ряд настроек для конкретного кристалла. Выберем пункт меню Assignments/Device. Открывается диалог, в котором мы имеем возможность изменить тип кристалла (или проверить, что ранее мы его указали верно):

7530c248da3c4829af0f9d825b22937e.png

Теперь жмем кнопку Device and Pin Option и в открывшемся диалоге в первую очередь зададим состояние для неиспользуемых выводов. По умолчанию все неиспользуемые контакты микросхемы подключаются к нулю по питанию. Но мы не знаем, как эти выводы разведены физически на плате и такая конфигурация может привести к короткому замыканию и выходу из строя чипа. Поэтому безопасней неиспользуемые выводы сделать входами с высоким сопротивлением — As input tri-stated

fd42900235754efd9f93da34462cdb66.png

Следующий необходимый шаг — указать, какие физические ножки микросхемы соответствуют входам и выходам описанного нами модуля. Для этого идем в меню Assignments/Assignment Editor. В открывшемся окне делаем нужные нам назначения согласно схеме нашей платы. В колонке To вписываем имя входа или выхода. В колонке Assignment Name выбираем из списка нужную нам настройку Location. В колонке Value вписываем название контакта микросхемы:

6e8d6de340d743ee9651f9b8dfa4b8b0.png

Закономерный вопрос: откуда берется название контактов? Обычно в даташите на плату или конкретную микросхему есть табличка PIN OUT. Так же, как я ранее писал, с платой может идти специальная программа, создающая конфигурационный файл. А сейчас вы можете воспользоваться этими данными:

4d093b6f848540989bcf1f8b3e0701e1.png

Наконец-то можно нажать кнопочку Start Compilation!

fec6b4a5d5744e4c8ccb5289dc1d7401.png

f73c3a1f705a4a88bbd40cd1a45c4ab7.png

Получаем 16 warnings. Ничего серьезного.

3403c4fc11f447f68d31883ebaf32365.png

Можно посмотреть репорт:

bcff84ae84ff4c5cb2f63fa28f15dd0c.png

Теперь подключаем плату и запускаем программу программатора: Tools/Programmer. Линукс автоматически подхватывает USB-Blaster, но прошивка не работает… Что же, открываем любимую консоль, вооружаемся бубном и погружаемся в документацию к Quartus…

Для начала убеждаемся, что система видит программатор:

dmesg | tail

cc7ae176e57f4946a3d6ceee4eed1bb4.png

Переходим в папку /etc/profile.d/ , где создаем файл custom.sh

3960f137c7bd4befad14072113e13e4f.png

А затем в папке /etc/udev/rules.d/ файл с названием 51-usbblaster.rules И наполняем его
смыслом:

82810b1209e546b0bdfbc09d68d54db6.png

Теперь все работает и прошивка прекрасно вгружается в чип:

ace496647e35413095c5dd5159d9cf06.png

Любуемся результатом, играемся переключателями, мигая светодиодиками:

663c898c6ff74b21bd83ba59165365ec.JPG

Комментарии (2)

  • 23 сентября 2016 в 14:51

    0

    Клавиатура на фото — тру. Эх, где мои 17 лет…
    • 23 сентября 2016 в 14:59

      0

      :) Не совсем. От шифта под ентером отделена какая-то кнопка. Это не тру.

© Habrahabr.ru