Мини отладочная плата на ПЛИС Xilinx Spartan-3E XC3S500E


Поскольку под микроконтроллеры программировать не умею для домашнего баловства заказал маленькую платку с ПЛИС (FPGA) Xilinx Spartan-3E XC3S500E. Так же на али встречал версии с XC3S250E, но цены отличаются не намного и смысла брать младшую версию не вижу.

По сравнению с отладочными платами типа digilent данная плата имеет весьма скромные размеры 52х57 мм, не имеет много лишнего обвеса и стоит значительно дешевле. А если кому-то это нужно, есть платы «mother board» с дополнительными элементами и отдельные модули обвязки, как например в наборе тут.


Распиновка и прочие параметры расписаны на вики-сайте разработчика waveshare wiki.

Сверху на плате распаяна fpga в корпусе PQG208. Пользователю доступно 116=32+42+42 gpio ножек на гребёнках с шагом 2мм (плюс несколько пинов 3,3 и 5 В), кнопка загрузки программы из энергонезависимой памяти, кнопка сброса и 4 красных светодиода которые можно использовать в работе и два служебных. Плюс 10-пиновый разъём jtag (да, никаких прошивок по usb, нужен программатор, у меня был оригинальный Xilinx, сейчас заказал реплику, пока едет).

На нижней стороны платы установлена микросхема памяти xcf04s для хранения прошивки, генератор NSK E83C на 50 МГц и три AMS1117 на 1,2, 2,5 и 3,3 В.

Заявлено питание 5 В, но может стабильно работать примерно от 3,4 В на частоте 50МГц (Наверное можно питать и от 3,3 В если обойти один AMS).
Если нужны другие тактовые частоты с помощью ядра dcm (которых у этого кристалла 4 штуки) можно сгенерировать тактовые частоты 5-311 МГц (за исключением случаев, когда дробный коэффициент деления частоты имеет слишком большие числа в числителе или знаменателе).

Для проверки работоспособности этой платы и недавно заказанной ленты WS2812b решил сделать простенькую гирлянду. Запитал всё (и WS2812b возможно не пробовал зажигать все 288 светиков на полную, но для проверки 5В 1.5А хватило) от usb блока питания от телефона через breadboard с mini-usb платкой питания (на самом деле тупо в режиме переходника, без задействования драйверов).

Написал простенький драйвер и запустил бегающий градиент.
Часть кода драйвера на verilog
Вот кусочек кода, который отправляет 24 бита RGB в ленту на 50МГц по сигналу en и зажигает по fn

module wsdrv( input clk,rst,
					input en,
					input [23:0] clr,
					input fn,
					output wire data, rd
    );
	 
	 parameter wait_time = 2510;
	 parameter TP = 62;
	 parameter T0H = 15;
	 parameter T1H = 45;
	 
	 reg dat;
	 assign data = dat;
	 
	 reg [23:0] clr_reg;
	 reg rdr;
	 
	reg [4:0] ccn;
	reg [7:0] bcn;
	reg [15:0] fncn;
	
	assign fl = bcn==TP-1;
	assign fb = ccn==23&fl;
	
	assign rd = rdr;

	always@(posedge clk) begin
	
		clr_reg <= en? {clr[0],clr[1],clr[2],clr[3],clr[4],clr[5],clr[6],clr[7],clr[16],clr[17],clr[18],clr[19],clr[20],clr[21],clr[22],clr[23],clr[8],clr[9],clr[10],clr[11],clr[12],clr[13],clr[14],clr[15]}: clr_reg;
		
		ccn <= rst? 0: en? 0: fb? 0: fl? ccn+1: ccn;
		bcn <= rst? 0: en? 0: fl? 0: bcn+1;
		
		fncn <= rst? wait_time: fn? 0: fncn==wait_time? fncn: fncn+1;
		
		dat <= rst? 0: fncn!=wait_time? 0: clr_reg[ccn]&bcn<T1H? 1: clr_reg[ccn]&bcn>=T1H? 0: !clr_reg[ccn]&bcn<T0H? 1: !clr_reg[ccn]&bcn>=T0H? 0: 0;
		
		rdr <= (fncn==wait_time&ccn==23&bcn==TP-4)|(fncn==wait_time-1);
	
	end

