в чём тут эконом, в использовании свопа?...
Если уж заходит речь об уменьшении рантайма - значит кристаллы немалельние, а под эти кристаллы соответствующие требования к ОЗУ: https://www.xilinx.com/products/design-tools/vivado/memory.html
т.о. разумный минимум - платформы на 1150/1151, которые хотя бы 64ГБ ОЗУ могут поддержать
Мур,
если устали от танцев с бубнами на VHDL, могу рекомендовать вариант генератора кодера/декодера Хемминга на верилоге:
http://idoka.ru/verilog-ecc-generator/
novartis
плата у вас не из дешёвых, а при работе 24/7 я бы сделал наверняка: выкинул схему регурирования на U31 и рулил с FPGA простейдим ПИД:
вывод OUT - выдавать ШИМ
вывод TACH - считывать обороты
и по превышению температуры и/или остановке вентилятора выключал бы накристальную PLL дабы ничего не пожечь.
Кремний нонче очень нежный в плане старения и деградации от температурных режимов
ну, тут, как правильно заметил Rob - лучше не причёсывать руками внутреннюю кухню вивадо,
а для ревизионности как раз может быть использован этот исходный *.txt
КМК, в таком случае неважна самостоятельность вивадо - вы всегда из рукотворного *.txt можете в любой момент скриптом получить *.xpr
можно даже доп.зависимость добавить в мейкфайл - при запуске синтеза всегда перегенерировать *.xpr
BTW, оператор остатка от деления удобно применять в циклах generate-for для хитрых вычислений индексов, например (там ему самое место), в этом случае на этапе препроцессора циклы разворачиваются, а все индексы вычисляются заменяясь на константы на стороне хоста.
В рантайме (использования с сигналами, меняющими значение после синтеза) я бы поостерёгся бездумного использования операций деления, остатка от деления и прочих.
"такое себе" решение в плане надёжности - в случае ДЦ это гирлянда из USB-hub которые непонятно как/чем сбрасывать (или девайсам делать эмуляцию USB-disconnect/connect) в случае нештатных ситуаций в USB-подсистеме ОС при работе 24/7
поинтересуюсь у более опытных коллег: можно ли в описанном ТС кейсе применить мощь и красоту SV?
-------------
PS:
конкретно с предъинициализацией ОЗУ пока не сталкивался (для асика самое простое - обернуть простым FSM, которое по ресету инитит нужными значениями),
а вот для ПЗУ в Vivado очень полюбилась конструкция:
localparam bit [63:0] RNDC [0:255] = {
64'h0000000000000001,
64'h0000000000008082,
64'h800000000000808a,
64'h8000000080008000,
.....
вместо создания на классическом верилог функции с громоздким case
золотые слова. тоже достаточно быстро к этому пришли. к тому же сейчас топовые десктопные процессоры имеют 6..8 ядер (что полезно при распараллеливании на некоторых стадиях)
-----------------------------
по поводу ускорения опциями, про которые еще не было упомянуто в теме: не скажу за квартус, но наверняка как и в вивадо там есть стратегии реализации, как-то:
RuntimeOptimized
AreaOptimized
SpeedOptimized
AlternateRoutability
AreaMapLargeShiftRegToBRAM
AreaMultThresholdDSP
FewerCarryChains
для дебаг-итераций (чтобы попробовать тот или иной фикс в железе) имеет смысл отключать оптимизации по скорости/площади.