Все будет сопровождаться подробными инструкциями и скриншотами.
Бывает, для некоторых задач в разработке железа, особенно связанных с высокой параллельностью обработки данных, быстротой их обработки или с другой спецификой задачи не подходят микроконтроллеры, а что-нибудь мощное из Cortex-A видится пушкой по воробьям. Тогда как правило, разработчик обращает внимание на ПЛИС, предоставляющие за относительно недорогую цену ему полную свободу действий на самом низком уровне цифровых систем – отдельных логических элементов и триггеров. Это позволяет сделать «свою собственную микросхему» внутри ПЛИС, используя ее выводы и уже встроенную внутри периферию. Например, если вдруг вам понадобилось 50 таймеров с ШИМ, или сверхбыстрая обработка данных, или, скажем, SPI с 3 линиями MISO и 2 MOSI, передать 5 Гбит по 2 дифф. линиям – все это вполне реализуемо на ПЛИС. Инженер тут ограничен только количеством универсальных логических ячеек и их временем переключения.
Среди производителей ПЛИС два уже завоевали популярность среди разработчиков – это Altera и Xilinx, выпускающие как наиболее простые ПЛИС (MAX II, MAX 10, Spartan II, Spartan III), на которых можно построить логику практически любой сложности, так и сверхбыстродействующие (Stratix 10, Arria 10, Spartan 7, Artix 7), способные передавать данные со скоростью до 56 Гбит/с, чтобы у вас был быстрый интернет. Однако, далеко не всегда нужны такие кошмарные скорости работы.
Некоторые особенности ПЛИС семейства iCE40 (данные с сайта производителя):
• Серия HX – высокопроизводительные ПЛИС, LP – малопотребляющие и LM – малопотребляющие с встроенной периферией;
• От 384 до 7680 LUT ячеек;
• Низкое энергопотребление, начиная с 25 мкВт у некоторых чипов;
• Интегрированные в железе SPI и I2C интерфейсы, облегчающие конфигурирование микросхемы;
• Возможность реализации интерфейсов: Parallel RGB, 7:1 LVDS, MIPI DPI/DBI, HiSPi, subLVDS, LVDS, Parallel LVCMOS;
• До 128 кбит встроенного ОЗУ;
• Внутренней Flash памяти нет, поэтому придется подключить к встроенному автоматическому SPI интерфейсу внешнюю память (подходящие модели можно узнать в прошивателе Diamond Programmer);
• Корпуса BGA с шагом 0.35-0.4 мм, с минимальными размерами 1.40x1.48x0.45 мм с шагом 0.35 мм, имеется и TQFP-144 корпус с шагом 0.4 мм.
Если Altera и Xilinx имеют удобные среды разработки с большим количеством уроков по ним, то ПО от Lattice – это компилятор с оболочкой над Synopsys Synplify, и писать код там мне показалось неудобным, поэтому я решил просто загружать туда готовые исходники. ПО для других серий – Lattice Diamond не подходит для серии iCE40, поэтому для редактирования кода я поставил известный редактор Sublime Text 3 и установил на него плагин для поддержки языка SystemVerilog. Можно писать и на других языках, iCEcube2 автоматически распознает язык по расширению файла.
Хорошо, если у вас есть отладочная плата iCEstick с USB (кликабельные изображения с сайтов производителей):
Вместо нее можно купить вот эту (распиновка и настройки прошивателя будут отличаться!):
Итак, подробные шаги установки ПО, создания и настройки проекта и прошивателя, тестовый код, прошивка и наблюдение результатов:
1. Регистрируемся на сайте Lattice Semiconductor и скачиваем iCEcube2.
2. Нажимаем «Click here to request your license» на той же странице. После этого нужно будет ввести в поле свой MAC-адрес.
3. На почту придет письмо с файлом лицензии.
4. Устанавливаем iCEcube2, копируем файл лицензии в его папку, и указываем к нему путь, запустив iCEcube2.
5. Устанавливаем ПО для прошивки ПЛИС — Lattice Diamond Programmer.
6. Устанавливаем Sublime Text 3 и менеджер пакетов для него.
7. В Sublime Text 3 жмем Preferences → Package Control, в открывшемся списке жмем «Package Control:Install Package».
8. Вводим «SystemVerilog». Жмем на первый (и единственный) пункт в списке, ждем пока установится плагин (см. строку внизу редактора).
9. Создаем пустой файл и сохраняем его как top.sv там, где будут исходники вашего проекта прошивки ПЛИС.
10. В iCEcube2 жмем New project (или желтый листок вверху), откроется окно, где нужно заполнить параметры как на скриншоте, указав путь к проекту:
11. Жмем Next, появится окно добавления исходных файлов в проект, ищем наш файл top.sv, дважды кликаем на него и жмем Finish.
12. Проект создан, слева находится его дерево и шаги синтеза, размещения и трассировки соединений между ячейками. Пункт Design Files раскрывается, там находятся все включенные в проект файлы. Сейчас там только top.sv:
13. Напишем стандартный код для мигания светодиодом (хорошо, если у вас есть плата iCEStick):
14. Сохраним изменения в файле и перейдем в iCEcube2. Нажмем там на этот файл дважды, и на вопрос, обновить ли файл, отвечаем «Yes».
15. В iCEcube2 жмем Tools>Run All и ждем, пока проект соберется.
16. Жмем на кнопку с 16 зелеными кружочками, Package View:
17. Открывается редактор выводов, в котором можно соотнести входы и выходы вашего модуля на SystemVerilog и выводы корпуса ПЛИС. Схему корпуса можно масштабировать (Ctrl+вращать колесико мыши) и двигать (перетаскивая курсором):
18. Если скачать даташит на отладку iCEstick, то можно узнать, что генератор тактовой частоты подключен к 21 выводу, а 5 светодиодов – к 95(зеленый), 96, 97, 98 и 99 (красные) выводам. В панели слева Port нужно раскрыть шину led[4:0], которую мы завели вместо одного выхода чтобы на тех диодах, которыми мы мигать не будем был железный 0, иначе они будут тускло светить. Теперь мышкой перетащите все пункты led[0]..led[4] на выводы, к которым подключены светодиоды, а clk – на 21 вывод.
19. Если все сделано правильно, то эти выводы на схеме окрасятся в зеленый цвет. После этого нужно нажать на каждый из них правой кнопкой и в выпадающем меню нажать Lock, после чего на них появятся замочки. Это избавит вас от сброса распиновки при перекомпиляции кода. Теперь сохраните распиновку, нажав Ctrl-S. В следующих окнах нужно нажимать OK и Yes:
20. Опять нажмите на 16 кружочков (Package view). Получившаяся картина выглядит так:
21. Жмем Tools → Run All и дожидаемся полной компиляции проекта
22. Вставляем отладку iCEstick в USB порт ПК и запускаем Diamond Programmer, жмем там File>New File. Откроется окно, в котором можно нажать Detect Cable, а можно выбрать эти параметры вручную:
23. Нажимаем ОК и ждем сканирование:
24. Если все хорошо, появится строка:
Если все плохо – попробуйте другой USB-порт.
25. Заполняем параметры:
26. В столбце Operation жмем на надпись Fast programming, открывается окно:
В котором нужно выбрать в раскрывающемся списке Access Mode пункт SPI Flash Programming, после чего окно увеличится, и теперь нужно заполнить остальные поля как на скриншоте:
27. Нажимаем OK, или Enter, кому как удобнее, а затем сохраним конфигурацию прошивателя, нажав Ctrl-S.
28. Жмем Program и ждем минуту, пока ПЛИС сотрется и снова запрограммируется:
29. Наблюдаем результат: красный светодиод мигает с заметной частотой:
Заключение
Мы научились настраивать и собирать проект с кодом в ПО iCEcube2, настраивать прошиватель и загружать прошивку в чип ПЛИС. Написали тестовый код мигания светодиодом на плате и подтвердили его работоспособность.
Для того чтобы применить ПЛИС семейства iCE40 в своих проектах нужно изучать даташиты на выбранный чип и его отладочные платы. Самый дешевый чип семейства – ICE40UL640-SWG16ITR50 стоит в Digi-Key 1.53$/шт., имеет 640 ячеек, 55 кб ОЗУ, и корпус WLCSP-16 размером 1.4x1.48 мм. Самый дорогой чип серии – ICE40HX8K-CT256 стоит в Digi-Key 12.78$/шт., имеет 7680 ячеек, 128 кб ОЗУ, и корпус BGA-256 размером 14х14 мм.
В дальнейших статьях будет проведен обзор аналогичных по характеристикам ПЛИС других производителей и сравнение с iCE40 по цене, быстродействию, количеству ячеек, разнообразию корпусов, доступности в России, легкости использования среды разработки и т.д.
Комментарии (0)