Модуль ПЛИС Altera MAX II EPM240T100C5 для Pinboard II


Линейка процессорных модулей для PB2 неспешно пополняется новыми персонажами. После STM8 и PICа с езернетом к ней добавился модуль с ПЛИС.
 

Для тех, кто эти четыре буквы видит впервые — ПЛИС это программируемая микросхема, поведение которой можно задавать на уровне отдельных логических элементов (И, ИЛИ…). Как если бы мы рисовали схему на логике. Внутри она состоит из однотипных блоков (logic blocks), соединенных между собой. Функцию каждого блока и соединения между ними можно программировать, задавая ту логику работы, которая тебе нужна. В итоге мы имеем устройство, которое делает именно то что необходимо, не совершая никаких лишних действий. И делает это очень быстро. Во первых за счет того, что даже простые ПЛИС (как наша) могут работать с высокими тактовыми частотами (на модуле установлен генератор на 100Мгц, например). Во-вторых, в ПЛИС (в отличие от МК) нету ядра, конвеера, памяти с командами. Алгоритм работы, который мы описываем на специальном языке HDL — Hardware definition language, синтезируется в готовую логическую схему, а не последовательность команд.
 

Для модуля на PINBOARD2 я взял ПЛИС от Altera — EPM240T100C5 из семейства MAX II. Она (в сравнении с другими ПЛИС) не очень большая по объему — 240 логических блоков.
 

Попутно, пользуясь поводом, мы пропиарим отличный проект Marsohod.org как раз активно описывающий работу с ПЛИС. Рекомендую зайти к ним в гости и пошариться там. Найдете много интересного. Там есть и всякие пищалки музыкальные, USB устройства, разные протоколы и даже создание упрощенного AVR ядра в недрах ПЛИС, с компиляцией кода под него в AVR Studio :) И это при том, что ПЛИС EPM240T100C5 реально небольшая. На больших и мощных плисинах синтезируют целые ARM-микропроцессоры, а на сайте opencores лежит куча проектов разнообразных ядер, криптопроцессоров, контроллеров памяти и прочей прикольной фигни. И что самое приятное, при переходе с малой плис на супермеагаздоровенную не нужно переучиваться и вникать в новую архитектуру и переучиваться.
 

▌Описание микросхемы
T100 в маркировке ПЛИС не имеет никакого отношения к SkyNet и вселенной Терминатора вообще — это корпус. TQFP с сотней выводов. Из них 81 можно использовать как пины GPIO. На каждом GPIO можно включить внутренний подтягивающий резистор, номиналом около 50к.
 

Каждый вывод может отдавать ток до 20мА. А несколько выводов можно объединить вместе, тем самым увеличив мощность (естественно ими нужно будет рулить синхронно, не допуская конфликтов уровней). Так например на marsohod.org делали свой танк — моторы управлялись напрямую от ПЛИС, а на чип пришлось прилепить радиатор, чтобы не перегревался. А в нашем модуле можно перемычками сливать выводы в огромный суперпин.
 

Еще одна прикольная фича ПЛИСки, относящаяся к пинам — банки GPIO. Наш чип имеет два банка — I/O BANK0 и BANK1. У них различные группы питания. Это значит, что один банк мы можем запитать, например от 1.5V, а другой от 3.3, получив конвертер уровней забесплатно. У меня на модуле линии питания от всех банков заведены на общее питание (3.3V)
 

Последняя цифра в маркировке — это класс скорости. От него зависит максимальная частота переключения триггеров в ПЛИС. Чем меньше цифра, тем на большей частоте они могут переключаться. Вот для примера картинка на которой показана максимальная скорость работы 16и разрядного счетчика в зависимости от класса скорости:
 


 

У нас он может тикать с частотой до 201 Мгц.
 

Еще в ПЛИС есть 1кб пользовательской флеш-памяти, в которой можно схоронить всякие настройки и прочую фигню. Но самое интересное ждет нас дальше — модуль с памятью оснащен собственным тактовым генератором (на RC цепочке) который тикает на частоте 3-5 Мгц. Этот же генератор можно использовать для тактирования всей остальной части ПЛИС. Поэтому при необходимости можно жить вообще без внешнего тактового генератора. Т.е. как микроконтроллер. Питание подал и поехали.
 

