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

  • Tutorial


Продолжаем осваивать 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:



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



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



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



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



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



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



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



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



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

image

Теперь необходимо сделать ряд настроек для успешной компиляции проекта. Во-первых укажем, какой модуль у нас главный явным образом. Конкретно в этом проекте это не актуально, но для сложных проектов с множеством модулей этот шаг обязателен. Заходим в меню 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 И наполняем его
смыслом:



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



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

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 45

    0
    Клавиатура на фото — тру. Эх, где мои 17 лет…
      +1
      :) Не совсем. От шифта под ентером отделена какая-то кнопка. Это не тру.
        +1
        Зато одновременно большой Enter и большой backspace! Из-за этого и перенесли слэши к шифту. Но вообще да, не совсем тру ибо псевдомеханика :( Тру мне ученики обещали на днюху подарить.
      0
      А Вы правда думаете детей посадить за квартус, чтоб они роботов программировали?
      Неужели получится? Как Вы это делаете? От ПЛИС иногда студенты впадают в уныние. Ну и англоязычный интерфейс — довольно таки большое препятствие.
        +2
        Правда. Получится или нет — посмотрим. Собственно мы пока только начали. Есть группа старшеклассников с высокой мотивацией — пробуем пока с ними. Поскольку они уже пробовали на вкус программирование, то им понятней Verilog. Условная «малышня» (7-8 класс, есть несколько товарищей младше) пока занимаются с простой электроникой, их приобщать буду после осознанного построения цифровой логики на базе микросхем низкой степени интеграции. И видимо на уровне именно графического построения.

        Естественно речь не идет о встраиваемых процессорах, оптимизации архитектуры и пр. Но на уровне «запихать горку логики в один кристалл» думаю тема ПЛИС подъемна заинтересованным школьникам.

        Англоязычный интерфейс действительно препятствие, но тут ничего не попишешь…

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

        В общем посмотрим что и как получится. Если тема пойдет и удастся нащупать удачную методику преподавания, то есть честолюбивые планы забабахать свой робонабор чисто на ПЛИС :)
          +2
          До сих пор не знаю английский, но английский интерфейс никогда не был препятствием. Просто запоминаются слова и то, для чего они в этой программе. Проблемы потом только в изучении английского, потому что перевод слова значит не совсем то, что в программировании.
          +1
          Чтобы студенты не впадали в уныние, нужно просто преподавать ПЛИС интересно.

          Конечно, если давать делать что-нибудь скучное (мультиплексор из гейтов) и с графическим schematic entry (как это дается в некоторых российских вузовских методичках), то студент впадет в уныние.

          А вот скажем построить свой процессор шаг за шагом — это поинтереснее ( http://www.silicon-russia.com/public_materials/2016_09_01_kazakhstan/day_4_microarchitecture/01_slides/03_DDCA2e_LectureSlides_Ch7_Ru_2016_09_01.pptx ).

          Хотя вы правы в том, что придумать цепочку задач, которые были бы и доступны, и интересны — это нетривиальная задача.
          • НЛО прилетело и опубликовало эту надпись здесь
              0

              Я сажаю, вроде ничего, работает.

              0
              можете сделать картинки кликабельными?
                0
                Ой блин… Не проконтролировал… Думал habrastorage сам готовый код дает. Может ткнете в инструкцию как это сделать, с ходу не нашел.
                  0
                  Сделал через костыль.
                    0
                    Спасибо
                0
                глаза от шрифтов в квартусе чуть не вытекли, самостоятельно такой ставили или «так и было»?
                  0
                  Так было. Меня лично напрягает только текст на верилоге.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Да, после этого комментария залез в квартус и нашел где меняются шрифты :)
                    0
                    Сама статья хорошая, спасибо, оказывается программирование FPGA не намного сложнее чем любого другого микроконтроллера. Но вам не кажется, что использовать FPGA Altera Cyclone V для мигания светодиодами это как убийство мухи из гранатомёта?
                    Просто хотелось бы понять какие реальные преимущества у такой схемы по сравнению с любыми другими контроллерами (STM например).
                      0
                      Реальные преимущества схемы мигания светодиодом на ПЛИС в том, что можно помигать на циклоне в 4000 ячеек, и с тем же успехом переехать на MAX240. Не переписывая ни одной буквы кода. По аналогии с STM это было бы равнозначно переезду с STM32 на STM8. С определенными нюансами можно было бы переехать даже на другого производителя. Я пробовал и в принципе это реально.
                        0
                        Можно мигать с частотой 1 ГГц! А если правильный кристалл взять, то и 10 ;)
                          +2
                          Сэр. Убийство мухи из гранатомета очень оправдано, если совершено для обучения и ведет к более выскому уровню владению гранатомета. Тем более, что гранатомет подарили. Учебный.
                            0
                            Ну это же классика — для железячника помигать светодиодом это как для программиста «Hello world!». Просто первый урок. К тому же не просто мигание, а реализация логических функций.

                            И как уже верно отметили, циклон подарен и плата удобна для обучения — все наглядно, разные кнопочки-светодиодики, VGA и т.д. Для установки на роботов есть дешевые и голые MAXII, для заливки на которые нужно только поменять конфигурационный файл для физических выводов.

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

                            А основная сложность как раз таки принципиальное отличие в программировании по сравнению с микроконтроллером. Нужен «железно»-ориентированный подход. По факту это не «программирование», а «конфигурирование». Ну и для серьезных проектов постоянно держать в голове временные диаграммы, чтобы обеспечить синхронность работы. Для уже сформировавшегося программиста это может представлять почти непреодолимую сложность.
                            0
                            Похоже я облажался. Заказал с Китая такую платку: https://ru.aliexpress.com/item/FPGA-development-board-ALTERA-IV-EP4CE-four-generations-NIOSII-send-send-remote-control-to-send-video/32657715247.html

                            Приехала вместе с CD. На нем все на китайском языке. Есть какие-то примеры, но они явно написаны под иной чип или плату. Я нашел лишь несколько, которые подошли и все они примитивные и только лишь моргают светодиодами.

                            Никакой инфы какие ноги чипа куда распаяны, кроме этих четырех светодиодов у меня нет.

                            Никогда не имел опыт работы с ПЛИС и хотел начать с этой платы, но сейчас она для меня как кирпич. Может посоветуете куда капнуть? Визуально смотреть что куда распаяно?
                              +2
                              Зайди в контакты у них на сайте и попробуй перевести в гугл транслэйте о чём это вообще :) Мыла, к сожалению, я так понял, нет у них на сайте, но намёки на какую-то связь должны быть. В конце концов лупу возьми да по дорожкам отследи, обычно выводят подряд на разъёмы. Почувствуй себя тру реверс-инженером, это иногда вдохновляет.
                                0
                                Поддерживаю. Чип установлен не бга-шный, так что срисовать схему с помощью обычной звонилки не должно составить труда.
                                  0
                                  Вот чем-чем, а звонилкой проверять FPGA, да и прочую микроэлектронику — стопроцентный шанс выпалить ноги.
                                    0
                                    Вот тут абсолютно не согласен. Мы то и дело реверсим схемы с каких-нибудь плат. Занимаемся этим уже много много лет. И ни разу за всё время не «выпалили» ни одной ноги. Под «звонилкой», я конечно, подразумеваю нормальную цифровую цешку, а не самоделку из батарейки и лампочки.
                                      0
                                      Ну если она умеет умно ограничивать ток при прозвоне, то какие вопросы, но мы же не можем быть уверенными в том, что у уважаемого пользователя окажется под рукой нормальный аппарат, а не китайская лампочка с батарейкой, замаскированные под «тестер» :) Так что в подобных советах лично я стараюсь быть аккуратным.
                                        0
                                        Ну Вы вообще меня запугали насмерть :) Двадцать с лишним лет рисую платы с помощью звонилок и ни разу не задумался о том, насколько опасное это занятие. Теперь плохо спать буду…

                                        А по делу: не морочьте человеку голову. С помощью лупы он точно ничего не нарисует, потому как платы нынче никто не делает двуслойными — тем более такого уровня интеграции. Так что только звонилка — только хардкор!
                                          0
                                          Все электронщики делятся на тех, кто уже сжигают чип за 50к+ и на тех, кто ещё сожжёт :)
                                            0
                                            Волков бояться — в лес не ходить :)

                                            Вот пример платы, с которой недавно пришлось рисовать кусок схемы.
                                              0
                                              «При съёмках этого видео ни один BGA-чип не был отпаян!» (с)
                                              Надеюсь, это какой-то майнер битков, который озолотит тебя :)
                                                0
                                                А вот и не угадали! :) Чипов было заменено 12 штук (2 из них — BGA). Это интерфейсная плата от АТС. Никакого золота — обычная повседневная рутина.
                                +2
                                Вроде в отзывах пишут, что документация на английском. Стоит написать продавцу. Можно погрозить плохими отзывами.
                                  0
                                  Вот например отзыв с российским флажком: «Его работы удивительным». Может так русскоязычный написать? Думаю, отзывы проплачены.

                                  На сиди 99% инфы на китайском и несколько статей на английском, так что формально дока на английском у них как бы есть, правда она никак не относится к конкретному устройству.

                                  Вообще, ругаться с продавцом пока охоты нет, устройство по сборке очень качественное, буду пытаться заняться реверс-инженерингом как посоветовали выше
                                    +1
                                    Отзывы не проплачены, уберите флажок «переводить на русский» и увидите, что русский флажок просто комментировал на английском :)

                                    И не забывайте, что это китайцы. У них менталитет такой, что если не поругались то и ладно. Если наехать — все сделают как надо.
                                    0
                                    Поскольку я тут пошумел на китайцев, хочу сказать, что не все так плохо как я думал. У меня получилось среди тысячи иероглифов найти файлы для квартуса, где прописаны номера ног для VGA в частности. Сегодня я сделал свой первый проект «пин-понг» — нарисовал рамку и в ней шарик отскакивает от краев. На удивление, это оказалось не так уж трудно, в основном были косяки, связанные с тем, что для модулей необходимы регистры в качестве входного параметра и wire для выходного. В общем, спасибо за совет, но решил к китайцу не обращаться, сам разберусь
                                    0
                                    Есть же марсоход.орг
                                    0
                                    Хочу дать пару советов начинающим работать с демоплатами.

                                    Первое. На этих платах обычно установлено некоторое количество периферии. Это могут быть память, АЦП, eeprom, датчик положения в пространстве ну и т.п. Вся эта периферия уже подключена к каким-то ножкам чипа FPGA. Часть из этих ножек подают какие-то управляющие сигналы на эту периферию. Например, это могут быть сигналы Chip Select или Output Enable. Лучше не оставлять эти ножки ненастроенными: нужно объявить их в проекте и подать на них такой статический уровень, который бы держал выходы периферии в отключенном состоянии.

                                    Второе. Это такой простенький «лайфхак». На старте изучения платы (когда только начинаешь «играться» с ней) можно не париться с объявлением ножек вручную в пинплэнере, коих у чипа может быть несколько десятков, а то и сотен. Гораздо проще открыть файл с расширением «qsf» из любой демки от платы (это обычный текстовый файл), найти в нём блок команд, описывающих ножки, и скопировать этот блок в qsf-файл своего проекта. После чего можно будет сразу приступить к написанию кода на верилоге с использованием этих ножек.
                                      0
                                      Первое описано в данной статье.

                                      Второе упомянуто, более подробно в следующих выпусках. Под нашу плату есть прога (правда только под винду), которая создает этот файл, но названия ножек в результате я счел не совсем логичными и понятными.
                                        0
                                        Первое описано в данной статье.
                                        Вы, по всей видимости, имеете в виду абзац с этим текстом:
                                        Поэтому безопасней неиспользуемые выводы сделать входами с высоким сопротивлением — As input tri-stated

                                        Да, с этим я почти согласен. Но не полностью. Я не рекомендую настраивать абсолютно все неиспользуемые ножки на ввод. Ножки управления сигналами CS и OE периферии лучше всё-таки объявить в модуле, настроить на вывод и подать на них статический уровень — чтобы явно отключить периферию.

                                        То есть примерно так:

                                        module basic_logic
                                        (
                                        output DRAM_CS_N,
                                        output G_SENSOR_CS_N,
                                        output ADC_CS_N,
                                        ...
                                        );

                                        assign DRAM_CS_N = 1'b 1;
                                        assign G_SENSOR_CS_N = 1'b 1;
                                        assign ADC_CS_N = 1'b 1;
                                        ...
                                        endmodule

                                          0
                                          Проще поставить Input tri-state with weak pull-up. Этого в 99% случаев начинающему будет достаточно.
                                      0
                                      Промахнулся
                                        0
                                        Статья хоть и простая, но интересная.
                                        Я понимаю, что вы не программист. Но код оформлять нужно не скриншотами а оборачивать в тег .
                                        И форматирование будет, и скопировать можно, чтобы воспроизвести. И вы не даете ссылку на код. Как-бы мувитон.
                                        А именно на verilog файл, и на файлы настройки для linux. Действительно будет здорово, если вы весь код выложите на github.
                                          0

                                          Здорово помогло. Спасибо!

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.