Тоже раньше думал, что 1мм FBGA не для самоделок, сейчас же на 0.5мм TQFP144 смотрю с отвращением. Дороже за счет трафарета, но плата делается существенно быстрее. Запаиваю в бытовой мини-печке без контроллера, 5 минут по таймеру, с контролем по термопаре.
Классические HDL не сложны, просто недостаточны для решения многих задач, если сравнивать с традиционными языками программирования. Мне интересна эта тема, поэтому провел много экспериментов, пытаясь понять, чего именно не хватает традиционным HDL. Например, сравнивал сложность и громоздкость написания Тетриса на Си для ПК, и на HDL для ПЛИС. Или простого симулятора 2Д физики, включая графический редактор сцен, и тд. Это как раз задачи, для которых хватает ресурсов дешевых ПЛИС (без использования софт-процессора).
LVDS по стандарту требует 2.5В, подключить 3.3В софт не даст. Но это не технологическое ограничение. Что делать в таком случае? Варианты: 1) плюнуть на стандарт, и провести собственные тесты на 3.3В, 2) на порядок повысить стоимость и сложность проекта. Я выбрал 1-ый вариант, тк не ответственное применение.
По цене уже сейчас есть FPGA в районе 5$ на DigiKey, например у EFINIX (сам использую Cyclone IV). Такого выбора АЦП/ЦАП, как в МК, в ПЛИС пока нет, но это обусловлено не технологией, а существующим позиционировании на рынке. Но на FPGA можно, например, реализовать TDC ADC с быстродействием ~200Мвыб/сек при разрядности ~6бит, с минимальной пассивной обвязкой -сам пробовал (можно посмотреть мои посты под ником Leka на форумах ixbt.com, electronix.ru, marsohod.org).
У FPGA (но не CPLD !) возможная область применения действительно очень широкая. Дешевые FPGA, например, могут полностью вытеснить микроконтроллеры, это экономически и технологически оправдано. Мешает одно — отсутствие адекватных языков описания аппаратуры, ориентированных именно на синтез, а не на моделирование.
Стандартный оператор «for» уже подразумевает использование блокирующего присваивания (переменной цикла) в последовательном блоке.
Пример — поиск старшей «1» в векторе:
always @(posedge clk) begin n<=-1; for(int i=0; i<N; i++) if(a[i]) n<=i; end
Другой пример — локальные переменные, объявленные внутри последовательного блока, и которые принимают результаты промежуточных вычислений:
alvays@(posedge clk) begin
var [7:0] a;
…
a = …;
…
end
ROM можно инициализировать при объявлении (удобно использовать «упакованные» массивы из SV):
reg [LUT_SIZE-1:0][6:0] lut = {7'h7F, 7'h7E,… 7'h03, 7'h00};
Меняя скважность и период ШИМ, можно независимо (в некоторых пределах) подстраивать напряжение на входе (эмуляция резистора), и на выходе (питание МК).
Пример симуляции в Tina-Ti, потребление МК принято 2мА, 2 варианта ШИМ.
Софт-процессоры с оптимизированной для FPGA архитектурой, на простых алгоритмах показывают производительность на уровне ~~100МГц stm32 (даже на дешевых семействах FPGA). Так что практическая польза есть.
ru.wikipedia.org/wiki/Гипотеза_лингвистической_относительности#Языки_программирования
Пример — поиск старшей «1» в векторе:
always @(posedge clk) begin n<=-1; for(int i=0; i<N; i++) if(a[i]) n<=i; end
Другой пример — локальные переменные, объявленные внутри последовательного блока, и которые принимают результаты промежуточных вычислений:
alvays@(posedge clk) begin
var [7:0] a;
…
a = …;
…
end
reg [LUT_SIZE-1:0][6:0] lut = {7'h7F, 7'h7E,… 7'h03, 7'h00};
Пример симуляции в Tina-Ti, потребление МК принято 2мА, 2 варианта ШИМ.
2) питание можно поднять емкостным преобразователем.