endmodule





На первый взгляд всё работает, посылка пришла быстро, примерно за 20 дней, а на следующий заказ продавец обещал скидку, если попрошу.
В дальнейшем могу написать про баловство с похожей платой на 6м спартане и высокоскоростным АЦП/ЦАП модулем с али.
Планирую купить +19 Добавить в избранное +33 +53
+
avatar
  • flymouse
  • 28 февраля 2017, 23:34
+19
… Для домашнего баловства заказал маленькую платку с ПЛИС Xilinx Spartan-3E XC3S500E...
Ну чё, кто там говорил Ардуино и Attiny это слишком для домашних задачь? )

В дальнейшем могу написать про баловство с похожей платой на 6м спартане и высокоскоростным АЦП/ЦАП модулем с али
Конечно!
Осциллограф будем собирать?
+
avatar
+2
Ну так, ЦАП на АЦП сам на себя могу запустить и графики нарисовать.
+
avatar
  • NAgain
  • 28 февраля 2017, 23:46
0
Оно все здорово и увлекательно, но раз уж обозреваете плисину, то и код бы не плохо было бы приаттачить как мне кажется.

И хреново что шаг 2мм, а не 2.54 =(
+
avatar
0
Это был тест без всяких притязаний на универсальность с кучей костылей и чипскопом без описания и комментов.
Выложил кусок кода похожего на драйвер, а весь проект могу скинуть по запросу, т.к. всякие облачные хранилища мне кажется забанят ссылку.
+
avatar
  • Barsik
  • 01 марта 2017, 00:18
+7
Поскольку под микроконтроллеры программировать не умею
… то быстренько освоил один из HDL языков. Ну очень оригинально)) Я помню свои мучения с Flex10K при попытке изобразить что то типа частотомера и приделать его к шине ISA.
+
avatar
0
Ну я умею matlab и verilog (я ни где не говорил, что быстренько), с сями не сложилось пока, как сгенерить код из матлаба в атмегу или stm, с точными временными рамками (а мне по тактам думать проще) и прочим я не знаю.
+
avatar
  • loole
  • 01 марта 2017, 03:10
+2
как сгенерить код из матлаба в атмегу или stm
Simulink давно уже на STM натравили
Для тру адептов K&R, конечно ужоснах, зато стильно, модно, молодежно… По цене аэробуса, но кого это останавливало?
+
avatar
  • SAA12
  • 01 марта 2017, 00:33
0
На всякий случай спрошу: {clr[0],clr[1],clr[2],clr[3],clr[4],clr[5],clr[6],clr[7]..} не тоже, что и {clr[0:7],...}?
И вопрос более по существу: там в окрестностях Altera и Actel не пробегали?
+
avatar
0
Я не знал, что возможна такая запись в присваивании, может быть и одно и то же))
Actel лежит скучает, но тут код вроде бы универсальный на всём запустится. Что вас по нему интересует?
+
avatar
0
Я не сразу понял про Alter-у и Actel. Актелевскую я давно себе покупал на ebay откуда-то из Израиля, редкие они всё же и на али почти не видно, а вот альтеровские есть CycloneII EP2C5T144, но я с альтерами дела не имел, не знаю насколько хорошая именно эта микросхема. Или даже этого же разработчика в аналогичном формате и за те же деньги: CoreEP2C8 EP2C8Q208C8N
+
avatar
  • Nemexis
  • 01 марта 2017, 03:14
0
За обзор большое спасибо.

Подскажите пожалуйста, нужно управлять 12-ю линейками по 800 пикселей. Стоит ли брать для этих целей данную плату, нужно не только цветом но и яркостью управлять. Ардуино с яркостью на 800 пикселей не может справиться, скорости не хватает.
+
avatar
0
Поясните, что значит управлять яркостью? 24 бита цвета однозначно задают яркость же.
Откуда и как планируете передавать данные о цвете пикселей?
+
avatar
  • Nemexis
  • 01 марта 2017, 04:06
