Здравствуйте! Сегодня мы познакомимся с новым семейством дешевых и малопотребляющих ПЛИС от Lattice Semiconductor семейств iCE40LP/HX/LM, научимся работать с фирменным компилятором iCEcube2 и редактором кода Sublime Text 3, а также программировать чип на отладочной плате Lattice iCEstick с помощью прошивки, написанной на SystemVerilog.
Все будет сопровождаться подробными инструкциями и скриншотами.
Бывает, для некоторых задач в разработке железа, особенно связанных с высокой параллельностью обработки данных, быстротой их обработки или с другой спецификой задачи не подходят микроконтроллеры, а что-нибудь мощное из 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 по цене, быстродействию, количеству ячеек, разнообразию корпусов, доступности в России, легкости использования среды разработки и т.д.
Все будет сопровождаться подробными инструкциями и скриншотами.
Бывает, для некоторых задач в разработке железа, особенно связанных с высокой параллельностью обработки данных, быстротой их обработки или с другой спецификой задачи не подходят микроконтроллеры, а что-нибудь мощное из 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 по цене, быстродействию, количеству ячеек, разнообразию корпусов, доступности в России, легкости использования среды разработки и т.д.
Поделиться с друзьями
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.