Альтернативный вариант - [эмуляция SDRAM на ZBT]. На примере Renesas RZ/A1H - 10Mbyte накристального ОЗУ R7S721000VCFP#AA1
ARM® Cortex®-A9 Microprocessor IC RZ/A1H 1 Core, 32-Bit 400MHz 256-LQFP (28x28)
1 34.70
10 32.00
25 30.56
100 27.32
У него 32 бита 66 МГц SDRAM.
SDRAM небольшого размера эмулируем на FPGA и ZBT. До 100 МГц умеренно сложно.
Программа сидит в 10Мбайт внутренного ОЗУ. Надеюсь, хватит :)
Внутренние переменные, стеки и прочая там же.
Переменные, описывающие состояние входов и выходов, либо тоже внутри, либо во внешней SDRAM.
Когда они живут во внешней памяти, все совсем просто. CPU просто работает с ними, в потом "внешняя сущность" подсовывает новую страницу. Да, кеш надо не забыть сбросить.
Можно по окончанию цикла закачать по DMA данные из SDRAM и обратно.
У RZ/A1H SDRAM контроллер умеет делать Burt до 16, т.е. 64 байта за транзакцию. При записи на это потратится ~66 тактов, при чтении поболее, под 70 тактов. Считаем КПД 64/70 тактов, 91%
32 бита 66 МГц = 264 Мбайт\сек. * КПД=241 Кбайт за 1 мс.
В принципе, нормально.
Важной фишкой контроллера является CL=1, что на FPGA сэмулировать не сложно.
Тогда FPGA супер скорость не нужна, и появляется неожиданно интересный вариант на Cyclone 10LP.
10CL055YF484I7G
IC FPGA 321 I/O 484FBGA 260 M9K Memory
1 70.35
25 66.83
100 64.1
10CL080YF780I7G IC FPGA 423 I/O 780FBG
305 M9K Memory
1 104.48
25 99.26
100 95.28
10CL120YF780I7G IC FPGA 525 I/O 780FBGA 432 M9K Memory
1 158.76
25 150.82
100 144.79
Ни Xilinx, ни Lattice, ни китайцы не могут предложить такое количество IO за такие деньги.
Тогда в качестве гигабитного PHY пойдет
LAN8810I-AKZE 4/4 Transceiver Full GMII 72-QFN (10x10) -40°C ~ 85°C
1 5.28
25 4.40
100 4.0
00001870D.pdf
Важно, что GMII, т.е. там нет DDR, которого, в свою очередь, в Cyclone 10LP тоже официально нет (реально есть, но параметры не специфицированы).
За счет того, что все будет только BGA 1.0 и QFP разной степени извращенности можно сделать 8 слойку за умеренный деньги, что тоже важно. QFP256 это знатное извращение, запаять его непросто (шаг 0.4), но плата будет дешевле, чем BGA 0.8
Что имеем в итоге:
-- ПЛК на 1024 порта
-- каждый порт - 96 бит при передаче по сетям и 16 байт во внутреннем представлении (не важно, почему так)
-- обмен с 1024 портами за 1 мс ~ 100Мбит/сек.
-- обмен с памятью 16к + 16к*2 от дублеров = 48к
-- такт 1 мс
-- 0 такт системы всосали данные и выдали данные их предыдущего такта
-- 1 такт обработка в вычислителе
-- 2 такт системы выждали обработанные данные и всосали новые.
-- Итого получили ПЛК на 1024 порта с латентностью 3 мс. Такого на рынке и близко нет, а если и есть, то стоит астрономических денег.
Все это возможно за счет предельного упрощения структуры ПО и за счет использования ЭКБ достаточно высокого уровня технологий, но по сути своей простой и понятной. Это вам не еррата на 188 страниц :)