Самодельный SDRAM-контроллер занял 97% шины на DE10-Lite
На DE10-Lite два генератора трафика одновременно пишут и читают через самодельный VHDL-контроллер микросхему IS42S16320F. На частоте 143 MHz встроенные 32-битные счётчики FPGA показали 278 MB/s. Для 16-битной SDR SDRAM на этой частоте потолок составляет 286 MB/s, так что контроллер забрал около 97% доступной полосы, параллельно обслуживая refresh и проверяя целостность данных. Интерес здесь в самом вопросе: как удержать почти всю шину, если контроллеру постоянно приходится переключаться между чтением, записью, банками и обязательной регенерацией строк?
Память гоняют, ошибку подбрасывают, ответ сверяют
Стенд собран на Terasic DE10-Lite с FPGA MAX 10 10M50 и 64 MiB внешней памяти. IS42S16320F организована как четыре банка по 8M×16; для speed grade -7 datasheet допускает 143 MHz при CAS latency 3. Контроллер использует CORE, логику команд, арбитр, FIFO и блок чтения; автор заявляет до 16 независимых входных потоков и burst-пакеты до 64 KB. В тестовой конфигурации активны два потока с псевдослучайными операциями чтения и записи размером от 2 до 4096 байт.
Генератор сам создаёт последовательность данных, а WR Check и RD Check ловят расхождения. Для проверки checker в исходный поток намеренно вносят ошибку: индикатор на VGA обязан сменить статус. Такой опыт ловит класс дефектов, который симуляция часто маскирует удобными задержками: перепутанный порядок слов после арбитража, потерянный хвост burst, сбой на границе пакета, конфликт между FIFO и командным автоматом.
Команды SDRAM видны в ткани FPGA
SignalTap добавляет к счётчику времени картину происходящего. Захваты показывают последовательности ACTIVE, затем READ или WRITE, передачу burst и BURST STOP; рядом виден внутренний поток данных. Это полезнее одного графика MB/s: можно связать провал полосы с конкретной командой, паузой перед сменой направления DQ либо refresh. На частоте 143 MHz заданы CL=3, refresh period 64 ms и refresh latency 10 тактов — параметры, соответствующие режиму этой SDRAM.
278 MB/s остаётся результатом авторского стенда, снятым внутренними счётчиками прошивки. В публикации нет независимой репликации, дампа сырых счётчиков, длительности каждого прогона или измерения внешним анализатором. Также из описания нельзя строго восстановить, как агрегированы фазы чтения и записи в показателе «общего быстродействия». Однако сама величина согласуется с физикой интерфейса: 2 байта за такт при 143 MHz дают 286 MB/s, и длинные burst позволяют приблизиться к этому пределу.
Почему 278 MB/s выглядят правдоподобно
Самый ценный результат здесь не рекорд для старой SDR SDRAM. Контроллер памяти обычно выглядит законченным в симуляторе гораздо раньше, чем заслуживает доверия на плате. Здесь для него построили маленький испытательный полигон: нагрузка создаёт конфликтующие запросы, checker требует точного совпадения последовательностей, а встроенный логический анализатор показывает путь от пользовательского запроса до команд банка. Так vendor-independent IP перестаёт быть красивым VHDL-архивом и получает наблюдаемый режим отказа, измеримую полосу и доказательство работы на реальной памяти.