На этой неделе я закончил работу по добавлению поддержки SDRAM в проект MIPSfpga-plus. Теперь при работе с MIPSFpga помимо блочной памяти, ограниченной ресурсами ПЛИС, доступно еще и внешнее ОЗУ.


Данная статья состоит из 2 частей:


Часть 1. Краткое описание модуля доступа к SDRAM. Пример использования.
Часть 2. Подробное описание работы с памятью, достаточное для того, чтобы в работе модуля смог разобраться человек, ранее не имевший дела с микросхемами ОЗУ. Список литературы.


Предполагается, что читатель как минимум:


  • знаком с предметной областью в объеме учебника Харрис-энд-Харрис [1];
  • имеет опыт программирования на C, ассемблере, использования gcc;
  • имеет минимальный опыт работы с MIPSfpga. Не имея такого опыта, будет логичным начать с более простых вещей, и лишь затем думать о том, как использовать ОЗУ в своей системе.

Если вы уже опытный разработчик, то Часть 1 стоит пробежать глазами по диагонали, Часть 2 — не содержит для вас ничего нового. При этом вы можете принести ��есомненную пользу обществу, если добавите поддержку SDRAM для еще одной отладочной платы. На текущий момент она реализована только для Terasic DE10-Lite — одной из 9 плат, на которые в рамках проекта MIPSfpga-plus было портировано ядро MIPSfpga.


Общие сведения


MIPSfpga — это доступное под академической лицензией (бесплатно лицензируемое для образовательных и исследовательских проектов) промышленное микропроцессорное ядро MIPS microAptiv. О том, как получить доступ к исходным кодам этого ядра, в свое время подробно писал Юрий Панчул.


MIPSfpga-plus — это выполненный на основе MIPSfpga проект системы на кристалле, помимо ядра включающий некоторую дополнительную периферийную обвязку. Изначально он создавался для проведения лабораторных работ по работе с MIPSfpga, но ничто не мешает вам взять его за основу своей системы. Одна из основных "фишек" проекта: возможность заливки программы в память системы с использованием usb-uart преобразователей ($5), которые более доступны, чем Bus Blaster ($50).


Конфигурация системы


image


Основные параметры модуля доступа к SDRAM (mfp_ahb_ram_sdram.v)


  • На текущий момент поддерживаются чипы только с 16-разрядной шиной данных — именно такой разрядности память на Terasic DE10-Lite;
  • Небольшой размер модуля (менее 300 строк кода);
  • Реализован минимально необходимый для работы набор операций: INIT, READ, WRITE, AUTO_REF;
  • Модуль работает на частоте процессора (50 МГц), никаких синхронизаций или clock domain crossing;
  • Все настройки, связанные с таймингами вынесены в параметры модуля, что упрощает его перенос на другие платы;
  • Оптимизация страничного доступа к памяти — отсутствует. Пакетные операции (Burst Operation, WRAP4 в терминологии шины AHB-Lite) обрабатываются как набор отдельных (SINGLE) операций;
  • Для запуска в режиме симуляции использована Verilog модель от компании Micron;
  • Корректная работа на железе подтверждена на плате Terasic DE10-Lite (чип памяти IS42S16320D);
  • Для проверки корректности написана отдельная С-программа 04_memtest, запускаемая на MIPSfpga-plus. Она записывает большой массив в память а затем, с определенной периодичностью проверяет целостность данных в этом массиве, выводя текущий этап на LED, номер цикла проверки и суммарное количество ошибок — на 7-сегментные индикаторы;
  • Отладка разработанного модуля доступна "в отрыве" от кода MIPSfpga-plus в рамках проекта: ahb_lite_sdram — это песочница, в которой я начинал разработку. Там тестбенчи, а также standalone модуль, имитирующий работу AHB-Lite master без cpu (для аппаратного тестирования). Этот проект может быть использован для упрощения портирования на другие платы;
  • При работе с SDRAM не поддержива��тся режим занижения тактовой частоты cpu, доступный в MIPSfpga-plus (опция MFP_USE_SLOW_CLOCK_AND_CLOCK_MUX).

Порядок конфигурации и запуска теста памяти


Предполагается, что у вас уже есть развернутые и компилируемые MIPSfpga и MIPSfpga-plus. Если это так, то для использования SDRAM необходимо:


  • Получить актуальный код MIPSfpga-plus с github.
  • Выбрать тип используемой памяти в mfp_ahb_lite_matrix_config.vh
    MFP_USE_BYTE_MEMORY — блочная память с побайтовым хранением (x8);
    MFP_USE_WORD_MEMORY — блочная память с хранением по словам (x32);
    MFP_USE_BUSY_MEMORY — блочная память с имитацией задержки в работе;
    MFP_USE_SDRAM_MEMORY — память sdram.
  • Перейти в каталог programs\04_memtest;
  • Выбрать соответствующий режим работы в main.c
    SIMULATION
    SDRAM_64M
    SDRAM_8M
  • Установить (выбрать) соответствующую режиму и объему памяти границу стека в файле 02_compile_and_link.bat;

Для режима симуляции (SIMULATION)


  • Произвести сборку программы, сформировать файлы для инициализации памяти, запустить симуляцию:
    02_compile_and_link.bat
    05_generate_verilog_readmemh_file.bat
    06_simulate_with_modelsim.bat

При работе с платой (SDRAM_64M, SDRAM_8M)


  • Выполнить сборку и заливку конфигурации на fpga;
  • Выполнить (нажать) сброс на плате — при сбросе инициализируется в т.ч. модуль доступа к sdram;
  • Произв��сти сборку программы, сформировать файл для заливки прошивки, залить прошивку:
    02_compile_and_link.bat
    08_generate_motorola_s_record_file.bat
    12_upload_to_the_board_using_uart.bat
  • Во время работы LED будут обозначать текущий этап проверки:
    0 — цикл записи;
    1- цикл сброса кэша;
    2 — пауза;
    3 — цикл чтение;
    4 — все проверки завершены, ошибок нет;
    5 — в ходе проверок обнаружен ошибки.
  • Во время работы 7-сегментные индикаторы (на de10-lite их 6) будут обозначать:
    два старших разряда — номер проверки;
    четыре младших разряда — количество обнаруженных ошибок чтения.

Что еще можно сделать


Моей целью было создание максимально простого работающего решения, прозрачного и легко переносимого на другие платы. Модуль несколько примитивен по сравнению со своими "взрослыми" аналогами, это оставляет простор для модернизации и повышения его производительности:


  • Обеспечить работу памяти на удвоенной частоте (100 МГц), относительно частоты cpu (50 МГц);
  • Обеспечить работу памяти на максимально доступной для чипа частоте, добавив clock domain crossing;
  • Обеспечить возможность работы памятью другой разрядности;
  • Оптимизировать работу модуля для страничного доступа к памяти;
  • Выбор наилучшей стратегии запуска AUTO_REF в зависимости от интенсивности использования памяти.

Буду признателен за пулреквесты с исправлением багов и новой функциональностью.


Благодарности


Автор выражает благодарность коллективу переводчиков учебника Дэвида Харриса и Сары Харрис «Цифровая схемотехника и архитектура компьютера», компании Imagination Technologies, а также персонально Юрию Панчулу YuriPanchul.