MIPSfpga и SDRAM. Часть 1
На этой неделе я закончил работу по добавлению поддержки 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).
Конфигурация системы
Основные параметры модуля доступа к SDRAM (mfp_ahb_ram_sdram.v)
- на текущий момент поддерживаются чипы только с 16-разрядной шиной данных — именно такой разрядности память на Terasic DE10-Lite;
- небольшой размер модуля (менее 300 строк кода);
- реализован минимально необходимый для работы набор операций: INIT, READ, WRITE, AUTO_REF;
- модуль работает на частоте процессора (50 МГц, никаких синхронизаций или clock domain crossing [5]);
- все настройки, связанные с таймингами вынесены в параметры модуля, что упрощает его перенос на другие платы;
- оптимизация страничного доступа к памяти — отсутствует. Пакетные операции (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.