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).
Конфігурація системи
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.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.