Первый проект на FPGA Altera и подключение USB-Blaster в Linux
Продолжаем осваивать FPGA Altera. В первой части я описал процесс установки программного обеспечения Altera Quartus под CentOS7. Теперь уже наконец попробуем что-то сделать «железное», например светодиодики позажигаем. Но прежде небольшое вступление.
Одним из направлений моей деятельности является преподавание в кружке робототехники в небольшом городке Беларуси. Окунувшись во всю эту кухню и поучаствовав в разных конкурсах не только как тренер команды, но и как судья, я пришел к выводу, что ардуино в частности и микроконтроллеры в целом не самая лучшая база для конкурсных роботов (про лего вообще молчу). Многие задачи эффективней решать на уровне голой электроники. Кроме того 90% процентов кружков и «школ» робототехники не дают даже базовых знаний именно электроники, сосредоточившись чисто на «обучении» программированию готовых конструкций. Но чисто электронные роботы (например незаслуженно забытые BEAM) заточены под конкретную задачу и изменение условий конкурса приведет к необходимости существенной перестройки робота, что не всегда возможно. Вот тут я и вспомнил про программируемую логику. В результате поиска информации о применении ПЛИС в обучении я наткнулся на блог Юрия Панчула. Пользуясь случаем я хочу публично выразить ему свою благодарность. Благодаря ему наш кружок совершенно бесплатно получил плату TerasIC DE0-CV c Altera Cyclone V на борту.
Собственно эта и последующие публикации будут представлять собой реальный учебный материал, который мы реализовываем на кружке. И я буду благодарен за конструктивную критику и замечания, так как применение ПЛИС на кружках для школьников — нехоженая пока область.
Итак, начинаем. В этой публикации будут описаны первые шаги в Quartus, описание элементарной цифровой логики на языке Verilog и загрузка конфигурации в FPGA Altera Cyclone V. Работать мы будем с платой TerasIC DE0-CV, которая имеет на борту встроенный USB-Blaster. Так же затронем и вопрос «запуска» USB-Blaster под Linux.
Запускаем Quartus:
Выбираем «Create a New Project». Запускается диалог мастера создания проекта. Тут просто нажимаем Next.
А теперь нам надо выбрать рабочую директорию для проекта (не забываем про права доступа!). Придумываем название проекта:
На следующем шаге нам предлагают добавить в проект дополнительные файлы. На данном этапе нам это не нужно, но в будущем для облегчения работы стоит добавлять как минимум файл назначения выводов.
Теперь настало время важных настроек. На этом шаге нам надо выбрать кристалл, под который пишется проект. В принципе если вы ошибетесь или захотите перекомпиллировать проект под другое устройство — это можно будет исправить позже.
Здесь нам предлагают выбрать дополнительные инструменты. Мы пока оставляем все как есть и жмем Next.
Ну вот, мы выполнили первоначальные настройки и создали проект. Жмем Finish.
Теперь нам нужно создать файл, описывающий логику проекта. Заходим в меню File/New, появляется диалог в котором требуется выбрать тип файла. В принципе логику можно нарисовать в специальном графическом редакторе, но сейчас мы выбираем Verilog HDL File:
Файл создан, пишем текст нашей программы, описывающей элементы NO, AND, OR, XOR. В качестве входов используем, имеющиеся на плате переключатели (key*), а состояние выхода индицируем светодиодами (led*). Небольшая ремарка: производитель платы предлагает создать конфигурационный файл для входов-выходов в специальной программе, работающей только под Windows. Если пойти этим путем, то надо следить чтобы имена «проводов» и «регистров» в программе совпадали с таковыми в конфигурационном файле. Но мы сейчас будем делать все вручную, поэтому вольны выбрать любые имена.
Теперь сохраняем файл. Важный момент — для корректной работы необходимо, чтобы имя файла совпадало с именем модуля, описываемого в программе (В нашем примере basic_logic).
Теперь необходимо сделать ряд настроек для успешной компиляции проекта. Во-первых укажем, какой модуль у нас главный явным образом. Конкретно в этом проекте это не актуально, но для сложных проектов с множеством модулей этот шаг обязателен. Заходим в меню Project/Set As Top Level Entity. Готово. Далее надо сделать ряд настроек для конкретного кристалла. Выберем пункт меню Assignments/Device. Открывается диалог, в котором мы имеем возможность изменить тип кристалла (или проверить, что ранее мы его указали верно):
Теперь жмем кнопку Device and Pin Option и в открывшемся диалоге в первую очередь зададим состояние для неиспользуемых выводов. По умолчанию все неиспользуемые контакты микросхемы подключаются к нулю по питанию. Но мы не знаем, как эти выводы разведены физически на плате и такая конфигурация может привести к короткому замыканию и выходу из строя чипа. Поэтому безопасней неиспользуемые выводы сделать входами с высоким сопротивлением — As input tri-stated
Следующий необходимый шаг — указать, какие физические ножки микросхемы соответствуют входам и выходам описанного нами модуля. Для этого идем в меню Assignments/Assignment Editor. В открывшемся окне делаем нужные нам назначения согласно схеме нашей платы. В колонке To вписываем имя входа или выхода. В колонке Assignment Name выбираем из списка нужную нам настройку Location. В колонке Value вписываем название контакта микросхемы:
Закономерный вопрос: откуда берется название контактов? Обычно в даташите на плату или конкретную микросхему есть табличка PIN OUT. Так же, как я ранее писал, с платой может идти специальная программа, создающая конфигурационный файл. А сейчас вы можете воспользоваться этими данными:
Наконец-то можно нажать кнопочку Start Compilation!
Получаем 16 warnings. Ничего серьезного.
Можно посмотреть репорт:
Теперь подключаем плату и запускаем программу программатора: Tools/Programmer. Линукс автоматически подхватывает USB-Blaster, но прошивка не работает… Что же, открываем любимую консоль, вооружаемся бубном и погружаемся в документацию к Quartus…
Для начала убеждаемся, что система видит программатор:
dmesg | tail
Переходим в папку /etc/profile.d/ , где создаем файл custom.sh
А затем в папке /etc/udev/rules.d/ файл с названием 51-usbblaster.rules И наполняем его смыслом:
Теперь все работает и прошивка прекрасно вгружается в чип:
Любуемся результатом, играемся переключателями, мигая светодиодиками: