Марсоход2 + Matlab/Simulink

В образовательных целях сделал себе подарок на ДР: купил платку Марсоход2. Познакомился с верилогом, даже решил одну небольшую задачку на нем. Но в универе нам расхвалили матлаб и показали как генерировать прошивку для ПЛИС прямиком по модели из Simulink. Показали теоретически, т.к. никаких отладочных плат в живую нет. Но тема больно уж интересная, поэтому было решено подружить матлаб с имеющимся марсоходом, что вроде как получилось. Под катом «как поморгать светодиодами из Matlab» со скриншотами

Что нам понадобится:
Quartus 2 (у меня 13.1 х64) с установленными драйверами программатора
Matlab/Simulink (у меня 2014а, с модулями HDL Coder)
Умение (хотя бы на начальном уровне) рисовать схемки в Simulink
Желание поиграться

Настраиваем Matlab

Ни о каком марсоходе матлаб изначально не знает. Не знает он и где установлен квартус. C этого и начнем. Запускаем Matlab и в консоли пишем:
hdlsetuptoolpath('ToolName','Altera Quartus II','ToolPath','C:\altera\13.1\quartus\bin64')

Путь заменяем на свой.
Теперь необходимо добавить и настроить нашу плату. Опять же в консоли:
fpgaBoardManager

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

Жмем "Create Custom Board". Появляется окно мастера. Заполняем, указывая имя, которое хотим видеть, производителя, выбираем чип. Если вдруг у вас на JTAGе висит несколько микросхем, то выбираем номер, под которым интересующая нас ПЛИС

Прокручиваем страницу до конца и нажимаем "Next". Открывается новая страница

Где выбираем интерфейс подключения FPGA-In-The-Loop (у нас это JTAG без вариантов), ставим галочку "User defined I/O" (как видим из пояснения, требуется HDL Coder). Пару слов о режимах работы:
FPFA-In-The-Loop
В этом режиме ПЛИС используется как калькулятор. Данные отправляются в плату, там обрабатываются и принимаются обратно. Удобно для отладки или ускорения математики.
FPGA Turnkey
В этом режиме проект заливается в плис и работает «внутри». В этом режиме становятся доступны выводы ПЛИС. Т.е. это наш режим для моргания светодиодом.

Далее настраивается вход тактирования, у нас это 100МГц на 25 выводе. Входа сброса нет, хотя при желании, наверное, можно выбрать кнопку. На этой странице все, жмем Next.

Тут нам предлагают указать выводы, которые захотим использовать. Опишем светодиоды и кнопки. Жмем Add New, пишем имя сигнала, описание если надо, тип вход или выход, ширину в битах и номера используемых пинов, прям через запятую начиная с младшего бита. Номера выводов смотрим в документации на плату. Когда заполнили еще раз жмем Next. Теперь нам предложат проверить, что мы настроили.
Чтобы проверить все сразу ставим все галочки, выбираем выход со светодиодами (если они есть, а они у нас есть) и жмем "Run selected test(s)". Появится предупреждение, что это может занять от 10 минут до получаса в зависимости от скорости вашей системы (у меня занимает примерно полторы минуты). Не забываем подключить плату и Соглашаемся.

По завершении на светодиодах запустится счетчик. Если так и есть — отлично, иначе придется разбираться что и где не проходит.
Теперь плата сконфигурирована, жмем Finish и сохраняем файл с настройками платы (см в приложении). Загрузить имеющийся файл можно по кнопке Add Board from file с первого скриншота.

Simulink

Теперь, когда мы настроили плату — пора нарисовать схему, которую будем «зашивать» в ПЛИС. Главная схема Simulink-а должна содержать подсистему, которая уже будет реализована в ПЛИС. Сначала попробуем соединить имеющиеся кнопки со светодиодами. А чтобы проверить (хоть и проверять по сути нечего) добавим источник сигнала — счетчик. Т.к. система имеет 2 кнопки, то счетчик должен быть двухбитным. Добавляем пустую подсистему и осцилограф. соединяем их. Получили схему:

На подсистеме жмем правой кн. Мыши, в контекстном меню HDL Coder >> HDL Workflow adwisor. Откроется очередной мастер. В дереве слева выбираем пункт 1.1 Set target device.... И заполняем в соответствии с тем, чего хотим: Target workflow — FPGA Turnkey, Target platform — new_marsohod2 (или ваше название), Synthesis tool — Altera Quartus II. У меня эта вкладка при смене значений из выпадающих списков иногда ведет себя несколько неадекватно, поэтому кнопки Apply, Refresh и переход туда-обратно в дереве слева помогут правильно заполнить эту вкладку. Как только заполнили жмем Apply, а потом Run this Task. После в дереве слева этот пункт должен получить зеленую галочку. Если вылезли ошибки — придется читать что не получилось и исправлять (возможно пути к квартусу или еще что)

Если все прошло удачно — переходим на следующую вкладку — "1.2. Set target interface". Тут нам предлагают указать входы и выходы подсистемы и ранее указанных сигналов ПЛИС. Соединяем вход с кнопками, выход со светодиодами. Тут matlab сам увидит размерности, проверит их и обрежет по необходимости и возможности. Опять жмем Apply и Run this task

Если все удачно — переходим к следующей вкладке, там можно исправить тактовую частоту. Ничего интересного там нет, просто жмем Run this task, ждем и идем дальше. Остальные вкладки в общем случае можно не трогать, поэтому выбираем последний пункт 5.2, жмем в контекстном меню Run to selected task и ждем. При первом запуске обычно на этапе "2.1 Check global settings" вылезает предупреждение, что уровни ошибок и предупреждений настроены неправильно.

