Здравствуйте! Сегодня мы познакомимся с новым семейством дешевых и малопотребляющих ПЛИС от 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 (кликабельные изображения с сайтов производителей):
image
Вместо нее можно купить вот эту (распиновка и настройки прошивателя будут отличаться!):

image

Итак, подробные шаги установки ПО, создания и настройки проекта и прошивателя, тестовый код, прошивка и наблюдение результатов:

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 по цене, быстродействию, количеству ячеек, разнообразию корпусов, доступности в России, легкости использования среды разработки и т.д.
Поделиться с друзьями
-->

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


  1. ktod
    18.11.2016 17:01

    Я так понял, iCE40 конфигурируется по spi. И в варианте с spi флешкой, плиска выступает в роли мастера.
    А есть вариант конфигурации spi slave? Что бы конфигурировать с мк, например, и избавиться от лишнего корпуса spi flash и его интерфейса программирования.


    1. itxs
      18.11.2016 17:07

      Можно в этом случае сделать МК как SPI Slave, разобравшись с тем, как хранится образ в памяти. Тогда ПЛИС при включении будет обращаться к МК как к флешке, МК должен будет хранить образ например в собственном флеше и выдавать его частями. Описание доступа к внешней флешке SPI есть в даташите на iCE40, также есть проект http://www.clifford.at/icestorm/format.html, в котором проведен реверс формата прошивки.


      1. ktod
        18.11.2016 17:47

        Решение «МК как SPI slave» — это совсем не то, что хотелось бы. «МК как SPI maser» — было бы заметно лучше. Ибо, далеко не всегда есть возможность полноценно эмулировать с помощью МК еще и SPI flash.
        А зачем разбираться с форматом прошивки? Если уж она хранится во флеше — значит там «обычный бинарник» и вся служебная информация представлена в понятном для плис виде. Отдавать как есть и все. Самое главное, чтоб была возможность сделать это по инициативе и от клока МК.

        А вообще, интересные устройства. Кристаллы емкие, корпуса компактные, прайс умеренный. Если еще и «passive serial» есть и софт под лин адекватный — можно попробовать и в разработку включить.

        В любом случае, спасибо за статью.


        1. itxs
          18.11.2016 19:00

          Под Linux пока есть некий Yosys:


          1. ktod
            18.11.2016 20:11

            Даже как то странно видеть такой вопрос. Инициатива МК нужна для сугубой гибкости решаемых задач. Ибо, и задачи и мк бывают очень разные. Далеко не любой мк может работать с заданной частотой sclk, например. Так же, иной раз, возникают задачи по перекофигурированию плм «на лету». Или прошивки для плм на мк может и не быть. Он ее может получать уже в процессе работы. Да, мало ли, вообще.

            Ознакомился с мануалом: spi slave есть. И, на беглый взгляд, сделан по-человечески.


            1. itxs
              18.11.2016 21:37

              Если есть SPI Slave, то замечательно. В принципе можно и как slave и как master сделать МК, конфигурирование ПЛИС только при включении делается, либо эпизодически. Думаю, любой МК с SPI должен в режиме slave работать на той частоте, на которой мастер читает данные, если эта частота не слишком большая для МК. Иначе он не полностью поддерживает SPI.


  1. UA3MQJ
    19.11.2016 18:12

    Спасибо за статью и за наводку на ICE40UL640-SWG16ITR50! Как мне кажется, это не плохая аналогия серии Alera max ii 240-570-1270. Только у Lattice есть еще и пара своих встроенных генераторов PLL. Цена на MAX240 прямо сейчас на ebay составляет 80 — 100 рублей с доставкой.
    Я уже недавно пробовал Lattice на 64 ячейки в качестве электронных часов. А люди уже пробуют 640й!


  1. vasiliev
    20.11.2016 00:05

    Работал с LP8K, позволю себе немного дополнить статью.

    В целом и ПЛИС, и набор инструментов порадовали своей минималистичностью. iCECube тоже использовал сначала, но затем перешёл на вызов скриптов сборки. Кстати, в комплекте с iCECube поставляется синтезатор Synplify, и его графическим интерфейсом (который вызывается как из iCECube, так и отдельно) довольно удобно пользоваться для анализа критических путей.

    Из недостатков серии по сравнению с Altera хочу отметить отсутствие jtag и аналогов SignalTap, что несколько усложняет отладку на рабочей плате.

    Для прошивки использовал FT232H, с его помощью можно прошить как загрузочную флешку (через flashrom), так и ПЛИС в режиме SPI Slave. Если кому надо, программку для прошивки в режиме SPI Slave через libftdi можно скачать здесь https://bitbucket.org/vasiliev/ice40_ftdi.