0
Есть файл одна строка 800 блоков вида RRGGBB RRGGBB RRGGBB. Обновляеться 10 раз в секунду. Так вот если все значения в блоке больше 7С то линия обновляеться быстро, если меньше то вся линейка начинает меняться уже последовательно. Если мы хотим получив строку уменьшить все значения на 20% и потом отправить в линейку, она не меняет ее мгновенно. Так у нас с ардуино было.
+
avatar
+1
А на ардуине сделано через отправку аппаратным uart-ом? Я пока не понял почему значение цвета как-то влияет на обновление…
Я ещё раз уточню, через какой интерфейс ПЛИС примет 800*24*12*10=2,3Мбит/с?
Ну тут есть 20 аппаратных умножителей, они запросто перемножат ваши данные на нужную величину изменения яркости, единственное тут не хватит памяти, чтобы сделать буфер на 12 целых кадров по 800блоков, но оно наверное и не нужно, главное параллельно потоку как-то сообщать/вычислять начало кадра.
+
avatar
0
Тут проблема в том, что FPGA — это очень специфичная штука :) По сути — это большая-большая логическая матрица, запихнутая в одну микросхему. И обойтись только ей — обычно невозможно.
Обычно делают связку — микроконтроллер читает и обрабатывает данные и по удобному ему высокоскоростному интерфейсу отдаёт на FPGA, которая уже работает с периферией в нужном периферии формате. Можно, конечно, сэмулировать контроллер прямо в FPGA (старшие модели это позволяют), но это из пушки по воробьям. А в вашем случае порекомендовал бы просто посмотреть на значительно более быстрые STM32.
+
avatar
  • sir0ta
  • 01 марта 2017, 06:52
0
Ммм. А что за цап/ацп высокоскоростной? Потом в чем отличие программирования под эту штуку и скажем ардуино? Там уже проще не куда. Даже есть графические кодогенераторы.
+
avatar
+7
Главное радикальное отличие в том, что ПЛИС и Микроконтроллер это принципиально разные вещи. В МК описывается последовательность действий, а в ПЛИС схема соединения железа.

Поэтому фраза звучит примерно как «ездить на велосипеде я не умею, поэтому я поехал за пивом на приходской щите». И пойми меня правильно. Я таким сравнением не осуждаю автора. Возможно в его случае это действительно быстрее и проще чем учиться держать равновесие на велосипеде. Но советовать такой путь всем я бы не стал.
+
avatar
+2
Чертова автозамена. Хотел написать «Проходческий щит»
+
avatar
  • sir0ta
  • 01 марта 2017, 09:29
0
Ммм. выходит плис — это считай тот же мк, но без привязки и ограничений функционала на ногах и внутри? Т.е. хочу 20 SPI, получу 20 SPI, а хочу 10 SPI и 10 PWN на тех же ногах… Но потом по идее все равно на этих ячейках выполняется код? Конечно сочно, но дорого. Скажем отдать даже те же 500-800 рублей на моргание светодидом. да я понял суть — Гонять воробья в поле. Спасибо за разъяснение.
+
avatar
0
ПЛИС — это программируемая логика. То есть большое количество логических элементов работающих параллельно.
+
avatar
  • sir0ta
  • 01 марта 2017, 11:21
0
Ну любой процессор — это логика. Если уж на то пошло ) Просто в мк есть «все», а тут тогда получается ни флеша, ни рама?
+
avatar
0
Тут есть маленькая RAM, конкретно 360кбит (+73кбит на логике).
Флешку предлагается использовать внешнюю. Просто у процессора логика фиксированная и ему можно послать команду и данные, а тут можно самому объединить нужную комбинацию логики.
+
avatar
+1
Ну не пошло на то.
Процессор выполняет задачи по строкам, шаг за шагом, а программируемая логика делает это сразу.
Допустим нужно обратотать сигнал от сотни датчиков одновременно, так вот процессору потребуется пройти от 1-го до 100-го за какое-то время которое ограничено тактовой частотой.
ПЛИС сделает это за один удар и выдаст на выходе нужный результат. Как будто вы построили огномную плату плату из логических элементов. Там ограничивающий фактор только быстродействие этих элементов.
Вобщем по этому в аппаратах УЗИ, радарах и прочих подобных вещах стоят ПЛИС и DSP а не самые мощные процессоры.
+
avatar
  • sir0ta
  • 01 марта 2017, 21:06