Описание модуля
На модуле стоит тактовый генератор на 100Мгц, который заведен на PIN26. У ПЛИС нет особых входов тактирования, как в МК — такты можно подавать на любой вывод. Причем никто не запрещает заюзать несколько разных генераторов, либо привязать тактирование какого-нибудь интерфейсного модуля к внешнему сигналу. Генератор, правда, должен быть независимым. Вот эта серебристая штука он и есть. Подаешь на нее 3.3 вольта, а с выхода имеешь 100МГц меандр. Одно плохо, дорогой он, зараза :(
 

Программируется плиска через JTAG. На нижней части модуля установлен разъем, куда выведены все сигналы жтага + земля и питание. А в комплекте с модулем идет шлейф и мелкая плашка на FTDI модуль. Мозгов в нет от слова совсем. Просто проводки с FTDI выведены в нужном порядке под шлейф. Так что шлейфик будет в комплекте.
 


 

Ножек на плиске просто дохренища, а терять их не хотелось. Поэтому часть выведена на штырьки, а часть — сразу на разъем которым процессорный модуль подключается к базовой плате. Все ножки на ПЛИС равнозначны и их можно легко ремапить, поэтому в таком «жестком» подключении нету ничего криминального и выбивающегося из идеологии платы.
Более того, конфигурация выводов в проекте легко сохраняется и загружается — можно держать конфиг для отладки на PB2 и еще один — под распиновку на готовом устройстве.
 


 

 

Некоторым пинам все-равно места не хватило. Можно было-бы забить на них и просто не разводить, но я решил собрать эти выводы в группы (соединив прямо на плате) и получил суперпины :) Можно дергать реле без драйверов, зажигать мощные светодиоды или крутить моторы. На это благое дело мы пустили 12 выводов в группах по 6шт.
 

Суперпины (изначально их 2) выведены на верхнюю сторону модуля рядом с другими пинами. Их можно объединять джамперами, собирая вместе больше выводов:
 


 

Обычные пины, которые заведены наверх, тоже можно присоединять к суперпинам при помощи джамперов. В итоге, накинув все джамперы, мы соберем на один вывод адову кучу ножек. Максимальный ток каждого пина 25мА, то есть пачка из 10 уже потянет 1W светодиод.
 

На суперпин HI 1 заведены пины 82,83,84,85,86,87 — то есть суммарно он может выдать ток 120мА. Этого вполне хватит для переключения реле или питания небольшого мотора. Если нужно больше, можно прицепить к HI 1 другие пины из верхнего ряда.
 

На HI 2 заведены 67,68,69,70,71 — он может отдать до 100мА. Но его так же можно усилить, подключив джамперами дополнительные пины.
 

А если хочется совсем адскую мощь, то HI1, HI2 и все пины верхнего ряда можно собрать вместе. Тогда отдаваемый ток достигнет 400мА. Но не помешает налепить сверху на чип радиатор.
 

▌Быстрый старт
Для начала, надо установить Quartus II Web Edition. Это бесплатная (с некоторыми ограничениями, которые нас совершенно не касаются) версия среды разработки Quartus II от Altera. Качается либо с офсайта, либо с рутрекера, если вы как и я забыли логин от altera.com.
 

При запуске, а особенно попытке самостоятельно что-то найти, IDE может вынести мозг неподготовленному читателю — осторожнее. Поэтому, чтобы разобраться с созданием проекта и запуском его на ПЛИС, напишем простенькую мигалку светодиодом.
 

Запускаем квартус. Он спросит у нас про настройки внешнего вида, оставляем как есть. Далее он спросит, не хотим ли мы купить лицензию на расширенную версию — ответ очевиден. После этого вылезет окошко getting started, где мы тыкаем Create a new project.
 


 

Нас спросят про расположение проекта и его название. Я гордо обозвал проект blink.
 


 

Потом предложат добавить к проекту уже существующие файлы. Пропускаем это — добавлять нам пока решительно нечего.
 

Третьим шагом надо выбрать камень, с которым мы будем работать. На модуле стоит EPM240T100C5. Чтобы не листать километровый список — выставляем семейство: MAX II.
 


 