Прокручиваем чуть-чуть страницу и жмем "Modyfy all" и опять запускаем обработку всех пунктов. Когда все задачи будут обработаны — плата уже будет прошита и загорятся 2 светодиода. Нажимая на кнопки можно их отключать. Т.к. кнопки подключены с подтяжкой к питанию — такое поведение полностью корректно. Т.е. наша подсистема оказалась внутри ПЛИС, к ее входу подключены кнопки, а к выходу — светодиоды. Используя блоки из разделa HDL Coder можно наворотить что-нибудь сложное внутри этой подсистемы, моделируя работу в Simulink, а потом создать прошивку даже не открывая Quartus и не видя никакого кода.

Так, например, реализовав такую схему в подсистеме

Получим на светодиодах значение на кнопках (умноженное на 4), но с значительной инерцией.

По сути это IIR — фильтр с бесконечной переходной характеристикой, но из-за цифровой реализации на fixed-point имеет проблемы с точностью и «залипаниями» (на светодиодах значение +-1 от того, что должно быть).

А где же всетаки моргание светодиодами?

Создадим новую модель и добавим в нее такую подсистему:

Настройки блоков:

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

Тут у нас преобразуется тип выходных данных. На выходе блока будет число с фиксированной точкой, 4 разряда и без дробной части (так приходится изголяться, когда нужно произвольное количество разрядов. встроенного типа uint4 нет, есть только uint8, uint16 и uint32).
Разрядность счетчика — 26. На Sample Time у него можно забить, т.к. оно учитывается только при моделировании. В железе здесь будет CLK.
Собственно все что здесь происходит — счетчик тактовых импульсов, сдвиг его значения на 22 вправо (выделяем старшие 4 бита), преобразование типа данных (указываем матлабу размерность выходных данных. иначе оно отказывается присоединять к выходу светодиоды, т.к. оператор сдвига не преобразует тип данных(у него на выходе все так же 26 бит)).
Теперь запускаем HDL Workflow adwisor и как выше описано настраиваем и выполняем все пункты. После всего этого светодиоды замигают демонстрируя работу счетчика.

Аналогично можно получить исходные коды на VHDL или Verilog если выбрать Generic ASIC/FPGA в первом пункте и обновить остальные настройки. После полученные файлы можно импортировать в квартус и использовать как душа ляжет наравне со своими модулями.

  • +12
  • 03 ноября 2014, 12:20
  • kest
  • 1
Файлы в топике: marsohod2.zip

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

RSS свернуть / развернуть
Супер! Направление интересное. А можно ли в матлаб вставить, например, источник данных (АЦП), подключенный к ПЛИС?
0
не совсем так, но в принципе можно.
Для подобной задачи, кмк лучше всеже взять сгенерированый код verilog или VHDL. И, например, в квартусе создать графический блок и там уже соединять интерфейсы.
При моделировании самой подсистемы можно подключать любые источники данных матлаба (указывая частоту дискретизации и разрядность) — в принципе имитация АЦП.
Чтобы генерировался код управления самим АЦП из матлаба — надо указать все необходимые выводы в настройках платы, в подсистеме реализовать логику управления АЦП(подача тактовой частоты и др) и при генерации кода входы и выходы модели соединить с входами и выходами АЦП.
Но данные из АЦП в матлаб не передаются, а полностью обрабатываются в ПЛИС
0
то есть, код для ПЛИС — это готовая высокоуровневая «аппаратная» математика?
0
в принципе да. но не только математика, а все что реализуешь: от какого-нибудь хитрого мультиплексора или генератора сигналов и до полноценной системы DSP(лишь бы блоков плис хватило).

При этом главная фишка в том, что перед прошивкой можно проверить как оно работает в матлабе, а уж обеспечение чтобы железо работало так же как модель — на плечах HDL Coder-а
0
Хорошая статья, познавательно! Нужно будет с PB II попробовать. К стати, а таким образом матлаб с CPLD подружится?
0
Почти. В списке поддерживаемых матлабом чипов у меня только FPGA(да и большинство названий говорят именно о FPGA), поэтому для CPLD путь: модель в матлабе -> генерациа модуля на verilog/vhdl без привязки к железу -> импорт в квартус -> как обычно. И прошивка напрямую из матлаба не пройдет. Хотя почему не реализовано непонятно, проблем вроде как не видно.
Стоит добавить еще про генерацию/импорт модуля? Хотя там вроде все еще проще и очевидней…
0
Да, обязательно добавь инфу про генерацию и импорт модуля.
Ну и конечно хочется увидеть экшен, то есть проект, где бы ПЛИС-ина показала свою мощь или хотя-бы что-то интересненькое.
0
Полностью согласен, Проект было бы отлично, например какой нибудь серьезный фильтр зарядить в плис и пусть считает.
0
Фильтр это будет хорошо!
Ну например, фильтр для регулировки тембра в области звуковых частот. Ками-то образом пропустить через, ПЛИС с фильтром, аудиофайл с компьютера и прослушать его после обработки этим фильтром. Чем не экшен?!!!
0
А что за команда такая «fpgaBoardManager»? Чего-то нет такой в Матлабе.
0
а какая у вас версия? И установлены ли модули HDL Coder?
ссылка
0
Да, разобрался уже: hdl coder стоит, но версия старовата. Получается, в новых версиях можно «объяснить» Симулинку что у тебя за плата — это гуд. Кстати, спасибо за статью, я сам чувак весьма опытный, но этого не знал :)
0
На dropbox удалены рисунки.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.