![](https://habrastorage.org/files/17d/bb6/6f2/17dbb66f2d5442e9a06451e233ed3ada.jpg)
Все будет сопровождаться подробными инструкциями и скриншотами.
Бывает, для некоторых задач в разработке железа, особенно связанных с высокой параллельностью обработки данных, быстротой их обработки или с другой спецификой задачи не подходят микроконтроллеры, а что-нибудь мощное из 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 (кликабельные изображения с сайтов производителей):
![image](https://habrastorage.org/getpro/habr/post_images/fa8/373/e0e/fa8373e0ebecebe795d3b46560d66e00.png)
Вместо нее можно купить вот эту (распиновка и настройки прошивателя будут отличаться!):
![image](https://habrastorage.org/getpro/habr/post_images/4c6/c55/b98/4c6c55b986407a0fae8788f15f9d773c.png)
Итак, подробные шаги установки ПО, создания и настройки проекта и прошивателя, тестовый код, прошивка и наблюдение результатов:
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 (или желтый листок вверху), откроется окно, где нужно заполнить параметры как на скриншоте, указав путь к проекту:
![](https://habrastorage.org/files/1c5/d81/5a7/1c5d815a74c94e318f624d55a9e9688f.png)
11. Жмем Next, появится окно добавления исходных файлов в проект, ищем наш файл top.sv, дважды кликаем на него и жмем Finish.
12. Проект создан, слева находится его дерево и шаги синтеза, размещения и трассировки соединений между ячейками. Пункт Design Files раскрывается, там находятся все включенные в проект файлы. Сейчас там только top.sv:
![](https://habrastorage.org/files/1f3/129/758/1f312975837a475984e87dbe94e7d92f.png)
13. Напишем стандартный код для мигания светодиодом (хорошо, если у вас есть плата iCEStick):
![](https://habrastorage.org/files/8d7/60f/623/8d760f6233fd48189c8e323cb01a977d.png)
14. Сохраним изменения в файле и перейдем в iCEcube2. Нажмем там на этот файл дважды, и на вопрос, обновить ли файл, отвечаем «Yes».
15. В iCEcube2 жмем Tools>Run All и ждем, пока проект соберется.
16. Жмем на кнопку с 16 зелеными кружочками, Package View:
![](https://habrastorage.org/files/55d/881/164/55d881164c6941f9b18f75a93e200113.png)
17. Открывается редактор выводов, в котором можно соотнести входы и выходы вашего модуля на SystemVerilog и выводы корпуса ПЛИС. Схему корпуса можно масштабировать (Ctrl+вращать колесико мыши) и двигать (перетаскивая курсором):
![](https://habrastorage.org/files/2bd/508/c16/2bd508c167774f71a5a7324585e87cd5.png)
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:
![](https://habrastorage.org/files/805/be7/84b/805be784b3614c699395373e2790b697.png)
![](https://habrastorage.org/files/638/fd0/23c/638fd023c3de4cf6a41b47b5cc6ca6ef.png)
20. Опять нажмите на 16 кружочков (Package view). Получившаяся картина выглядит так:
![](https://habrastorage.org/files/488/c69/94a/488c6994a0a747dead9abe1e90da22fd.png)
21. Жмем Tools > Run All и дожидаемся полной компиляции проекта
22. Вставляем отладку iCEstick в USB порт ПК и запускаем Diamond Programmer, жмем там File>New File. Откроется окно, в котором можно нажать Detect Cable, а можно выбрать эти параметры вручную:
![](https://habrastorage.org/files/47a/091/73e/47a09173e3a24190bc734c377716edd9.png)
23. Нажимаем ОК и ждем сканирование:
![](https://habrastorage.org/files/5dc/b30/ebd/5dcb30ebd65c4002a934d2a03e12f28e.png)
24. Если все хорошо, появится строка:
![](https://habrastorage.org/files/282/62f/c1a/28262fc1a4044267a76456f66c6ac076.png)
Если все плохо – попробуйте другой USB-порт.
25. Заполняем параметры:
![](https://habrastorage.org/files/640/b0b/f6e/640b0bf6effd4ef9bed692548247098a.png)
![](https://habrastorage.org/files/a04/f7e/b84/a04f7eb84fe34310a9ba1b6c18566ae6.png)
26. В столбце Operation жмем на надпись Fast programming, открывается окно:
![](https://habrastorage.org/files/fbc/586/6c6/fbc5866c6cde4ee08ddbd2d46261aedc.png)
В котором нужно выбрать в раскрывающемся списке Access Mode пункт SPI Flash Programming, после чего окно увеличится, и теперь нужно заполнить остальные поля как на скриншоте:
![](https://habrastorage.org/files/616/e16/9c1/616e169c1ce8400ea536d125418a416e.png)
27. Нажимаем OK, или Enter, кому как удобнее, а затем сохраним конфигурацию прошивателя, нажав Ctrl-S.
28. Жмем Program и ждем минуту, пока ПЛИС сотрется и снова запрограммируется:
![](https://habrastorage.org/files/54c/4d3/975/54c4d397514b419cb5d68f2d1f678439.png)
![](https://habrastorage.org/files/263/2b4/461/2632b4461b3c458db96db13720d7f438.png)
29. Наблюдаем результат: красный светодиод мигает с заметной частотой:
![](https://habrastorage.org/files/a37/f8c/8c1/a37f8c8c162c45428d2730b0902f508d.png)
![](https://habrastorage.org/files/def/fe1/48d/deffe148d02948e6a1d17ace62af188c.png)
Заключение
Мы научились настраивать и собирать проект с кодом в ПО 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 по цене, быстродействию, количеству ячеек, разнообразию корпусов, доступности в России, легкости использования среды разработки и т.д.
Поделиться с друзьями
ktod
Я так понял, iCE40 конфигурируется по spi. И в варианте с spi флешкой, плиска выступает в роли мастера.
А есть вариант конфигурации spi slave? Что бы конфигурировать с мк, например, и избавиться от лишнего корпуса spi flash и его интерфейса программирования.
itxs
Можно в этом случае сделать МК как SPI Slave, разобравшись с тем, как хранится образ в памяти. Тогда ПЛИС при включении будет обращаться к МК как к флешке, МК должен будет хранить образ например в собственном флеше и выдавать его частями. Описание доступа к внешней флешке SPI есть в даташите на iCE40, также есть проект http://www.clifford.at/icestorm/format.html, в котором проведен реверс формата прошивки.
ktod
Решение «МК как SPI slave» — это совсем не то, что хотелось бы. «МК как SPI maser» — было бы заметно лучше. Ибо, далеко не всегда есть возможность полноценно эмулировать с помощью МК еще и SPI flash.
А зачем разбираться с форматом прошивки? Если уж она хранится во флеше — значит там «обычный бинарник» и вся служебная информация представлена в понятном для плис виде. Отдавать как есть и все. Самое главное, чтоб была возможность сделать это по инициативе и от клока МК.
А вообще, интересные устройства. Кристаллы емкие, корпуса компактные, прайс умеренный. Если еще и «passive serial» есть и софт под лин адекватный — можно попробовать и в разработку включить.
В любом случае, спасибо за статью.
itxs
Под Linux пока есть некий Yosys:
ktod
Даже как то странно видеть такой вопрос. Инициатива МК нужна для сугубой гибкости решаемых задач. Ибо, и задачи и мк бывают очень разные. Далеко не любой мк может работать с заданной частотой sclk, например. Так же, иной раз, возникают задачи по перекофигурированию плм «на лету». Или прошивки для плм на мк может и не быть. Он ее может получать уже в процессе работы. Да, мало ли, вообще.
Ознакомился с мануалом: spi slave есть. И, на беглый взгляд, сделан по-человечески.
itxs
Если есть SPI Slave, то замечательно. В принципе можно и как slave и как master сделать МК, конфигурирование ПЛИС только при включении делается, либо эпизодически. Думаю, любой МК с SPI должен в режиме slave работать на той частоте, на которой мастер читает данные, если эта частота не слишком большая для МК. Иначе он не полностью поддерживает SPI.
UA3MQJ
Спасибо за статью и за наводку на ICE40UL640-SWG16ITR50! Как мне кажется, это не плохая аналогия серии Alera max ii 240-570-1270. Только у Lattice есть еще и пара своих встроенных генераторов PLL. Цена на MAX240 прямо сейчас на ebay составляет 80 — 100 рублей с доставкой.
Я уже недавно пробовал Lattice на 64 ячейки в качестве электронных часов. А люди уже пробуют 640й!
vasiliev
Работал с LP8K, позволю себе немного дополнить статью.
В целом и ПЛИС, и набор инструментов порадовали своей минималистичностью. iCECube тоже использовал сначала, но затем перешёл на вызов скриптов сборки. Кстати, в комплекте с iCECube поставляется синтезатор Synplify, и его графическим интерфейсом (который вызывается как из iCECube, так и отдельно) довольно удобно пользоваться для анализа критических путей.
Из недостатков серии по сравнению с Altera хочу отметить отсутствие jtag и аналогов SignalTap, что несколько усложняет отладку на рабочей плате.
Для прошивки использовал FT232H, с его помощью можно прошить как загрузочную флешку (через flashrom), так и ПЛИС в режиме SPI Slave. Если кому надо, программку для прошивки в режиме SPI Slave через libftdi можно скачать здесь https://bitbucket.org/vasiliev/ice40_ftdi.