Четвертым пунктом идет выбор внешних утилит для компиляции, симуляции и анализа таймингов. Этот шаг тоже пропускаем.
 

После создания проекта нас ждет серое пустое окно. Никакого шаблона или намека на него.
 

Жмем ctrl+n и выбираем Verilog HDL, чтобы создать новый файл на языке verilog.
 


 

Теперь пишем туда простенький код-мигалку:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module blink(clk, led);
 
input clk;
output led;
 
reg [26:0] longcnt;
reg led;
parameter delay_max = 50_000_000;
always @(posedge clk)
begin
		if (longcnt==delay_max)
		begin
			longcnt <= 0;
			led <= ~led;
		end
		else
		begin
			led <= led;
			longcnt <= longcnt+1;
		end
end
 
endmodule

 

В самом начале описывается модуль, его входные и выходные сигналы. Наш модуль blink использует сигналы clk (по нему будет подаваться тактовая частота) и led (выход на светодиод).
Далее описано направление сигналов — clk на вход, led на выход.
 

Следующей строчкой описывается регистр из 27 бит (26:0) под названием longcnt. В нем у нас будет счетчик тактов для формирования большой задержки.
 

Ниже идет константа:
 

1
parameter delay_max = 500_000_000;

 

delay_max — это значение счетчика на котором он сбросится и начнет считать с начала — проще говоря потолок. В этот же момент у нас состояние ножки на которой висит светодиод будет меняться на противоположное. А нижнее подчеркивание в числах — исключительно для удобства чтения. Компилятор на них внимания не обращает.
 

Затем идет блок always
 

1
2
3
4
always @(posedge clk)
begin
 
end

 

Суть проста — все, что между begin-end будет выполняться на каждом переднем фронте (posedge) сигнала clk. В качестве некоторой аналогии можно вспомнить внешнее прерывание по фронту в МК.
А между begin и end у нас:
 

Проверка на совпадение счетчика с максимальным значением

1
if (longcnt==delay_max)

 

Если совпало, то счетчик обнуляется, а светодиод переключается.

1
2
			longcnt <= 0;
			led <= ~led;

 
А если не совпало — счетчик продолжает тикать.
 

Туева хуча материала по ПЛИС и языкам программирования HDL утягивается вот с этого торрента, а также шерстим сообщество we.easyelectronics.ru блог ПЛИС и проект Марсоход.
 

Остается один вопрос — как компилятор узнает на каких пинах у нас тактовый сигнал и светодиод? Для этого лезем в Pin Planner — тулза которая позволяет раскидать сигналы по выводам микросхемы и спланировать ее распиновку:
 


 

В ее окошке есть схематичное изображение корпуса нашей плисины:
 


 

 

Находим там 26 пин и делаем даблклик по нему:
 


 

В появившемся окошке даем пину название — clk. Теперь он связан с сигналом clk нашего модуля.
 


 

Тоже самое делаем с пином 99, но обзываем его led. На модуле этот вывод напрямую подключен к PWLED0.
 

Теперь quartus знает что такое led и clk, и понимает на какие пины нужно подключить эти сигналы.
 

А еще было бы не лишним поменять режим, в который квартус загоняет неиспользуемые пины. По-умолчанию он, видимо для снижения потребления, настраивает их все на выход подключенный к земле. По моему, куча левый пинов настроеных на выход (не в готовом устройстве, а на отладочной плате) — это верный способ что-нибудь спалить. Лучше пусть болтаются входами. Идем в менюшку Assigments -> Device. Там жмем кнопу Device and Pins options. И в появившемся окошке, на вкладке Unused pins ставим «As input Tri-Stated«
 

 

Перед тем как начать компиляцию (на самом деле, тут это называется синтез — так звучит круче) проекта, мы должны заставить quartus генерировать svf файл. В этом файле содержится последовательность JTAG команд необходимая для загрузки нашей прошивки в ПЛИС. Команды из svf файла нужно просто забрасывать в JTAG порт ПЛИС. Сделает это FTDI в режиме MPSSE и программка «SVF player».
 

Но для начала надо заставить Quartus выдавать svf файл после сборки проекта. Опять лезем в меню Assigments -> Device, Там выбираем Device and Pin Options.
 


 