0
Вы не слышали за многопоточность? Та же мега 328 может сама по себе несколько пвм паралельно с разными параметрами, чтот там еще? Сериал аппаратный. Прерывания. И это доллар за штуку. Т.е. возможности соответствуют цене. Но суть я уже уяснил.
+
avatar
+1
слышали за многопоточность?
Полезная однако функция!
В следующий раз когда нужно будет вытаскивать в реальном времени пару сотен байт из 70-и мегабитного параллельного спутникового потока поставим мегу 328 ;)
+
avatar
  • sir0ta
  • 02 марта 2017, 07:26
0
Ой не надо. С ног на голову перевернул и рад.
+
avatar
+2
Ну скажем так, формально ты можешь на плис написать МК и на этом виртуальном МК запустить исполняемый код. Так иногда делают, но это не единственный вариант использования ПЛИС.

Скажем возьмем МК, у тебя в МК скажем есть модуль CAN. Ты загружаешь в него данные, а дальше этот модуль сам занимается формированием импульсов на ногах МК, сам следит за правами доступа к шини, сам формирует и принимает пакеты и т д не отвлекая основную программу своими потребностями. Вобщем программирование ПЛИС как раз и строится из того, что описывается устройство таких модулей. Причем эти модули могут работать полностью параллельно.
+
avatar
  • sir0ta
  • 01 марта 2017, 12:11
0
Да. да. Спасибо. Я так это себе и представлял. А выходит так что каждая логическая единица работает грубо говоря сама по себе? Т.е. паралельная работа? Грубо говоря как я понял я из определенного количества ячеек соберу скажем 2 каких-то процесса, то работа одного не будет влиять на работу. не так. Работа одного не будет влиять на производительность другого процесса?
+
avatar
+2
Именно так. Сюда скажем можно запихать несколько десятков, драйверов таких лент и каждый будет дёргать свою ногу.
+
avatar
+2
Именно так. В одном модуле ты описываешь аппаратную реализацию. Поэтому например создав несколько экземпляров одного модуля ты по сути создаешь несколько независимых устройств.
+
avatar
  • sir0ta
  • 01 марта 2017, 12:57
0
Тема! Как-нибудь закажу.
+
avatar
+1
Вот такой
Для ПЛИС тоже есть графические генераторы…
+
avatar
  • sir0ta
  • 01 марта 2017, 11:23
0
Пока нет времени разобраться, а скажем что у него на ногах будет? Как я понимаю часть ног на модуле для полечения параметров ЦАП, а часть для отдачи АЦП? Просто штука веселая.
+
avatar
+1
У него 8 бит данных + 1 такт на ЦАП, 1 такт на АЦП и 8 бит с АЦП + питание.
Параметры не настраиваемые.
+
avatar
0
Спасибо автору, но хотелось бы больше информации про плис. Какой максимальный ток на ногу gpio, какова среда разработки, какие возможности у микросхемы?!
Шаг у гребенки 2мм или 2,54?
+
avatar
0
Насколько я понял 16мА (но не факт, что сразу на все ноги в банке, возможно есть ещё ограничения).
Даташит на семейство тут, если подскажете какие примерно возможности вас интересуют, могу попробовать прикинуть.
Про шаг писал, что 2мм, у «материнки» возможно 2,5. Есть плата с 6м спартаном, там 2,54 мм шаг.
+
avatar
0
Да уж, «нарядненький» ценник для домашних поделок
Дешевле МК научиться программировать…
+
avatar
0
Я заказал CPLD недорогих, как приедут, попробую на них поморгать. На этом ещё и другие функции попробую реализовать.
+
avatar
  • Sanja
  • 01 марта 2017, 12:03
0
мне кажется, что часовая ставка у человека, который знает про ПЛИС и Verilog, покрывает разницу в цене между Ардуиной и такой поделкой лехко и просто
+
avatar
  • vil2
  • 01 марта 2017, 09:09
+3
я думал ты покажешь как майнить! :)
+
avatar
0
На такой ПЛИС, если не ошибаюсь, собран известный в некоторых кругах нидерландский SDR приёмник.