Это не так. Есть минимум два рабочих способа.
Итак. Две возможности.
1. Через программатор SPI, напрямую читать EPCS. Выпаять или контактировать на плате. У FPGA есть специальный пин, чтоб не мешался в режиме AS.
2. Через FPGA, неинвазивный метод. В FPGA (в SRAM) загружается небольшая конфигурация, которая предоставляет доступ к EPCS. Нужен Quartus и USB-Blaster.
Я как раз этим занимаюсь.
На основе:
https://habr.com/ru/articles/352666/
~/fpga/flasher/output_files$ nios2-flash-programmer --epcs --base=0xA00 --debug --override=25q64.ovr --read=w25q64.flash
Reading override file "25q64.ovr"
Using cable "USB-Blaster [1-9]", device 1, instance 0x00
Resetting and pausing target processor: OK
Processor data bus width is 32 bits
Looking for EPCS registers at address 0x00000A00 (with 32bit alignment)
Initial values: 00000000 00000000 00000260 00000000 00000000 00000001
Valid registers found
EPCS signature is 0x16
EPCS identifier is 0xEF4017
Using EPCS size information from section [EPCS-EF4017]
Device size is 8MByte (64Mbit)
Erase regions are:
offset 0: 128 x 64K
EPCS status is 0x00
Read 8192KB in 139.3s (58.8KB/s)
Writing EPCS contents to w25q64.flash
Leaving target processor paused
Если оригинальный EPCS, то
--override
конечно не надо. У меня Winbond w25q64.
Неинвазивный метод! Подключились через JTAG, загрузили свою конфигурацию, прочитали EPCS. FPGA выключили/включили, тот загружает оригинальную конфигурацию из EPCS. Ничего не изменили. Как будто нас здесь вообще не было.
Считываем с неисправного, сравниваем/записываем исправную конфигурацию.
У меня CycloneII, пришлось немного доработать, но читает. С CycloneIII должно работать как в статье.