Находим вкладку Programming Files и устанавливаем галку напротив «Serial Vector File».
 

Теперь после синтеза в папке с проектом будет валяться .svf файл. Можно проверить — синтез запускается сочетанием Ctrl+L или вот этой кнопой:
 


 

Для прошивки ПЛИС товарищи с marsohod.org написали простенькую консольную утилитку, которая подходит для PINBOARD2 (и вообще любого огрызка текстолита с FT2232D/FT4232 на борту). Все что она делает — транслирует битбангом в JTAG порт *.svf файл. Для того чтобы она прошила модуль, нужно надеть плашку с JTAG разъемом на FTDI, бросить шлейф и запустить утилиту, указав ей в качестве единственного параметра путь к svf файлу.
 
Командная строка при этом выглядит так:
 

mbftdi blink.svf
 

Прошивалка автоматически выбирает первое FTDI-устройство и пытается прошить через него.
 

В случае успешной прошивки выдает что-то вроде этого:
 

d:\Work\Altera>mbftdi blink.svf
mbftdi v1.4 - burn MAX2 CPLD from Altera Vector Programming File *.svf
FTDI port to JTAG is used for programming
Usage example: mbftdi myfile.svf

Checking for FTDI devices...
2 FTDI devices found - the count includes individual ports on a single chip
Assume first device has the MPSSE and open it...
Device: Dual RS232 A
Serial: A
Configuring port for MPSSE use...
Frequency is set to 6MHz (FTDI clk divider 0000), requred 10MHz
-----------------------------------
!CHECKING SILICON ID
-----------------------------------
!BULK ERASE
-----------------------------------
!PROGRAM
-----------------------------------
!VERIFY

JTAG program executed successfully.
Press  to continue

 

Для прошивки удобно юзать bat файл типа такого:

1
2
mbftdi blink.svf
pause

 

А пусть к mbftdi можно прописать в переменную окружения PATH. Тогда батник можно будет закидывать в папку с проектом, а сама утилита валяться где-нибудь отдельно.
 

После прошивки светодиод на плате начинает неспешно мигать (переключение при достижении счетчиком значения 50М, а тактирование у нас 100Мгц, значит переключаться будет 2 раза в секунду).
 

В сообществе we.easyelectronics.ru есть целый раздел в котором уже более 50 статей.
 
 

Модуль уже есть в наличии и доступен в магазине
 

Автор модуля и документации к нему dcoder. Все вопросы к нему :)
 

45 thoughts on “Модуль ПЛИС Altera MAX II EPM240T100C5 для Pinboard II”

  1. Долгожданный модуль!
    Ценник вот только кусается как взбесившися верблюд…
    На глаз кажется, что если заказать плату в seedstudio и купить компоненты локально(в той же Меге),
    то получится дешевле, даже если делать в единственном экземпляре.
    Была выпущена очень маленькая серия?

    1. Ну если в розницу брать примерно то же и выйдет. Считай альтерка эта в розницу от 250 до 350р обычно. Генератор 150..300 если вообще найдешь где в розницу. Редкая штука. Мелочевки там еще рублей на 50 если розницу считать. И печатка три четыре бакса в сидстудио. Ну получится то же самое, а то и дороже. Только ждать печатку придется месяц-два.

      1. Альтерка EPM240T100C5N 150
        Генератор KXO-V97 100.0 MHz 200
        Мелочевка 50
        Печатка пусть 150

        Итого 550
        Первые три пункта в Питере через три дня привезут, но вот
        печатку ждать действительно долго .

        1. Ну вот о чем и речь, а у меня она 700 выложена. Т.е. разница в 150р, как литр хорошего пива. В регионах же ценник умножай в полтора-три раза. Т.к. там в лучшем случае один-два магазина на всю область где есть что то отличное от запчастей для мобил.

          Причем ее еще спаять надо, TQFP100 без опыта сразу посадить довольно сложно. Я, например, когда первый раз припаивал LPC1751 так дорожки поотрывал нахер, хотя до того насадил не одну сотню FT232RL

  2. >EPM240T100C5 — 240 логических блоков.

    1. Вот для ксилинксов есть довольно вкусное очень маленькое ядро picoblaze. ядро в разы мельче и быстрее синтезированных пиков и авр-ок. Есть ли что-то подобное пикоблейзу но для EPM240T100C5?

    2. если есть, то сколько примерно их влезет в этот кристалл? У ксилинксов(спартанов), если упихивать руками и ногами, то влезает примерно столько микроядер, сколько блоков памяти в кристалле.

  3. Привет, отличный старт по ПЛИСам!!

    DI HALT, поправь пожалуйста: HDL— Hardware Description Language. описываем, не определяем :)

    nicka78, пикоблейз всё-таки софт-проц хилых, создан под слайсы виртекса либо спартана (менее 30 слайсов для минимальной сборки в определённых семействах). под макс его не собрать оптимизированно, тем более под младший. гораздо проще, написать небольшой FSM под конкретную задачу. пикоНиосов, на сколько я знаю, у Альтеры нет.

  4. ebay free shiping намекает — http://www.ebay.com/itm/EPM240-Core-Board-ALTERA-MAX-II-FPGA-CPLD-Development-Board-Kits-Learning-Board-/330812701250?pt=LH_DefaultDomain_0&hash=item4d05f93a42

    по плате замечание — клоки лучше подавать на выделенные ноги GCLK0-3 они особым образом разведены в кристалле чтобы обеспечить одновременный приход клока ко всем ячейкам.

    1. Ой какая офигенная разметочка вокруг чипа. Че я до такой не допетрил. Надо тоже футпринты такие сделать.

      Клок завели так из соображения максимальной совместимости с марсоходом

        1. Они да, но и старая платформа поддерживается. А их переход мне, например, не особо понравился. Если первоначальная платка была оригинальным подходом, этакой ардуино на плис, то марсоход2 это еще одна унылая плисборда из 100500 похожих как две капли воды отладочных плат. Сделали бы они из нее встраиваемый модуль было бы куда больше драйва.

            1. Ну, а толку то? Сила не в железке, а в ее поддержке. Ну купит нуб ее и что о ней будет делать? А профи она не особо нужна, он сразу железку проектирует.

  5. Спасибо за великолепную статью, однако есть вопрос, в даташите на данную ПЛИС написано что количество циклов перепрограммирования не более 100. Тоже самое для семейства MAX7000,или я что-то не так понял, не понятно…

    1. Моя MAX7064 выдержала около 200 циклов, до сих пор жива и работает. Видимо с большим запасом они пишут. Да и на самом деле даже 100 цилков это не мало. Работа с ПЛИС подразумевает написание тестбенчей и прогонки тестов в симуляторе.

    2. Я как-то давно поднимал это вопрос на сайте марсохода — они сделали опыт — прошивали в цыкле платку несколько дней… было без проблем… Я думаю что в даташите забыли дописать несколько нулей…

  6. А если хочется совсем адскую мощь, то HI1, HI2 и все пины верхнего ряда можно собрать вместе. Тогда отдаваемый ток достигнет 400мА. Но не помешает налепить сверху на чип радиатор.
    На самом деле не совсем так, то есть 400 мА эти пины может и потянут, но так делать не правильно. В дополнение к ограничению на ток каждого пина есть ограничение на суммарный ток пинов, которые питаются от одного VCCIO/GNDIO. Всего в чипе 6 групп, каждая из которых может выдать 170 мА вытекающего тока или 130 втекающего. Так как пины HI1, HI2 и все пины верхнего ряда принадлежат к двум VCCIO, то максимальный ток будет 170*2 = 340 мА.
    https://dl.dropboxusercontent.com/u/46560046/MAXII.png

    1. Да давно уже как. Правда без процов. Но планирую продавать отдельно версию с процом. Скоро.

      1. Ну проц самому можно допаять. А вот самопальная плашка на заводской мамке уж больше глаз режет. Вещь все таки коллекционная)) Скоро это в какие временные рамки? месяц два? хотел вместе с альтерой и еще одним Ethernet модулем заказать

        1. По факту они уже сейчас есть в большом количестве. Если с альтерой будешь заказывать, то просто укажи в письме, что ее хочешь. 120р тебе будет стоить, без проца.

  7. Решил посмотреть, как у квартуса с линуксом. Нашел непосредственно на сайте альтеры официальный пдф-ман по установке. О Харухи, я счастлив.

  8. А правильно ли объединять выводы прямо на плате? Ведь если их все назначить как выходы и напутать с синхронным выводом и подать на какие-то «1», а на какие-то «0», можно спалить выводы. Я правильно понимаю?

  9. Hi.
    Создал проект, все как описано выше. Но при запуске mbftdi blink.svf получил Ашипку:
    Checking for FTDI devices…
    2 FTDI devices found — the count includes individual ports on a single chip
    Assume first device has the MPSSE and open it…
    Device: Dual RS232 A
    Serial: A
    Configuring port for MPSSE use…
    Frequency is set to 6MHz (FTDI clk divider 0000), requred 10MHz
    ————————————
    !CHECKING SILICON ID
    compare TDO failed at 0
    Expect buffer:
    32 04 80 A2 54 00 82 94 00 2C 18 00 00 00 00
    Compare buffer:
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    Mask buffer:
    FF FE 80 FF FE 80 FF FE 80 FF FE 80 FF FE 80
    error on check TDO answer

    ЧЯДНТ ?

    1. У меня кстати тоже такое было — но только после попытки прошивки usb blasterom (плашку кабеля подключил верх ногами). Решилось нормальной прошивкой через программатор.

  10. Спасибо огромное! Попалась на глаза эта статья — и как-то разом CPLD из «ужас-ужас-ужас, дайте мне готовый проект, в котором можно что-то менять» перешло в «блин, проект-то элементарно делается». Достал с полки китайскую платку, воткнул usb blaster — не обнаруживается и светодиод питания не горит. Прихреначил к ней питание (было сюрпризом, что usb blaster не умеет запитывать плату), прошил (ну, только понадобилось по плате определить, на какой ноге генератор) — мигает! И я более-менее понимаю, что и как устроено. И это в 4 часа ночи, в спешке, когда ничего не должно было заработать в принципе :-)

    Да, я правильно понимаю, что по первости можно ограничиться только verilog или vhdl, а графическое построение схем ничего особо не даёт сверх того (т.е. аналог любой «схемы» пишется на verilog/vhdl)?
    (а то раньше думал, что надо осваивать последовательно, от схем к vhdl)

    1. Доброго времени суток!

      Я только приступил к изучению ПЛИС на примере вашего модуля и попытался прошить его с помощью usb blaster. Как и Вы, потерпел неудачу. Скажите, пожалуйста как Вы прихреначили к ней питание?:)
      Спасибо!

  11. Не совсем пойму как пользоваться утилиткой от создателей марсохода. Можно как нибудь поподробней и в картинках? =)

  12. EPM570 когда то купил на наебае за 200 рублей. Потратил пару вечеров на сбор платы.

    Это, код занимает 78 вентилей, а нельзя ли как то его оптимизировать??
    И ещё, куда далась многолетняя база всех статей? То отображается только одна страница.

  13. Здравствуйте, у меня вопрос: пытаюсь на похожей железке компилировать код, оно мне пишет: «Error: Can’t open Synplify parts mapping file lib/altera/realpart.txt from Synplify installation». К чему это, Synplify устанавливать надо?

  14. Здравствуйте! Работаю с МК. Однако есть задумка для ПЛИС. Как прочитал из документации, у ПЛИС маленький объём внутренней памяти. Возникает вопрос: можно ли дополнительно подключить SD или Flash для хранения данных? Данные нужно просто считывать и передавать дальше. Объём данных может составлять несколько Мб. МК не подходит, так как необходимо одновременно выдавать данные на множество портов с высокой частотой.
    Спасибо!

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

    1. Конечно. Разница между ревизиями ничтожная, настолько, что одну можно переделать в другую и наоборот.

  15. DIHALT, а возможен такой вариант покупки — 1 готовый модуль + 5 голых платок без чипа и без всего остального, но с генератором? Сколько это будет стоить?

  16. Вот бы научиться epm240t100c5n с нуля бластером и питанием включать.. Достали двадцатикратные цены нза пайку в платы полбакосвых чипов.

      1. Лазерным принтером переносить питчив треть милиметра ? Паяльник с горячим феном ?. Дешевле борду взять

Добавить комментарий

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha